blob: 04c2216765444170a06b4a570e2f3c0a212a0d41 [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
Mark Dickinsonf2637242009-11-09 17:45:40 +00003import platform
Walter Dörwald919497e2003-01-19 16:23:59 +00004import test.test_support, unittest
Georg Brandlde9b6242006-04-30 11:13:56 +00005from test.test_support import fcmp, have_unicode, TESTFN, unlink, \
6 run_unittest, run_with_locale
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00007from operator import neg
Guido van Rossum3bead091992-01-27 17:00:37 +00008
Mark Dickinsond058cd22008-02-10 21:29:51 +00009import sys, warnings, cStringIO, random, fractions, UserDict
Walter Dörwald919497e2003-01-19 16:23:59 +000010warnings.filterwarnings("ignore", "hex../oct.. of negative int",
11 FutureWarning, __name__)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +000012warnings.filterwarnings("ignore", "integer argument expected",
13 DeprecationWarning, "unittest")
Guido van Rossum3bead091992-01-27 17:00:37 +000014
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +000015# count the number of test runs.
16# used to skip running test_execfile() multiple times
Georg Brandl23016272009-10-27 22:57:25 +000017# and to create unique strings to intern in test_intern()
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +000018numruns = 0
19
Walter Dörwald919497e2003-01-19 16:23:59 +000020class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000021
Walter Dörwald919497e2003-01-19 16:23:59 +000022 def __init__(self, max):
23 self.max = max
24 self.sofar = []
25
26 def __len__(self): return len(self.sofar)
27
28 def __getitem__(self, i):
29 if not 0 <= i < self.max: raise IndexError
30 n = len(self.sofar)
31 while n <= i:
32 self.sofar.append(n*n)
33 n += 1
34 return self.sofar[i]
35
36class StrSquares:
37
38 def __init__(self, max):
39 self.max = max
40 self.sofar = []
41
42 def __len__(self):
43 return len(self.sofar)
44
45 def __getitem__(self, i):
46 if not 0 <= i < self.max:
47 raise IndexError
48 n = len(self.sofar)
49 while n <= i:
50 self.sofar.append(str(n*n))
51 n += 1
52 return self.sofar[i]
53
54class BitBucket:
55 def write(self, line):
56 pass
57
Walter Dörwald919497e2003-01-19 16:23:59 +000058
Raymond Hettinger96229b12005-03-11 06:49:40 +000059class TestFailingBool:
60 def __nonzero__(self):
61 raise RuntimeError
62
63class TestFailingIter:
64 def __iter__(self):
65 raise RuntimeError
66
Walter Dörwald919497e2003-01-19 16:23:59 +000067class BuiltinTest(unittest.TestCase):
68
69 def test_import(self):
70 __import__('sys')
71 __import__('time')
72 __import__('string')
Georg Brandl5240d742007-03-13 20:46:32 +000073 __import__(name='sys')
74 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +000075 self.assertRaises(ImportError, __import__, 'spamspam')
76 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters8ddab272006-04-04 16:17:02 +000077 self.assertRaises(ValueError, __import__, '')
Georg Brandl5240d742007-03-13 20:46:32 +000078 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +000079
80 def test_abs(self):
81 # int
82 self.assertEqual(abs(0), 0)
83 self.assertEqual(abs(1234), 1234)
84 self.assertEqual(abs(-1234), 1234)
Martin v. Löwis820d6ac2006-10-04 05:47:34 +000085 self.assertTrue(abs(-sys.maxint-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +000086 # float
87 self.assertEqual(abs(0.0), 0.0)
88 self.assertEqual(abs(3.14), 3.14)
89 self.assertEqual(abs(-3.14), 3.14)
90 # long
91 self.assertEqual(abs(0L), 0L)
92 self.assertEqual(abs(1234L), 1234L)
93 self.assertEqual(abs(-1234L), 1234L)
94 # str
95 self.assertRaises(TypeError, abs, 'a')
96
Raymond Hettinger96229b12005-03-11 06:49:40 +000097 def test_all(self):
98 self.assertEqual(all([2, 4, 6]), True)
99 self.assertEqual(all([2, None, 6]), False)
100 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
101 self.assertRaises(RuntimeError, all, TestFailingIter())
102 self.assertRaises(TypeError, all, 10) # Non-iterable
103 self.assertRaises(TypeError, all) # No args
104 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
105 self.assertEqual(all([]), True) # Empty iterator
106 S = [50, 60]
107 self.assertEqual(all(x > 42 for x in S), True)
108 S = [50, 40, 60]
109 self.assertEqual(all(x > 42 for x in S), False)
110
111 def test_any(self):
112 self.assertEqual(any([None, None, None]), False)
113 self.assertEqual(any([None, 4, None]), True)
114 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
115 self.assertRaises(RuntimeError, all, TestFailingIter())
116 self.assertRaises(TypeError, any, 10) # Non-iterable
117 self.assertRaises(TypeError, any) # No args
118 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
119 self.assertEqual(any([]), False) # Empty iterator
120 S = [40, 60, 30]
121 self.assertEqual(any(x > 42 for x in S), True)
122 S = [10, 20, 30]
123 self.assertEqual(any(x > 42 for x in S), False)
124
Armin Rigo7ccbca92006-10-04 12:17:45 +0000125 def test_neg(self):
126 x = -sys.maxint-1
127 self.assert_(isinstance(x, int))
128 self.assertEqual(-x, sys.maxint+1)
129
Walter Dörwald919497e2003-01-19 16:23:59 +0000130 def test_apply(self):
131 def f0(*args):
132 self.assertEqual(args, ())
133 def f1(a1):
134 self.assertEqual(a1, 1)
135 def f2(a1, a2):
136 self.assertEqual(a1, 1)
137 self.assertEqual(a2, 2)
138 def f3(a1, a2, a3):
139 self.assertEqual(a1, 1)
140 self.assertEqual(a2, 2)
141 self.assertEqual(a3, 3)
142 apply(f0, ())
143 apply(f1, (1,))
144 apply(f2, (1, 2))
145 apply(f3, (1, 2, 3))
146
147 # A PyCFunction that takes only positional parameters should allow an
148 # empty keyword dictionary to pass without a complaint, but raise a
149 # TypeError if the dictionary is non-empty.
150 apply(id, (1,), {})
151 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
152 self.assertRaises(TypeError, apply)
153 self.assertRaises(TypeError, apply, id, 42)
154 self.assertRaises(TypeError, apply, id, (42,), 42)
155
156 def test_callable(self):
157 self.assert_(callable(len))
158 def f(): pass
159 self.assert_(callable(f))
160 class C:
161 def meth(self): pass
162 self.assert_(callable(C))
163 x = C()
164 self.assert_(callable(x.meth))
165 self.assert_(not callable(x))
166 class D(C):
167 def __call__(self): pass
168 y = D()
169 self.assert_(callable(y))
170 y()
171
172 def test_chr(self):
173 self.assertEqual(chr(32), ' ')
174 self.assertEqual(chr(65), 'A')
175 self.assertEqual(chr(97), 'a')
176 self.assertEqual(chr(0xff), '\xff')
177 self.assertRaises(ValueError, chr, 256)
178 self.assertRaises(TypeError, chr)
179
180 def test_cmp(self):
181 self.assertEqual(cmp(-1, 1), -1)
182 self.assertEqual(cmp(1, -1), 1)
183 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000184 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000185 a = []; a.append(a)
186 b = []; b.append(b)
187 from UserList import UserList
188 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000189 self.assertRaises(RuntimeError, cmp, a, b)
190 self.assertRaises(RuntimeError, cmp, b, c)
191 self.assertRaises(RuntimeError, cmp, c, a)
192 self.assertRaises(RuntimeError, cmp, a, c)
193 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000194 a.pop(); b.pop(); c.pop()
195 self.assertRaises(TypeError, cmp)
196
197 def test_coerce(self):
198 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
199 self.assertEqual(coerce(1, 1L), (1L, 1L))
200 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
201 self.assertRaises(TypeError, coerce)
202 class BadNumber:
203 def __coerce__(self, other):
204 raise ValueError
205 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000206 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000207
208 def test_compile(self):
209 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000210 bom = '\xef\xbb\xbf'
211 compile(bom + 'print 1\n', '', 'exec')
Georg Brandl5240d742007-03-13 20:46:32 +0000212 compile(source='pass', filename='?', mode='exec')
213 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
214 compile('pass', '?', dont_inherit=1, mode='exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000215 self.assertRaises(TypeError, compile)
216 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
217 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000218 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Georg Brandl5240d742007-03-13 20:46:32 +0000219 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
220 mode='eval', source='0', filename='tmp')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000221 if have_unicode:
222 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000223 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
224 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000225
Georg Brandl5240d742007-03-13 20:46:32 +0000226
Walter Dörwald919497e2003-01-19 16:23:59 +0000227 def test_delattr(self):
228 import sys
229 sys.spam = 1
230 delattr(sys, 'spam')
231 self.assertRaises(TypeError, delattr)
232
233 def test_dir(self):
Georg Brandl871f1bc2007-03-12 13:17:36 +0000234 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000235 self.assertRaises(TypeError, dir, 42, 42)
236
Georg Brandl871f1bc2007-03-12 13:17:36 +0000237 # dir() - local scope
238 local_var = 1
239 self.assert_('local_var' in dir())
240
241 # dir(module)
242 import sys
243 self.assert_('exit' in dir(sys))
244
245 # dir(module_with_invalid__dict__)
246 import types
247 class Foo(types.ModuleType):
248 __dict__ = 8
249 f = Foo("foo")
250 self.assertRaises(TypeError, dir, f)
251
252 # dir(type)
253 self.assert_("strip" in dir(str))
254 self.assert_("__mro__" not in dir(str))
255
256 # dir(obj)
257 class Foo(object):
258 def __init__(self):
259 self.x = 7
260 self.y = 8
261 self.z = 9
262 f = Foo()
263 self.assert_("y" in dir(f))
264
265 # dir(obj_no__dict__)
266 class Foo(object):
267 __slots__ = []
268 f = Foo()
269 self.assert_("__repr__" in dir(f))
270
271 # dir(obj_no__class__with__dict__)
272 # (an ugly trick to cause getattr(f, "__class__") to fail)
273 class Foo(object):
274 __slots__ = ["__class__", "__dict__"]
275 def __init__(self):
276 self.bar = "wow"
277 f = Foo()
278 self.assert_("__repr__" not in dir(f))
279 self.assert_("bar" in dir(f))
280
281 # dir(obj_using __dir__)
282 class Foo(object):
283 def __dir__(self):
284 return ["kan", "ga", "roo"]
285 f = Foo()
286 self.assert_(dir(f) == ["ga", "kan", "roo"])
287
288 # dir(obj__dir__not_list)
289 class Foo(object):
290 def __dir__(self):
291 return 7
292 f = Foo()
293 self.assertRaises(TypeError, dir, f)
294
Walter Dörwald919497e2003-01-19 16:23:59 +0000295 def test_divmod(self):
296 self.assertEqual(divmod(12, 7), (1, 5))
297 self.assertEqual(divmod(-12, 7), (-2, 2))
298 self.assertEqual(divmod(12, -7), (-2, -2))
299 self.assertEqual(divmod(-12, -7), (1, -5))
300
301 self.assertEqual(divmod(12L, 7L), (1L, 5L))
302 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
303 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
304 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
305
306 self.assertEqual(divmod(12, 7L), (1, 5L))
307 self.assertEqual(divmod(-12, 7L), (-2, 2L))
308 self.assertEqual(divmod(12L, -7), (-2L, -2))
309 self.assertEqual(divmod(-12L, -7), (1L, -5))
310
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000311 self.assertEqual(divmod(-sys.maxint-1, -1),
312 (sys.maxint+1, 0))
313
Walter Dörwald919497e2003-01-19 16:23:59 +0000314 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
315 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
316 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
317 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
318
319 self.assertRaises(TypeError, divmod)
320
321 def test_eval(self):
322 self.assertEqual(eval('1+1'), 2)
323 self.assertEqual(eval(' 1+1\n'), 2)
324 globals = {'a': 1, 'b': 2}
325 locals = {'b': 200, 'c': 300}
326 self.assertEqual(eval('a', globals) , 1)
327 self.assertEqual(eval('a', globals, locals), 1)
328 self.assertEqual(eval('b', globals, locals), 200)
329 self.assertEqual(eval('c', globals, locals), 300)
330 if have_unicode:
331 self.assertEqual(eval(unicode('1+1')), 2)
332 self.assertEqual(eval(unicode(' 1+1\n')), 2)
333 globals = {'a': 1, 'b': 2}
334 locals = {'b': 200, 'c': 300}
335 if have_unicode:
336 self.assertEqual(eval(unicode('a'), globals), 1)
337 self.assertEqual(eval(unicode('a'), globals, locals), 1)
338 self.assertEqual(eval(unicode('b'), globals, locals), 200)
339 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000340 bom = '\xef\xbb\xbf'
341 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000342 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
343 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000344 self.assertRaises(TypeError, eval)
345 self.assertRaises(TypeError, eval, ())
346
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000347 def test_general_eval(self):
348 # Tests that general mappings can be used for the locals argument
349
350 class M:
351 "Test mapping interface versus possible calls from eval()."
352 def __getitem__(self, key):
353 if key == 'a':
354 return 12
355 raise KeyError
356 def keys(self):
357 return list('xyz')
358
359 m = M()
360 g = globals()
361 self.assertEqual(eval('a', g, m), 12)
362 self.assertRaises(NameError, eval, 'b', g, m)
363 self.assertEqual(eval('dir()', g, m), list('xyz'))
364 self.assertEqual(eval('globals()', g, m), g)
365 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000366 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000367 class A:
368 "Non-mapping"
369 pass
370 m = A()
371 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000372
373 # Verify that dict subclasses work as well
374 class D(dict):
375 def __getitem__(self, key):
376 if key == 'a':
377 return 12
378 return dict.__getitem__(self, key)
379 def keys(self):
380 return list('xyz')
381
382 d = D()
383 self.assertEqual(eval('a', g, d), 12)
384 self.assertRaises(NameError, eval, 'b', g, d)
385 self.assertEqual(eval('dir()', g, d), list('xyz'))
386 self.assertEqual(eval('globals()', g, d), g)
387 self.assertEqual(eval('locals()', g, d), d)
388
389 # Verify locals stores (used by list comps)
390 eval('[locals() for i in (2,3)]', g, d)
391 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
392
393 class SpreadSheet:
394 "Sample application showing nested, calculated lookups."
395 _cells = {}
396 def __setitem__(self, key, formula):
397 self._cells[key] = formula
Martin Blais215f13d2006-06-06 12:46:55 +0000398 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000399 return eval(self._cells[key], globals(), self)
400
401 ss = SpreadSheet()
402 ss['a1'] = '5'
403 ss['a2'] = 'a1*6'
404 ss['a3'] = 'a2*7'
405 self.assertEqual(ss['a3'], 210)
406
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000407 # Verify that dir() catches a non-list returned by eval
408 # SF bug #1004669
409 class C:
410 def __getitem__(self, item):
411 raise KeyError(item)
412 def keys(self):
413 return 'a'
414 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
415
Walter Dörwald919497e2003-01-19 16:23:59 +0000416 # Done outside of the method test_z to get the correct scope
417 z = 0
418 f = open(TESTFN, 'w')
419 f.write('z = z+1\n')
420 f.write('z = z*2\n')
421 f.close()
422 execfile(TESTFN)
423
424 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000425 global numruns
426 if numruns:
427 return
428 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000429
Walter Dörwald919497e2003-01-19 16:23:59 +0000430 globals = {'a': 1, 'b': 2}
431 locals = {'b': 200, 'c': 300}
432
433 self.assertEqual(self.__class__.z, 2)
434 globals['z'] = 0
435 execfile(TESTFN, globals)
436 self.assertEqual(globals['z'], 2)
437 locals['z'] = 0
438 execfile(TESTFN, globals, locals)
439 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000440
441 class M:
442 "Test mapping interface versus possible calls from execfile()."
443 def __init__(self):
444 self.z = 10
445 def __getitem__(self, key):
446 if key == 'z':
447 return self.z
448 raise KeyError
449 def __setitem__(self, key, value):
450 if key == 'z':
451 self.z = value
452 return
453 raise KeyError
454
455 locals = M()
456 locals['z'] = 0
457 execfile(TESTFN, globals, locals)
458 self.assertEqual(locals['z'], 2)
459
Walter Dörwald919497e2003-01-19 16:23:59 +0000460 unlink(TESTFN)
461 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000462 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000463 import os
464 self.assertRaises(IOError, execfile, os.curdir)
465 self.assertRaises(IOError, execfile, "I_dont_exist")
466
467 def test_filter(self):
468 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
469 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
470 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
471 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
472 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
473 def identity(item):
474 return 1
475 filter(identity, Squares(5))
476 self.assertRaises(TypeError, filter)
477 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000478 def __getitem__(self, index):
479 if index<4:
480 return 42
481 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000482 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
483 def badfunc():
484 pass
485 self.assertRaises(TypeError, filter, badfunc, range(5))
486
Walter Dörwaldbf517072003-01-27 15:57:14 +0000487 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000488 self.assertEqual(filter(None, (1, 2)), (1, 2))
489 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
490 self.assertRaises(TypeError, filter, 42, (1, 2))
491
Walter Dörwaldbf517072003-01-27 15:57:14 +0000492 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000493 self.assertEqual(filter(None, "12"), "12")
494 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
495 self.assertRaises(TypeError, filter, 42, "12")
496 class badstr(str):
497 def __getitem__(self, index):
498 raise ValueError
499 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000500
Walter Dörwald903f1e02003-02-04 16:28:00 +0000501 class badstr2(str):
502 def __getitem__(self, index):
503 return 42
504 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
505
506 class weirdstr(str):
507 def __getitem__(self, index):
508 return weirdstr(2*str.__getitem__(self, index))
509 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
510
Walter Dörwald5e61e242003-02-04 17:04:01 +0000511 class shiftstr(str):
512 def __getitem__(self, index):
513 return chr(ord(str.__getitem__(self, index))+1)
514 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
515
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000516 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000517 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000518 self.assertEqual(filter(None, unicode("12")), unicode("12"))
519 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
520 self.assertRaises(TypeError, filter, 42, unicode("12"))
521 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000522
Walter Dörwald903f1e02003-02-04 16:28:00 +0000523 class badunicode(unicode):
524 def __getitem__(self, index):
525 return 42
526 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
527
528 class weirdunicode(unicode):
529 def __getitem__(self, index):
530 return weirdunicode(2*unicode.__getitem__(self, index))
531 self.assertEqual(
532 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
533
Walter Dörwald5e61e242003-02-04 17:04:01 +0000534 class shiftunicode(unicode):
535 def __getitem__(self, index):
536 return unichr(ord(unicode.__getitem__(self, index))+1)
537 self.assertEqual(
538 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
539 unicode("345")
540 )
541
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000542 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000543 # test that filter() never returns tuple, str or unicode subclasses
544 # and that the result always goes through __getitem__
545 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000546 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000547 def __getitem__(self, index):
548 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000549 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000550 def __getitem__(self, index):
551 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000552 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000553 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000554 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000555 }
556 if have_unicode:
557 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000558 def __getitem__(self, index):
559 return 2*unicode.__getitem__(self, index)
560 inputs[unicode2] = {
561 unicode(): unicode(),
562 unicode("123"): unicode("112233")
563 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000564
Walter Dörwald1918f772003-02-10 13:19:13 +0000565 for (cls, inps) in inputs.iteritems():
566 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000567 # make sure the output goes through __getitem__
568 # even if func is None
569 self.assertEqual(
570 filter(funcs[0], cls(inp)),
571 filter(funcs[1], cls(inp))
572 )
573 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000574 outp = filter(func, cls(inp))
575 self.assertEqual(outp, exp)
576 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000577
Walter Dörwald919497e2003-01-19 16:23:59 +0000578 def test_getattr(self):
579 import sys
580 self.assert_(getattr(sys, 'stdout') is sys.stdout)
581 self.assertRaises(TypeError, getattr, sys, 1)
582 self.assertRaises(TypeError, getattr, sys, 1, "foo")
583 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000584 if have_unicode:
585 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000586
587 def test_hasattr(self):
588 import sys
589 self.assert_(hasattr(sys, 'stdout'))
590 self.assertRaises(TypeError, hasattr, sys, 1)
591 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000592 if have_unicode:
593 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000594
Benjamin Petersonb9030f42008-05-12 00:41:23 +0000595 # Check that hasattr allows SystemExit and KeyboardInterrupts by
596 class A:
597 def __getattr__(self, what):
598 raise KeyboardInterrupt
599 self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
600 class B:
601 def __getattr__(self, what):
602 raise SystemExit
603 self.assertRaises(SystemExit, hasattr, B(), "b")
604
Walter Dörwald919497e2003-01-19 16:23:59 +0000605 def test_hash(self):
606 hash(None)
607 self.assertEqual(hash(1), hash(1L))
608 self.assertEqual(hash(1), hash(1.0))
609 hash('spam')
610 if have_unicode:
611 self.assertEqual(hash('spam'), hash(unicode('spam')))
612 hash((0,1,2,3))
613 def f(): pass
614 self.assertRaises(TypeError, hash, [])
615 self.assertRaises(TypeError, hash, {})
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000616 # Bug 1536021: Allow hash to return long objects
617 class X:
618 def __hash__(self):
619 return 2**100
620 self.assertEquals(type(hash(X())), int)
621 class Y(object):
622 def __hash__(self):
623 return 2**100
624 self.assertEquals(type(hash(Y())), int)
Armin Rigo51fc8c42006-08-09 14:55:26 +0000625 class Z(long):
626 def __hash__(self):
627 return self
628 self.assertEquals(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000629
630 def test_hex(self):
631 self.assertEqual(hex(16), '0x10')
632 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000633 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000634 self.assertEqual(hex(-16L), '-0x10L')
635 self.assertRaises(TypeError, hex, {})
636
637 def test_id(self):
638 id(None)
639 id(1)
640 id(1L)
641 id(1.0)
642 id('spam')
643 id((0,1,2,3))
644 id([0,1,2,3])
645 id({'spam': 1, 'eggs': 2, 'ham': 3})
646
647 # Test input() later, together with raw_input
648
Walter Dörwald919497e2003-01-19 16:23:59 +0000649 def test_intern(self):
650 self.assertRaises(TypeError, intern)
Georg Brandl23016272009-10-27 22:57:25 +0000651 # This fails if the test is run twice with a constant string,
652 # therefore append the run counter
653 s = "never interned before " + str(numruns)
Walter Dörwald919497e2003-01-19 16:23:59 +0000654 self.assert_(intern(s) is s)
655 s2 = s.swapcase().swapcase()
656 self.assert_(intern(s2) is s)
657
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000658 # Subclasses of string can't be interned, because they
659 # provide too much opportunity for insane things to happen.
660 # We don't want them in the interned dict and if they aren't
661 # actually interned, we don't want to create the appearance
662 # that they are by allowing intern() to succeeed.
663 class S(str):
664 def __hash__(self):
665 return 123
666
667 self.assertRaises(TypeError, intern, S("abc"))
668
669 # It's still safe to pass these strings to routines that
670 # call intern internally, e.g. PyObject_SetAttr().
671 s = S("abc")
672 setattr(s, s, s)
673 self.assertEqual(getattr(s, s), s)
674
Walter Dörwald919497e2003-01-19 16:23:59 +0000675 def test_iter(self):
676 self.assertRaises(TypeError, iter)
677 self.assertRaises(TypeError, iter, 42, 42)
678 lists = [("1", "2"), ["1", "2"], "12"]
679 if have_unicode:
680 lists.append(unicode("12"))
681 for l in lists:
682 i = iter(l)
683 self.assertEqual(i.next(), '1')
684 self.assertEqual(i.next(), '2')
685 self.assertRaises(StopIteration, i.next)
686
687 def test_isinstance(self):
688 class C:
689 pass
690 class D(C):
691 pass
692 class E:
693 pass
694 c = C()
695 d = D()
696 e = E()
697 self.assert_(isinstance(c, C))
698 self.assert_(isinstance(d, C))
699 self.assert_(not isinstance(e, C))
700 self.assert_(not isinstance(c, D))
701 self.assert_(not isinstance('foo', E))
702 self.assertRaises(TypeError, isinstance, E, 'foo')
703 self.assertRaises(TypeError, isinstance)
704
705 def test_issubclass(self):
706 class C:
707 pass
708 class D(C):
709 pass
710 class E:
711 pass
712 c = C()
713 d = D()
714 e = E()
715 self.assert_(issubclass(D, C))
716 self.assert_(issubclass(C, C))
717 self.assert_(not issubclass(C, D))
718 self.assertRaises(TypeError, issubclass, 'foo', E)
719 self.assertRaises(TypeError, issubclass, E, 'foo')
720 self.assertRaises(TypeError, issubclass)
721
722 def test_len(self):
723 self.assertEqual(len('123'), 3)
724 self.assertEqual(len(()), 0)
725 self.assertEqual(len((1, 2, 3, 4)), 4)
726 self.assertEqual(len([1, 2, 3, 4]), 4)
727 self.assertEqual(len({}), 0)
728 self.assertEqual(len({'a':1, 'b': 2}), 2)
729 class BadSeq:
730 def __len__(self):
731 raise ValueError
732 self.assertRaises(ValueError, len, BadSeq())
733
Walter Dörwald919497e2003-01-19 16:23:59 +0000734 def test_map(self):
735 self.assertEqual(
736 map(None, 'hello world'),
737 ['h','e','l','l','o',' ','w','o','r','l','d']
738 )
739 self.assertEqual(
740 map(None, 'abcd', 'efg'),
741 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
742 )
743 self.assertEqual(
744 map(None, range(10)),
745 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
746 )
747 self.assertEqual(
748 map(lambda x: x*x, range(1,4)),
749 [1, 4, 9]
750 )
751 try:
752 from math import sqrt
753 except ImportError:
754 def sqrt(x):
755 return pow(x, 0.5)
756 self.assertEqual(
757 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
758 [[4.0, 2.0], [9.0, 3.0]]
759 )
760 self.assertEqual(
761 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
762 [10, 4, 6]
763 )
764
765 def plus(*v):
766 accu = 0
767 for i in v: accu = accu + i
768 return accu
769 self.assertEqual(
770 map(plus, [1, 3, 7]),
771 [1, 3, 7]
772 )
773 self.assertEqual(
774 map(plus, [1, 3, 7], [4, 9, 2]),
775 [1+4, 3+9, 7+2]
776 )
777 self.assertEqual(
778 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
779 [1+4+1, 3+9+1, 7+2+0]
780 )
781 self.assertEqual(
782 map(None, Squares(10)),
783 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
784 )
785 self.assertEqual(
786 map(int, Squares(10)),
787 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
788 )
789 self.assertEqual(
790 map(None, Squares(3), Squares(2)),
791 [(0,0), (1,1), (4,None)]
792 )
793 self.assertEqual(
794 map(max, Squares(3), Squares(2)),
795 [0, 1, 4]
796 )
797 self.assertRaises(TypeError, map)
798 self.assertRaises(TypeError, map, lambda x: x, 42)
799 self.assertEqual(map(None, [42]), [42])
800 class BadSeq:
801 def __getitem__(self, index):
802 raise ValueError
803 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +0000804 def badfunc(x):
805 raise RuntimeError
806 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000807
808 def test_max(self):
809 self.assertEqual(max('123123'), '3')
810 self.assertEqual(max(1, 2, 3), 3)
811 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
812 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
813
814 self.assertEqual(max(1, 2L, 3.0), 3.0)
815 self.assertEqual(max(1L, 2.0, 3), 3)
816 self.assertEqual(max(1.0, 2, 3L), 3L)
817
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000818 for stmt in (
819 "max(key=int)", # no args
820 "max(1, key=int)", # single arg not iterable
821 "max(1, 2, keystone=int)", # wrong keyword
822 "max(1, 2, key=int, abc=int)", # two many keywords
823 "max(1, 2, key=1)", # keyfunc is not callable
824 ):
Tim Peters7f061872004-12-07 21:17:46 +0000825 try:
826 exec(stmt) in globals()
827 except TypeError:
828 pass
829 else:
830 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000831
832 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
833 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
834 self.assertEqual(max(1, 2, key=neg), 1) # two elems
835
836 data = [random.randrange(200) for i in range(100)]
837 keys = dict((elem, random.randrange(50)) for elem in data)
838 f = keys.__getitem__
839 self.assertEqual(max(data, key=f),
840 sorted(reversed(data), key=f)[-1])
841
Walter Dörwald919497e2003-01-19 16:23:59 +0000842 def test_min(self):
843 self.assertEqual(min('123123'), '1')
844 self.assertEqual(min(1, 2, 3), 1)
845 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
846 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
847
848 self.assertEqual(min(1, 2L, 3.0), 1)
849 self.assertEqual(min(1L, 2.0, 3), 1L)
850 self.assertEqual(min(1.0, 2, 3L), 1.0)
851
852 self.assertRaises(TypeError, min)
853 self.assertRaises(TypeError, min, 42)
854 self.assertRaises(ValueError, min, ())
855 class BadSeq:
856 def __getitem__(self, index):
857 raise ValueError
858 self.assertRaises(ValueError, min, BadSeq())
859 class BadNumber:
860 def __cmp__(self, other):
861 raise ValueError
862 self.assertRaises(ValueError, min, (42, BadNumber()))
863
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000864 for stmt in (
865 "min(key=int)", # no args
866 "min(1, key=int)", # single arg not iterable
867 "min(1, 2, keystone=int)", # wrong keyword
868 "min(1, 2, key=int, abc=int)", # two many keywords
869 "min(1, 2, key=1)", # keyfunc is not callable
870 ):
Tim Peters7f061872004-12-07 21:17:46 +0000871 try:
872 exec(stmt) in globals()
873 except TypeError:
874 pass
875 else:
876 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000877
878 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
879 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
880 self.assertEqual(min(1, 2, key=neg), 2) # two elems
881
882 data = [random.randrange(200) for i in range(100)]
883 keys = dict((elem, random.randrange(50)) for elem in data)
884 f = keys.__getitem__
885 self.assertEqual(min(data, key=f),
886 sorted(data, key=f)[0])
887
Georg Brandl28e08732008-04-30 19:47:09 +0000888 def test_next(self):
889 it = iter(range(2))
890 self.assertEqual(next(it), 0)
891 self.assertEqual(next(it), 1)
892 self.assertRaises(StopIteration, next, it)
893 self.assertRaises(StopIteration, next, it)
894 self.assertEquals(next(it, 42), 42)
895
896 class Iter(object):
897 def __iter__(self):
898 return self
899 def next(self):
900 raise StopIteration
901
902 it = iter(Iter())
903 self.assertEquals(next(it, 42), 42)
904 self.assertRaises(StopIteration, next, it)
905
906 def gen():
907 yield 1
908 return
909
910 it = gen()
911 self.assertEquals(next(it), 1)
912 self.assertRaises(StopIteration, next, it)
913 self.assertEquals(next(it, 42), 42)
914
Walter Dörwald919497e2003-01-19 16:23:59 +0000915 def test_oct(self):
916 self.assertEqual(oct(100), '0144')
917 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000918 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000919 self.assertEqual(oct(-100L), '-0144L')
920 self.assertRaises(TypeError, oct, ())
921
922 def write_testfile(self):
923 # NB the first 4 lines are also used to test input and raw_input, below
924 fp = open(TESTFN, 'w')
925 try:
926 fp.write('1+1\n')
927 fp.write('1+1\n')
928 fp.write('The quick brown fox jumps over the lazy dog')
929 fp.write('.\n')
930 fp.write('Dear John\n')
931 fp.write('XXX'*100)
932 fp.write('YYY'*100)
933 finally:
934 fp.close()
935
936 def test_open(self):
937 self.write_testfile()
938 fp = open(TESTFN, 'r')
939 try:
940 self.assertEqual(fp.readline(4), '1+1\n')
941 self.assertEqual(fp.readline(4), '1+1\n')
942 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
943 self.assertEqual(fp.readline(4), 'Dear')
944 self.assertEqual(fp.readline(100), ' John\n')
945 self.assertEqual(fp.read(300), 'XXX'*100)
946 self.assertEqual(fp.read(1000), 'YYY'*100)
947 finally:
948 fp.close()
949 unlink(TESTFN)
950
951 def test_ord(self):
952 self.assertEqual(ord(' '), 32)
953 self.assertEqual(ord('A'), 65)
954 self.assertEqual(ord('a'), 97)
955 if have_unicode:
956 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
957 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000958 if have_unicode:
959 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000960
961 def test_pow(self):
962 self.assertEqual(pow(0,0), 1)
963 self.assertEqual(pow(0,1), 0)
964 self.assertEqual(pow(1,0), 1)
965 self.assertEqual(pow(1,1), 1)
966
967 self.assertEqual(pow(2,0), 1)
968 self.assertEqual(pow(2,10), 1024)
969 self.assertEqual(pow(2,20), 1024*1024)
970 self.assertEqual(pow(2,30), 1024*1024*1024)
971
972 self.assertEqual(pow(-2,0), 1)
973 self.assertEqual(pow(-2,1), -2)
974 self.assertEqual(pow(-2,2), 4)
975 self.assertEqual(pow(-2,3), -8)
976
977 self.assertEqual(pow(0L,0), 1)
978 self.assertEqual(pow(0L,1), 0)
979 self.assertEqual(pow(1L,0), 1)
980 self.assertEqual(pow(1L,1), 1)
981
982 self.assertEqual(pow(2L,0), 1)
983 self.assertEqual(pow(2L,10), 1024)
984 self.assertEqual(pow(2L,20), 1024*1024)
985 self.assertEqual(pow(2L,30), 1024*1024*1024)
986
987 self.assertEqual(pow(-2L,0), 1)
988 self.assertEqual(pow(-2L,1), -2)
989 self.assertEqual(pow(-2L,2), 4)
990 self.assertEqual(pow(-2L,3), -8)
991
992 self.assertAlmostEqual(pow(0.,0), 1.)
993 self.assertAlmostEqual(pow(0.,1), 0.)
994 self.assertAlmostEqual(pow(1.,0), 1.)
995 self.assertAlmostEqual(pow(1.,1), 1.)
996
997 self.assertAlmostEqual(pow(2.,0), 1.)
998 self.assertAlmostEqual(pow(2.,10), 1024.)
999 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1000 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1001
1002 self.assertAlmostEqual(pow(-2.,0), 1.)
1003 self.assertAlmostEqual(pow(-2.,1), -2.)
1004 self.assertAlmostEqual(pow(-2.,2), 4.)
1005 self.assertAlmostEqual(pow(-2.,3), -8.)
1006
1007 for x in 2, 2L, 2.0:
1008 for y in 10, 10L, 10.0:
1009 for z in 1000, 1000L, 1000.0:
1010 if isinstance(x, float) or \
1011 isinstance(y, float) or \
1012 isinstance(z, float):
1013 self.assertRaises(TypeError, pow, x, y, z)
1014 else:
1015 self.assertAlmostEqual(pow(x, y, z), 24.0)
1016
1017 self.assertRaises(TypeError, pow, -1, -2, 3)
1018 self.assertRaises(ValueError, pow, 1, 2, 0)
1019 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1020 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001021 # Will return complex in 3.0:
1022 self.assertRaises(ValueError, pow, -342.43, 0.234)
Walter Dörwald919497e2003-01-19 16:23:59 +00001023
1024 self.assertRaises(TypeError, pow)
1025
1026 def test_range(self):
1027 self.assertEqual(range(3), [0, 1, 2])
1028 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1029 self.assertEqual(range(0), [])
1030 self.assertEqual(range(-3), [])
1031 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1032 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1033
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001034 # Now test range() with longs
1035 self.assertEqual(range(-2**100), [])
1036 self.assertEqual(range(0, -2**100), [])
1037 self.assertEqual(range(0, 2**100, -1), [])
1038 self.assertEqual(range(0, 2**100, -1), [])
1039
1040 a = long(10 * sys.maxint)
1041 b = long(100 * sys.maxint)
1042 c = long(50 * sys.maxint)
1043
1044 self.assertEqual(range(a, a+2), [a, a+1])
1045 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1046 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1047
1048 seq = range(a, b, c)
1049 self.assert_(a in seq)
1050 self.assert_(b not in seq)
1051 self.assertEqual(len(seq), 2)
1052
1053 seq = range(b, a, -c)
1054 self.assert_(b in seq)
1055 self.assert_(a not in seq)
1056 self.assertEqual(len(seq), 2)
1057
1058 seq = range(-a, -b, -c)
1059 self.assert_(-a in seq)
1060 self.assert_(-b not in seq)
1061 self.assertEqual(len(seq), 2)
1062
Walter Dörwald919497e2003-01-19 16:23:59 +00001063 self.assertRaises(TypeError, range)
1064 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1065 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001066 self.assertRaises(ValueError, range, a, a + 1, long(0))
1067
1068 class badzero(int):
1069 def __cmp__(self, other):
1070 raise RuntimeError
Nick Coghlan48361f52008-08-11 15:45:58 +00001071 __hash__ = None # Invalid cmp makes this unhashable
Neal Norwitzfcf44352005-11-27 20:37:43 +00001072 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001073
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001074 # Reject floats when it would require PyLongs to represent.
1075 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001076 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001077
Walter Dörwald357981e2003-04-15 18:59:28 +00001078 self.assertRaises(TypeError, range, 0, "spam")
1079 self.assertRaises(TypeError, range, 0, 42, "spam")
1080
1081 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1082 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1083
Walter Dörwald919497e2003-01-19 16:23:59 +00001084 def test_input_and_raw_input(self):
1085 self.write_testfile()
1086 fp = open(TESTFN, 'r')
1087 savestdin = sys.stdin
1088 savestdout = sys.stdout # Eats the echo
1089 try:
1090 sys.stdin = fp
1091 sys.stdout = BitBucket()
1092 self.assertEqual(input(), 2)
1093 self.assertEqual(input('testing\n'), 2)
1094 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1095 self.assertEqual(raw_input('testing\n'), 'Dear John')
Tim Peters8e24a962006-08-09 00:52:26 +00001096
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001097 # SF 1535165: don't segfault on closed stdin
1098 # sys.stdout must be a regular file for triggering
1099 sys.stdout = savestdout
1100 sys.stdin.close()
Georg Brandld336e982006-08-06 09:17:16 +00001101 self.assertRaises(ValueError, input)
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001102
1103 sys.stdout = BitBucket()
Walter Dörwald919497e2003-01-19 16:23:59 +00001104 sys.stdin = cStringIO.StringIO("NULL\0")
1105 self.assertRaises(TypeError, input, 42, 42)
1106 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1107 self.assertEqual(input(), 'whitespace')
1108 sys.stdin = cStringIO.StringIO()
1109 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001110
1111 # SF 876178: make sure input() respect future options.
1112 sys.stdin = cStringIO.StringIO('1/2')
1113 sys.stdout = cStringIO.StringIO()
1114 exec compile('print input()', 'test_builtin_tmp', 'exec')
1115 sys.stdin.seek(0, 0)
1116 exec compile('from __future__ import division;print input()',
1117 'test_builtin_tmp', 'exec')
1118 sys.stdin.seek(0, 0)
1119 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001120 # The result we expect depends on whether new division semantics
1121 # are already in effect.
1122 if 1/2 == 0:
1123 # This test was compiled with old semantics.
1124 expected = ['0', '0.5', '0']
1125 else:
1126 # This test was compiled with new semantics (e.g., -Qnew
1127 # was given on the command line.
1128 expected = ['0.5', '0.5', '0.5']
1129 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001130
Walter Dörwald919497e2003-01-19 16:23:59 +00001131 del sys.stdout
1132 self.assertRaises(RuntimeError, input, 'prompt')
1133 del sys.stdin
1134 self.assertRaises(RuntimeError, input, 'prompt')
1135 finally:
1136 sys.stdin = savestdin
1137 sys.stdout = savestdout
1138 fp.close()
1139 unlink(TESTFN)
1140
1141 def test_reduce(self):
1142 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1143 self.assertEqual(
1144 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1145 ['a','c','d','w']
1146 )
1147 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1148 self.assertEqual(
1149 reduce(lambda x, y: x*y, range(2,21), 1L),
1150 2432902008176640000L
1151 )
1152 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1153 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1154 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1155 self.assertRaises(TypeError, reduce)
1156 self.assertRaises(TypeError, reduce, 42, 42)
1157 self.assertRaises(TypeError, reduce, 42, 42, 42)
1158 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1159 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1160 self.assertRaises(TypeError, reduce, 42, (42, 42))
1161
1162 class BadSeq:
1163 def __getitem__(self, index):
1164 raise ValueError
1165 self.assertRaises(ValueError, reduce, 42, BadSeq())
1166
1167 def test_reload(self):
1168 import marshal
1169 reload(marshal)
1170 import string
1171 reload(string)
1172 ## import sys
1173 ## self.assertRaises(ImportError, reload, sys)
1174
1175 def test_repr(self):
1176 self.assertEqual(repr(''), '\'\'')
1177 self.assertEqual(repr(0), '0')
1178 self.assertEqual(repr(0L), '0L')
1179 self.assertEqual(repr(()), '()')
1180 self.assertEqual(repr([]), '[]')
1181 self.assertEqual(repr({}), '{}')
1182 a = []
1183 a.append(a)
1184 self.assertEqual(repr(a), '[[...]]')
1185 a = {}
1186 a[0] = a
1187 self.assertEqual(repr(a), '{0: {...}}')
1188
1189 def test_round(self):
1190 self.assertEqual(round(0.0), 0.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001191 self.assertEqual(type(round(0.0)), float) # Will be int in 3.0.
Walter Dörwald919497e2003-01-19 16:23:59 +00001192 self.assertEqual(round(1.0), 1.0)
1193 self.assertEqual(round(10.0), 10.0)
1194 self.assertEqual(round(1000000000.0), 1000000000.0)
1195 self.assertEqual(round(1e20), 1e20)
1196
1197 self.assertEqual(round(-1.0), -1.0)
1198 self.assertEqual(round(-10.0), -10.0)
1199 self.assertEqual(round(-1000000000.0), -1000000000.0)
1200 self.assertEqual(round(-1e20), -1e20)
1201
1202 self.assertEqual(round(0.1), 0.0)
1203 self.assertEqual(round(1.1), 1.0)
1204 self.assertEqual(round(10.1), 10.0)
1205 self.assertEqual(round(1000000000.1), 1000000000.0)
1206
1207 self.assertEqual(round(-1.1), -1.0)
1208 self.assertEqual(round(-10.1), -10.0)
1209 self.assertEqual(round(-1000000000.1), -1000000000.0)
1210
1211 self.assertEqual(round(0.9), 1.0)
1212 self.assertEqual(round(9.9), 10.0)
1213 self.assertEqual(round(999999999.9), 1000000000.0)
1214
1215 self.assertEqual(round(-0.9), -1.0)
1216 self.assertEqual(round(-9.9), -10.0)
1217 self.assertEqual(round(-999999999.9), -1000000000.0)
1218
1219 self.assertEqual(round(-8.0, -1), -10.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001220 self.assertEqual(type(round(-8.0, -1)), float)
1221
1222 self.assertEqual(type(round(-8.0, 0)), float)
1223 self.assertEqual(type(round(-8.0, 1)), float)
1224
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001225 # Check half rounding behaviour.
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001226 self.assertEqual(round(5.5), 6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001227 self.assertEqual(round(6.5), 7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001228 self.assertEqual(round(-5.5), -6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001229 self.assertEqual(round(-6.5), -7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001230
1231 # Check behavior on ints
1232 self.assertEqual(round(0), 0)
1233 self.assertEqual(round(8), 8)
1234 self.assertEqual(round(-8), -8)
1235 self.assertEqual(type(round(0)), float) # Will be int in 3.0.
1236 self.assertEqual(type(round(-8, -1)), float)
1237 self.assertEqual(type(round(-8, 0)), float)
1238 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001239
Georg Brandlccadf842006-03-31 18:54:53 +00001240 # test new kwargs
1241 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1242
Walter Dörwald919497e2003-01-19 16:23:59 +00001243 self.assertRaises(TypeError, round)
1244
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001245 # test generic rounding delegation for reals
1246 class TestRound(object):
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001247 def __float__(self):
1248 return 23.0
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001249
1250 class TestNoRound(object):
1251 pass
1252
1253 self.assertEqual(round(TestRound()), 23)
1254
1255 self.assertRaises(TypeError, round, 1, 2, 3)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001256 self.assertRaises(TypeError, round, TestNoRound())
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001257
1258 t = TestNoRound()
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001259 t.__float__ = lambda *args: args
1260 self.assertRaises(TypeError, round, t)
1261 self.assertRaises(TypeError, round, t, 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001262
Mark Dickinsonf2637242009-11-09 17:45:40 +00001263 def test_round_large(self):
1264 # Issue #1869: integral floats should remain unchanged
1265 self.assertEqual(round(5e15-1), 5e15-1)
1266 self.assertEqual(round(5e15), 5e15)
1267 self.assertEqual(round(5e15+1), 5e15+1)
1268 self.assertEqual(round(5e15+2), 5e15+2)
1269 self.assertEqual(round(5e15+3), 5e15+3)
1270
Walter Dörwald919497e2003-01-19 16:23:59 +00001271 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001272 setattr(sys, 'spam', 1)
1273 self.assertEqual(sys.spam, 1)
1274 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1275 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001276
Alex Martellia70b1912003-04-22 08:12:33 +00001277 def test_sum(self):
1278 self.assertEqual(sum([]), 0)
1279 self.assertEqual(sum(range(2,8)), 27)
1280 self.assertEqual(sum(iter(range(2,8))), 27)
1281 self.assertEqual(sum(Squares(10)), 285)
1282 self.assertEqual(sum(iter(Squares(10))), 285)
1283 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1284
1285 self.assertRaises(TypeError, sum)
1286 self.assertRaises(TypeError, sum, 42)
1287 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1288 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1289 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1290 self.assertRaises(TypeError, sum, [{2:3}])
1291 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1292
1293 class BadSeq:
1294 def __getitem__(self, index):
1295 raise ValueError
1296 self.assertRaises(ValueError, sum, BadSeq())
1297
Walter Dörwald919497e2003-01-19 16:23:59 +00001298 def test_type(self):
1299 self.assertEqual(type(''), type('123'))
1300 self.assertNotEqual(type(''), type(()))
1301
1302 def test_unichr(self):
1303 if have_unicode:
1304 self.assertEqual(unichr(32), unicode(' '))
1305 self.assertEqual(unichr(65), unicode('A'))
1306 self.assertEqual(unichr(97), unicode('a'))
1307 self.assertEqual(
1308 unichr(sys.maxunicode),
1309 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1310 )
1311 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1312 self.assertRaises(TypeError, unichr)
Amaury Forgeot d'Arc39fd6722008-07-31 21:28:03 +00001313 self.assertRaises((OverflowError, ValueError), unichr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +00001314
Guido van Rossumfee7b932005-01-16 00:21:28 +00001315 # We don't want self in vars(), so these are static methods
1316
1317 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001318 def get_vars_f0():
1319 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001320
Guido van Rossumfee7b932005-01-16 00:21:28 +00001321 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001322 def get_vars_f2():
1323 BuiltinTest.get_vars_f0()
1324 a = 1
1325 b = 2
1326 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001327
1328 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001329 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001330 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001331 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001332 self.assertEqual(self.get_vars_f0(), {})
1333 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1334 self.assertRaises(TypeError, vars, 42, 42)
1335 self.assertRaises(TypeError, vars, 42)
1336
1337 def test_zip(self):
1338 a = (1, 2, 3)
1339 b = (4, 5, 6)
1340 t = [(1, 4), (2, 5), (3, 6)]
1341 self.assertEqual(zip(a, b), t)
1342 b = [4, 5, 6]
1343 self.assertEqual(zip(a, b), t)
1344 b = (4, 5, 6, 7)
1345 self.assertEqual(zip(a, b), t)
1346 class I:
1347 def __getitem__(self, i):
1348 if i < 0 or i > 2: raise IndexError
1349 return i + 4
1350 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001351 self.assertEqual(zip(), [])
1352 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001353 self.assertRaises(TypeError, zip, None)
1354 class G:
1355 pass
1356 self.assertRaises(TypeError, zip, a, G())
1357
1358 # Make sure zip doesn't try to allocate a billion elements for the
1359 # result list when one of its arguments doesn't say how long it is.
1360 # A MemoryError is the most likely failure mode.
1361 class SequenceWithoutALength:
1362 def __getitem__(self, i):
1363 if i == 5:
1364 raise IndexError
1365 else:
1366 return i
1367 self.assertEqual(
1368 zip(SequenceWithoutALength(), xrange(2**30)),
1369 list(enumerate(range(5)))
1370 )
1371
1372 class BadSeq:
1373 def __getitem__(self, i):
1374 if i == 5:
1375 raise ValueError
1376 else:
1377 return i
1378 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1379
Eric Smitha9f7d622008-02-17 19:46:49 +00001380 def test_format(self):
1381 # Test the basic machinery of the format() builtin. Don't test
1382 # the specifics of the various formatters
1383 self.assertEqual(format(3, ''), '3')
1384
1385 # Returns some classes to use for various tests. There's
1386 # an old-style version, and a new-style version
1387 def classes_new():
1388 class A(object):
1389 def __init__(self, x):
1390 self.x = x
1391 def __format__(self, format_spec):
1392 return str(self.x) + format_spec
1393 class DerivedFromA(A):
1394 pass
1395
1396 class Simple(object): pass
1397 class DerivedFromSimple(Simple):
1398 def __init__(self, x):
1399 self.x = x
1400 def __format__(self, format_spec):
1401 return str(self.x) + format_spec
1402 class DerivedFromSimple2(DerivedFromSimple): pass
1403 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1404
1405 # In 3.0, classes_classic has the same meaning as classes_new
1406 def classes_classic():
1407 class A:
1408 def __init__(self, x):
1409 self.x = x
1410 def __format__(self, format_spec):
1411 return str(self.x) + format_spec
1412 class DerivedFromA(A):
1413 pass
1414
1415 class Simple: pass
1416 class DerivedFromSimple(Simple):
1417 def __init__(self, x):
1418 self.x = x
1419 def __format__(self, format_spec):
1420 return str(self.x) + format_spec
1421 class DerivedFromSimple2(DerivedFromSimple): pass
1422 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1423
1424 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1425 self.assertEqual(format(A(3), 'spec'), '3spec')
1426 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1427 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1428 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1429 '10abcdef')
1430
1431 class_test(*classes_new())
1432 class_test(*classes_classic())
1433
1434 def empty_format_spec(value):
1435 # test that:
1436 # format(x, '') == str(x)
1437 # format(x) == str(x)
1438 self.assertEqual(format(value, ""), str(value))
1439 self.assertEqual(format(value), str(value))
1440
1441 # for builtin types, format(x, "") == str(x)
1442 empty_format_spec(17**13)
1443 empty_format_spec(1.0)
1444 empty_format_spec(3.1415e104)
1445 empty_format_spec(-3.1415e104)
1446 empty_format_spec(3.1415e-104)
1447 empty_format_spec(-3.1415e-104)
1448 empty_format_spec(object)
1449 empty_format_spec(None)
1450
1451 # TypeError because self.__format__ returns the wrong type
1452 class BadFormatResult:
1453 def __format__(self, format_spec):
1454 return 1.0
1455 self.assertRaises(TypeError, format, BadFormatResult(), "")
1456
1457 # TypeError because format_spec is not unicode or str
1458 self.assertRaises(TypeError, format, object(), 4)
1459 self.assertRaises(TypeError, format, object(), object())
1460
1461 # tests for object.__format__ really belong elsewhere, but
1462 # there's no good place to put them
1463 x = object().__format__('')
1464 self.assert_(x.startswith('<object object at'))
1465
1466 # first argument to object.__format__ must be string
1467 self.assertRaises(TypeError, object().__format__, 3)
1468 self.assertRaises(TypeError, object().__format__, object())
1469 self.assertRaises(TypeError, object().__format__, None)
1470
1471 # make sure we can take a subclass of str as a format spec
1472 class DerivedFromStr(str): pass
1473 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1474
Eric Smithfb0742f2008-02-22 17:43:17 +00001475 def test_bin(self):
1476 self.assertEqual(bin(0), '0b0')
1477 self.assertEqual(bin(1), '0b1')
1478 self.assertEqual(bin(-1), '-0b1')
1479 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1480 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1481 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1482 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1483
Georg Brandl11a81b22009-07-22 12:03:09 +00001484 def test_bytearray_translate(self):
1485 x = bytearray("abc")
1486 self.assertRaises(ValueError, x.translate, "1", 1)
1487 self.assertRaises(TypeError, x.translate, "1"*256, 1)
1488
Eric Smithce584d42008-02-21 20:17:08 +00001489class TestSorted(unittest.TestCase):
1490
1491 def test_basic(self):
1492 data = range(100)
1493 copy = data[:]
1494 random.shuffle(copy)
1495 self.assertEqual(data, sorted(copy))
1496 self.assertNotEqual(data, copy)
1497
1498 data.reverse()
1499 random.shuffle(copy)
1500 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1501 self.assertNotEqual(data, copy)
1502 random.shuffle(copy)
1503 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1504 self.assertNotEqual(data, copy)
1505 random.shuffle(copy)
1506 self.assertEqual(data, sorted(copy, reverse=1))
1507 self.assertNotEqual(data, copy)
1508
1509 def test_inputtypes(self):
1510 s = 'abracadabra'
1511 types = [list, tuple]
1512 if have_unicode:
1513 types.insert(0, unicode)
1514 for T in types:
1515 self.assertEqual(sorted(s), sorted(T(s)))
1516
1517 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
1518 types = [set, frozenset, list, tuple, dict.fromkeys]
1519 if have_unicode:
1520 types.insert(0, unicode)
1521 for T in types:
1522 self.assertEqual(sorted(s), sorted(T(s)))
1523
1524 def test_baddecorator(self):
1525 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1526 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1527
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001528def test_main(verbose=None):
1529 test_classes = (BuiltinTest, TestSorted)
1530
1531 run_unittest(*test_classes)
1532
1533 # verify reference counting
1534 if verbose and hasattr(sys, "gettotalrefcount"):
1535 import gc
1536 counts = [None] * 5
1537 for i in xrange(len(counts)):
1538 run_unittest(*test_classes)
1539 gc.collect()
1540 counts[i] = sys.gettotalrefcount()
1541 print counts
1542
Walter Dörwald919497e2003-01-19 16:23:59 +00001543
1544if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001545 test_main(verbose=True)