blob: 4e8ffe5337ffa3e62c03060c0b8b6ba8f2a6b59e [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)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000241 if have_unicode:
242 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000243
Walter Dörwald919497e2003-01-19 16:23:59 +0000244 def test_delattr(self):
245 import sys
246 sys.spam = 1
247 delattr(sys, 'spam')
248 self.assertRaises(TypeError, delattr)
249
250 def test_dir(self):
251 x = 1
252 self.assert_('x' in dir())
253 import sys
254 self.assert_('modules' in dir(sys))
255 self.assertRaises(TypeError, dir, 42, 42)
256
257 def test_divmod(self):
258 self.assertEqual(divmod(12, 7), (1, 5))
259 self.assertEqual(divmod(-12, 7), (-2, 2))
260 self.assertEqual(divmod(12, -7), (-2, -2))
261 self.assertEqual(divmod(-12, -7), (1, -5))
262
263 self.assertEqual(divmod(12L, 7L), (1L, 5L))
264 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
265 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
266 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
267
268 self.assertEqual(divmod(12, 7L), (1, 5L))
269 self.assertEqual(divmod(-12, 7L), (-2, 2L))
270 self.assertEqual(divmod(12L, -7), (-2L, -2))
271 self.assertEqual(divmod(-12L, -7), (1L, -5))
272
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000273 self.assertEqual(divmod(-sys.maxint-1, -1),
274 (sys.maxint+1, 0))
275
Walter Dörwald919497e2003-01-19 16:23:59 +0000276 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
277 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
278 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
279 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
280
281 self.assertRaises(TypeError, divmod)
282
283 def test_eval(self):
284 self.assertEqual(eval('1+1'), 2)
285 self.assertEqual(eval(' 1+1\n'), 2)
286 globals = {'a': 1, 'b': 2}
287 locals = {'b': 200, 'c': 300}
288 self.assertEqual(eval('a', globals) , 1)
289 self.assertEqual(eval('a', globals, locals), 1)
290 self.assertEqual(eval('b', globals, locals), 200)
291 self.assertEqual(eval('c', globals, locals), 300)
292 if have_unicode:
293 self.assertEqual(eval(unicode('1+1')), 2)
294 self.assertEqual(eval(unicode(' 1+1\n')), 2)
295 globals = {'a': 1, 'b': 2}
296 locals = {'b': 200, 'c': 300}
297 if have_unicode:
298 self.assertEqual(eval(unicode('a'), globals), 1)
299 self.assertEqual(eval(unicode('a'), globals, locals), 1)
300 self.assertEqual(eval(unicode('b'), globals, locals), 200)
301 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000302 bom = '\xef\xbb\xbf'
303 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000304 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
305 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000306 self.assertRaises(TypeError, eval)
307 self.assertRaises(TypeError, eval, ())
308
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000309 def test_general_eval(self):
310 # Tests that general mappings can be used for the locals argument
311
312 class M:
313 "Test mapping interface versus possible calls from eval()."
314 def __getitem__(self, key):
315 if key == 'a':
316 return 12
317 raise KeyError
318 def keys(self):
319 return list('xyz')
320
321 m = M()
322 g = globals()
323 self.assertEqual(eval('a', g, m), 12)
324 self.assertRaises(NameError, eval, 'b', g, m)
325 self.assertEqual(eval('dir()', g, m), list('xyz'))
326 self.assertEqual(eval('globals()', g, m), g)
327 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000328 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000329 class A:
330 "Non-mapping"
331 pass
332 m = A()
333 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000334
335 # Verify that dict subclasses work as well
336 class D(dict):
337 def __getitem__(self, key):
338 if key == 'a':
339 return 12
340 return dict.__getitem__(self, key)
341 def keys(self):
342 return list('xyz')
343
344 d = D()
345 self.assertEqual(eval('a', g, d), 12)
346 self.assertRaises(NameError, eval, 'b', g, d)
347 self.assertEqual(eval('dir()', g, d), list('xyz'))
348 self.assertEqual(eval('globals()', g, d), g)
349 self.assertEqual(eval('locals()', g, d), d)
350
351 # Verify locals stores (used by list comps)
352 eval('[locals() for i in (2,3)]', g, d)
353 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
354
355 class SpreadSheet:
356 "Sample application showing nested, calculated lookups."
357 _cells = {}
358 def __setitem__(self, key, formula):
359 self._cells[key] = formula
360 def __getitem__(self, key ):
361 return eval(self._cells[key], globals(), self)
362
363 ss = SpreadSheet()
364 ss['a1'] = '5'
365 ss['a2'] = 'a1*6'
366 ss['a3'] = 'a2*7'
367 self.assertEqual(ss['a3'], 210)
368
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000369 # Verify that dir() catches a non-list returned by eval
370 # SF bug #1004669
371 class C:
372 def __getitem__(self, item):
373 raise KeyError(item)
374 def keys(self):
375 return 'a'
376 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
377
Walter Dörwald919497e2003-01-19 16:23:59 +0000378 # Done outside of the method test_z to get the correct scope
379 z = 0
380 f = open(TESTFN, 'w')
381 f.write('z = z+1\n')
382 f.write('z = z*2\n')
383 f.close()
384 execfile(TESTFN)
385
386 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000387 global numruns
388 if numruns:
389 return
390 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000391
Walter Dörwald919497e2003-01-19 16:23:59 +0000392 globals = {'a': 1, 'b': 2}
393 locals = {'b': 200, 'c': 300}
394
395 self.assertEqual(self.__class__.z, 2)
396 globals['z'] = 0
397 execfile(TESTFN, globals)
398 self.assertEqual(globals['z'], 2)
399 locals['z'] = 0
400 execfile(TESTFN, globals, locals)
401 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000402
403 class M:
404 "Test mapping interface versus possible calls from execfile()."
405 def __init__(self):
406 self.z = 10
407 def __getitem__(self, key):
408 if key == 'z':
409 return self.z
410 raise KeyError
411 def __setitem__(self, key, value):
412 if key == 'z':
413 self.z = value
414 return
415 raise KeyError
416
417 locals = M()
418 locals['z'] = 0
419 execfile(TESTFN, globals, locals)
420 self.assertEqual(locals['z'], 2)
421
Walter Dörwald919497e2003-01-19 16:23:59 +0000422 unlink(TESTFN)
423 self.assertRaises(TypeError, execfile)
424 import os
425 self.assertRaises(IOError, execfile, os.curdir)
426 self.assertRaises(IOError, execfile, "I_dont_exist")
427
428 def test_filter(self):
429 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
430 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
431 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
432 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
433 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
434 def identity(item):
435 return 1
436 filter(identity, Squares(5))
437 self.assertRaises(TypeError, filter)
438 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000439 def __getitem__(self, index):
440 if index<4:
441 return 42
442 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000443 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
444 def badfunc():
445 pass
446 self.assertRaises(TypeError, filter, badfunc, range(5))
447
Walter Dörwaldbf517072003-01-27 15:57:14 +0000448 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000449 self.assertEqual(filter(None, (1, 2)), (1, 2))
450 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
451 self.assertRaises(TypeError, filter, 42, (1, 2))
452
Walter Dörwaldbf517072003-01-27 15:57:14 +0000453 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000454 self.assertEqual(filter(None, "12"), "12")
455 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
456 self.assertRaises(TypeError, filter, 42, "12")
457 class badstr(str):
458 def __getitem__(self, index):
459 raise ValueError
460 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000461
Walter Dörwald903f1e02003-02-04 16:28:00 +0000462 class badstr2(str):
463 def __getitem__(self, index):
464 return 42
465 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
466
467 class weirdstr(str):
468 def __getitem__(self, index):
469 return weirdstr(2*str.__getitem__(self, index))
470 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
471
Walter Dörwald5e61e242003-02-04 17:04:01 +0000472 class shiftstr(str):
473 def __getitem__(self, index):
474 return chr(ord(str.__getitem__(self, index))+1)
475 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
476
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000477 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000478 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000479 self.assertEqual(filter(None, unicode("12")), unicode("12"))
480 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
481 self.assertRaises(TypeError, filter, 42, unicode("12"))
482 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000483
Walter Dörwald903f1e02003-02-04 16:28:00 +0000484 class badunicode(unicode):
485 def __getitem__(self, index):
486 return 42
487 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
488
489 class weirdunicode(unicode):
490 def __getitem__(self, index):
491 return weirdunicode(2*unicode.__getitem__(self, index))
492 self.assertEqual(
493 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
494
Walter Dörwald5e61e242003-02-04 17:04:01 +0000495 class shiftunicode(unicode):
496 def __getitem__(self, index):
497 return unichr(ord(unicode.__getitem__(self, index))+1)
498 self.assertEqual(
499 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
500 unicode("345")
501 )
502
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000503 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000504 # test that filter() never returns tuple, str or unicode subclasses
505 # and that the result always goes through __getitem__
506 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000507 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000508 def __getitem__(self, index):
509 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000510 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000511 def __getitem__(self, index):
512 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000513 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000514 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000515 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000516 }
517 if have_unicode:
518 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000519 def __getitem__(self, index):
520 return 2*unicode.__getitem__(self, index)
521 inputs[unicode2] = {
522 unicode(): unicode(),
523 unicode("123"): unicode("112233")
524 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000525
Walter Dörwald1918f772003-02-10 13:19:13 +0000526 for (cls, inps) in inputs.iteritems():
527 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000528 # make sure the output goes through __getitem__
529 # even if func is None
530 self.assertEqual(
531 filter(funcs[0], cls(inp)),
532 filter(funcs[1], cls(inp))
533 )
534 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000535 outp = filter(func, cls(inp))
536 self.assertEqual(outp, exp)
537 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000538
Walter Dörwald919497e2003-01-19 16:23:59 +0000539 def test_float(self):
540 self.assertEqual(float(3.14), 3.14)
541 self.assertEqual(float(314), 314.0)
542 self.assertEqual(float(314L), 314.0)
543 self.assertEqual(float(" 3.14 "), 3.14)
544 if have_unicode:
545 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
546 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
547
548 def test_getattr(self):
549 import sys
550 self.assert_(getattr(sys, 'stdout') is sys.stdout)
551 self.assertRaises(TypeError, getattr, sys, 1)
552 self.assertRaises(TypeError, getattr, sys, 1, "foo")
553 self.assertRaises(TypeError, getattr)
554 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
555
556 def test_hasattr(self):
557 import sys
558 self.assert_(hasattr(sys, 'stdout'))
559 self.assertRaises(TypeError, hasattr, sys, 1)
560 self.assertRaises(TypeError, hasattr)
561 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
562
563 def test_hash(self):
564 hash(None)
565 self.assertEqual(hash(1), hash(1L))
566 self.assertEqual(hash(1), hash(1.0))
567 hash('spam')
568 if have_unicode:
569 self.assertEqual(hash('spam'), hash(unicode('spam')))
570 hash((0,1,2,3))
571 def f(): pass
572 self.assertRaises(TypeError, hash, [])
573 self.assertRaises(TypeError, hash, {})
574
575 def test_hex(self):
576 self.assertEqual(hex(16), '0x10')
577 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000578 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000579 self.assertEqual(hex(-16L), '-0x10L')
580 self.assertRaises(TypeError, hex, {})
581
582 def test_id(self):
583 id(None)
584 id(1)
585 id(1L)
586 id(1.0)
587 id('spam')
588 id((0,1,2,3))
589 id([0,1,2,3])
590 id({'spam': 1, 'eggs': 2, 'ham': 3})
591
592 # Test input() later, together with raw_input
593
594 def test_int(self):
595 self.assertEqual(int(314), 314)
596 self.assertEqual(int(3.14), 3)
597 self.assertEqual(int(314L), 314)
598 # Check that conversion from float truncates towards zero
599 self.assertEqual(int(-3.14), -3)
600 self.assertEqual(int(3.9), 3)
601 self.assertEqual(int(-3.9), -3)
602 self.assertEqual(int(3.5), 3)
603 self.assertEqual(int(-3.5), -3)
604 # Different base:
605 self.assertEqual(int("10",16), 16L)
606 if have_unicode:
607 self.assertEqual(int(unicode("10"),16), 16L)
608 # Test conversion from strings and various anomalies
609 for s, v in L:
610 for sign in "", "+", "-":
611 for prefix in "", " ", "\t", " \t\t ":
612 ss = prefix + sign + s
613 vv = v
614 if sign == "-" and v is not ValueError:
615 vv = -v
616 try:
617 self.assertEqual(int(ss), vv)
618 except v:
619 pass
620
Walter Dörwald70a6b492004-02-12 17:35:32 +0000621 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000622 self.assertEqual(int(s)+1, -sys.maxint)
623 # should return long
624 int(s[1:])
625
626 # should return long
627 x = int(1e100)
628 self.assert_(isinstance(x, long))
629 x = int(-1e100)
630 self.assert_(isinstance(x, long))
631
632
633 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
634 # Worked by accident in Windows release build, but failed in debug build.
635 # Failed in all Linux builds.
636 x = -1-sys.maxint
637 self.assertEqual(x >> 1, x//2)
638
639 self.assertRaises(ValueError, int, '123\0')
640 self.assertRaises(ValueError, int, '53', 40)
641
642 x = int('1' * 600)
643 self.assert_(isinstance(x, long))
644
645 if have_unicode:
646 x = int(unichr(0x661) * 600)
647 self.assert_(isinstance(x, long))
648
649 self.assertRaises(TypeError, int, 1, 12)
650
651 self.assertEqual(int('0123', 0), 83)
652
653 def test_intern(self):
654 self.assertRaises(TypeError, intern)
655 s = "never interned before"
656 self.assert_(intern(s) is s)
657 s2 = s.swapcase().swapcase()
658 self.assert_(intern(s2) is s)
659
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000660 # Subclasses of string can't be interned, because they
661 # provide too much opportunity for insane things to happen.
662 # We don't want them in the interned dict and if they aren't
663 # actually interned, we don't want to create the appearance
664 # that they are by allowing intern() to succeeed.
665 class S(str):
666 def __hash__(self):
667 return 123
668
669 self.assertRaises(TypeError, intern, S("abc"))
670
671 # It's still safe to pass these strings to routines that
672 # call intern internally, e.g. PyObject_SetAttr().
673 s = S("abc")
674 setattr(s, s, s)
675 self.assertEqual(getattr(s, s), s)
676
Walter Dörwald919497e2003-01-19 16:23:59 +0000677 def test_iter(self):
678 self.assertRaises(TypeError, iter)
679 self.assertRaises(TypeError, iter, 42, 42)
680 lists = [("1", "2"), ["1", "2"], "12"]
681 if have_unicode:
682 lists.append(unicode("12"))
683 for l in lists:
684 i = iter(l)
685 self.assertEqual(i.next(), '1')
686 self.assertEqual(i.next(), '2')
687 self.assertRaises(StopIteration, i.next)
688
689 def test_isinstance(self):
690 class C:
691 pass
692 class D(C):
693 pass
694 class E:
695 pass
696 c = C()
697 d = D()
698 e = E()
699 self.assert_(isinstance(c, C))
700 self.assert_(isinstance(d, C))
701 self.assert_(not isinstance(e, C))
702 self.assert_(not isinstance(c, D))
703 self.assert_(not isinstance('foo', E))
704 self.assertRaises(TypeError, isinstance, E, 'foo')
705 self.assertRaises(TypeError, isinstance)
706
707 def test_issubclass(self):
708 class C:
709 pass
710 class D(C):
711 pass
712 class E:
713 pass
714 c = C()
715 d = D()
716 e = E()
717 self.assert_(issubclass(D, C))
718 self.assert_(issubclass(C, C))
719 self.assert_(not issubclass(C, D))
720 self.assertRaises(TypeError, issubclass, 'foo', E)
721 self.assertRaises(TypeError, issubclass, E, 'foo')
722 self.assertRaises(TypeError, issubclass)
723
724 def test_len(self):
725 self.assertEqual(len('123'), 3)
726 self.assertEqual(len(()), 0)
727 self.assertEqual(len((1, 2, 3, 4)), 4)
728 self.assertEqual(len([1, 2, 3, 4]), 4)
729 self.assertEqual(len({}), 0)
730 self.assertEqual(len({'a':1, 'b': 2}), 2)
731 class BadSeq:
732 def __len__(self):
733 raise ValueError
734 self.assertRaises(ValueError, len, BadSeq())
735
736 def test_list(self):
737 self.assertEqual(list([]), [])
738 l0_3 = [0, 1, 2, 3]
739 l0_3_bis = list(l0_3)
740 self.assertEqual(l0_3, l0_3_bis)
741 self.assert_(l0_3 is not l0_3_bis)
742 self.assertEqual(list(()), [])
743 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
744 self.assertEqual(list(''), [])
745 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
746
747 if sys.maxint == 0x7fffffff:
748 # This test can currently only work on 32-bit machines.
749 # XXX If/when PySequence_Length() returns a ssize_t, it should be
750 # XXX re-enabled.
751 # Verify clearing of bug #556025.
752 # This assumes that the max data size (sys.maxint) == max
753 # address size this also assumes that the address size is at
754 # least 4 bytes with 8 byte addresses, the bug is not well
755 # tested
756 #
757 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
758 # earlier due to a newlib bug. See the following mailing list
759 # thread for the details:
760
761 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
762 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
763
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000764 # This code used to segfault in Py2.4a3
765 x = []
766 x.extend(-y for y in x)
767 self.assertEqual(x, [])
768
Walter Dörwald919497e2003-01-19 16:23:59 +0000769 def test_long(self):
770 self.assertEqual(long(314), 314L)
771 self.assertEqual(long(3.14), 3L)
772 self.assertEqual(long(314L), 314L)
773 # Check that conversion from float truncates towards zero
774 self.assertEqual(long(-3.14), -3L)
775 self.assertEqual(long(3.9), 3L)
776 self.assertEqual(long(-3.9), -3L)
777 self.assertEqual(long(3.5), 3L)
778 self.assertEqual(long(-3.5), -3L)
779 self.assertEqual(long("-3"), -3L)
780 if have_unicode:
781 self.assertEqual(long(unicode("-3")), -3L)
782 # Different base:
783 self.assertEqual(long("10",16), 16L)
784 if have_unicode:
785 self.assertEqual(long(unicode("10"),16), 16L)
786 # Check conversions from string (same test set as for int(), and then some)
787 LL = [
788 ('1' + '0'*20, 10L**20),
789 ('1' + '0'*100, 10L**100)
790 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000791 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000792 if have_unicode:
793 L2 += [
794 (unicode('1') + unicode('0')*20, 10L**20),
795 (unicode('1') + unicode('0')*100, 10L**100),
796 ]
797 for s, v in L2 + LL:
798 for sign in "", "+", "-":
799 for prefix in "", " ", "\t", " \t\t ":
800 ss = prefix + sign + s
801 vv = v
802 if sign == "-" and v is not ValueError:
803 vv = -v
804 try:
805 self.assertEqual(long(ss), long(vv))
806 except v:
807 pass
808
809 self.assertRaises(ValueError, long, '123\0')
810 self.assertRaises(ValueError, long, '53', 40)
811 self.assertRaises(TypeError, long, 1, 12)
812
813 def test_map(self):
814 self.assertEqual(
815 map(None, 'hello world'),
816 ['h','e','l','l','o',' ','w','o','r','l','d']
817 )
818 self.assertEqual(
819 map(None, 'abcd', 'efg'),
820 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
821 )
822 self.assertEqual(
823 map(None, range(10)),
824 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
825 )
826 self.assertEqual(
827 map(lambda x: x*x, range(1,4)),
828 [1, 4, 9]
829 )
830 try:
831 from math import sqrt
832 except ImportError:
833 def sqrt(x):
834 return pow(x, 0.5)
835 self.assertEqual(
836 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
837 [[4.0, 2.0], [9.0, 3.0]]
838 )
839 self.assertEqual(
840 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
841 [10, 4, 6]
842 )
843
844 def plus(*v):
845 accu = 0
846 for i in v: accu = accu + i
847 return accu
848 self.assertEqual(
849 map(plus, [1, 3, 7]),
850 [1, 3, 7]
851 )
852 self.assertEqual(
853 map(plus, [1, 3, 7], [4, 9, 2]),
854 [1+4, 3+9, 7+2]
855 )
856 self.assertEqual(
857 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
858 [1+4+1, 3+9+1, 7+2+0]
859 )
860 self.assertEqual(
861 map(None, Squares(10)),
862 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
863 )
864 self.assertEqual(
865 map(int, Squares(10)),
866 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
867 )
868 self.assertEqual(
869 map(None, Squares(3), Squares(2)),
870 [(0,0), (1,1), (4,None)]
871 )
872 self.assertEqual(
873 map(max, Squares(3), Squares(2)),
874 [0, 1, 4]
875 )
876 self.assertRaises(TypeError, map)
877 self.assertRaises(TypeError, map, lambda x: x, 42)
878 self.assertEqual(map(None, [42]), [42])
879 class BadSeq:
880 def __getitem__(self, index):
881 raise ValueError
882 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
883
884 def test_max(self):
885 self.assertEqual(max('123123'), '3')
886 self.assertEqual(max(1, 2, 3), 3)
887 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
888 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
889
890 self.assertEqual(max(1, 2L, 3.0), 3.0)
891 self.assertEqual(max(1L, 2.0, 3), 3)
892 self.assertEqual(max(1.0, 2, 3L), 3L)
893
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000894 for stmt in (
895 "max(key=int)", # no args
896 "max(1, key=int)", # single arg not iterable
897 "max(1, 2, keystone=int)", # wrong keyword
898 "max(1, 2, key=int, abc=int)", # two many keywords
899 "max(1, 2, key=1)", # keyfunc is not callable
900 ):
Tim Peters7f061872004-12-07 21:17:46 +0000901 try:
902 exec(stmt) in globals()
903 except TypeError:
904 pass
905 else:
906 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000907
908 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
909 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
910 self.assertEqual(max(1, 2, key=neg), 1) # two elems
911
912 data = [random.randrange(200) for i in range(100)]
913 keys = dict((elem, random.randrange(50)) for elem in data)
914 f = keys.__getitem__
915 self.assertEqual(max(data, key=f),
916 sorted(reversed(data), key=f)[-1])
917
Walter Dörwald919497e2003-01-19 16:23:59 +0000918 def test_min(self):
919 self.assertEqual(min('123123'), '1')
920 self.assertEqual(min(1, 2, 3), 1)
921 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
922 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
923
924 self.assertEqual(min(1, 2L, 3.0), 1)
925 self.assertEqual(min(1L, 2.0, 3), 1L)
926 self.assertEqual(min(1.0, 2, 3L), 1.0)
927
928 self.assertRaises(TypeError, min)
929 self.assertRaises(TypeError, min, 42)
930 self.assertRaises(ValueError, min, ())
931 class BadSeq:
932 def __getitem__(self, index):
933 raise ValueError
934 self.assertRaises(ValueError, min, BadSeq())
935 class BadNumber:
936 def __cmp__(self, other):
937 raise ValueError
938 self.assertRaises(ValueError, min, (42, BadNumber()))
939
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000940 for stmt in (
941 "min(key=int)", # no args
942 "min(1, key=int)", # single arg not iterable
943 "min(1, 2, keystone=int)", # wrong keyword
944 "min(1, 2, key=int, abc=int)", # two many keywords
945 "min(1, 2, key=1)", # keyfunc is not callable
946 ):
Tim Peters7f061872004-12-07 21:17:46 +0000947 try:
948 exec(stmt) in globals()
949 except TypeError:
950 pass
951 else:
952 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000953
954 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
955 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
956 self.assertEqual(min(1, 2, key=neg), 2) # two elems
957
958 data = [random.randrange(200) for i in range(100)]
959 keys = dict((elem, random.randrange(50)) for elem in data)
960 f = keys.__getitem__
961 self.assertEqual(min(data, key=f),
962 sorted(data, key=f)[0])
963
Walter Dörwald919497e2003-01-19 16:23:59 +0000964 def test_oct(self):
965 self.assertEqual(oct(100), '0144')
966 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000967 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000968 self.assertEqual(oct(-100L), '-0144L')
969 self.assertRaises(TypeError, oct, ())
970
971 def write_testfile(self):
972 # NB the first 4 lines are also used to test input and raw_input, below
973 fp = open(TESTFN, 'w')
974 try:
975 fp.write('1+1\n')
976 fp.write('1+1\n')
977 fp.write('The quick brown fox jumps over the lazy dog')
978 fp.write('.\n')
979 fp.write('Dear John\n')
980 fp.write('XXX'*100)
981 fp.write('YYY'*100)
982 finally:
983 fp.close()
984
985 def test_open(self):
986 self.write_testfile()
987 fp = open(TESTFN, 'r')
988 try:
989 self.assertEqual(fp.readline(4), '1+1\n')
990 self.assertEqual(fp.readline(4), '1+1\n')
991 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
992 self.assertEqual(fp.readline(4), 'Dear')
993 self.assertEqual(fp.readline(100), ' John\n')
994 self.assertEqual(fp.read(300), 'XXX'*100)
995 self.assertEqual(fp.read(1000), 'YYY'*100)
996 finally:
997 fp.close()
998 unlink(TESTFN)
999
1000 def test_ord(self):
1001 self.assertEqual(ord(' '), 32)
1002 self.assertEqual(ord('A'), 65)
1003 self.assertEqual(ord('a'), 97)
1004 if have_unicode:
1005 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1006 self.assertRaises(TypeError, ord, 42)
1007 self.assertRaises(TypeError, ord, unicode("12"))
1008
1009 def test_pow(self):
1010 self.assertEqual(pow(0,0), 1)
1011 self.assertEqual(pow(0,1), 0)
1012 self.assertEqual(pow(1,0), 1)
1013 self.assertEqual(pow(1,1), 1)
1014
1015 self.assertEqual(pow(2,0), 1)
1016 self.assertEqual(pow(2,10), 1024)
1017 self.assertEqual(pow(2,20), 1024*1024)
1018 self.assertEqual(pow(2,30), 1024*1024*1024)
1019
1020 self.assertEqual(pow(-2,0), 1)
1021 self.assertEqual(pow(-2,1), -2)
1022 self.assertEqual(pow(-2,2), 4)
1023 self.assertEqual(pow(-2,3), -8)
1024
1025 self.assertEqual(pow(0L,0), 1)
1026 self.assertEqual(pow(0L,1), 0)
1027 self.assertEqual(pow(1L,0), 1)
1028 self.assertEqual(pow(1L,1), 1)
1029
1030 self.assertEqual(pow(2L,0), 1)
1031 self.assertEqual(pow(2L,10), 1024)
1032 self.assertEqual(pow(2L,20), 1024*1024)
1033 self.assertEqual(pow(2L,30), 1024*1024*1024)
1034
1035 self.assertEqual(pow(-2L,0), 1)
1036 self.assertEqual(pow(-2L,1), -2)
1037 self.assertEqual(pow(-2L,2), 4)
1038 self.assertEqual(pow(-2L,3), -8)
1039
1040 self.assertAlmostEqual(pow(0.,0), 1.)
1041 self.assertAlmostEqual(pow(0.,1), 0.)
1042 self.assertAlmostEqual(pow(1.,0), 1.)
1043 self.assertAlmostEqual(pow(1.,1), 1.)
1044
1045 self.assertAlmostEqual(pow(2.,0), 1.)
1046 self.assertAlmostEqual(pow(2.,10), 1024.)
1047 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1048 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1049
1050 self.assertAlmostEqual(pow(-2.,0), 1.)
1051 self.assertAlmostEqual(pow(-2.,1), -2.)
1052 self.assertAlmostEqual(pow(-2.,2), 4.)
1053 self.assertAlmostEqual(pow(-2.,3), -8.)
1054
1055 for x in 2, 2L, 2.0:
1056 for y in 10, 10L, 10.0:
1057 for z in 1000, 1000L, 1000.0:
1058 if isinstance(x, float) or \
1059 isinstance(y, float) or \
1060 isinstance(z, float):
1061 self.assertRaises(TypeError, pow, x, y, z)
1062 else:
1063 self.assertAlmostEqual(pow(x, y, z), 24.0)
1064
1065 self.assertRaises(TypeError, pow, -1, -2, 3)
1066 self.assertRaises(ValueError, pow, 1, 2, 0)
1067 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1068 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1069 self.assertRaises(ValueError, pow, -342.43, 0.234)
1070
1071 self.assertRaises(TypeError, pow)
1072
1073 def test_range(self):
1074 self.assertEqual(range(3), [0, 1, 2])
1075 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1076 self.assertEqual(range(0), [])
1077 self.assertEqual(range(-3), [])
1078 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1079 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1080
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001081 # Now test range() with longs
1082 self.assertEqual(range(-2**100), [])
1083 self.assertEqual(range(0, -2**100), [])
1084 self.assertEqual(range(0, 2**100, -1), [])
1085 self.assertEqual(range(0, 2**100, -1), [])
1086
1087 a = long(10 * sys.maxint)
1088 b = long(100 * sys.maxint)
1089 c = long(50 * sys.maxint)
1090
1091 self.assertEqual(range(a, a+2), [a, a+1])
1092 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1093 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1094
1095 seq = range(a, b, c)
1096 self.assert_(a in seq)
1097 self.assert_(b not in seq)
1098 self.assertEqual(len(seq), 2)
1099
1100 seq = range(b, a, -c)
1101 self.assert_(b in seq)
1102 self.assert_(a not in seq)
1103 self.assertEqual(len(seq), 2)
1104
1105 seq = range(-a, -b, -c)
1106 self.assert_(-a in seq)
1107 self.assert_(-b not in seq)
1108 self.assertEqual(len(seq), 2)
1109
Walter Dörwald919497e2003-01-19 16:23:59 +00001110 self.assertRaises(TypeError, range)
1111 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1112 self.assertRaises(ValueError, range, 1, 2, 0)
1113
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001114 # Reject floats when it would require PyLongs to represent.
1115 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001116 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001117
Walter Dörwald357981e2003-04-15 18:59:28 +00001118 self.assertRaises(TypeError, range, 0, "spam")
1119 self.assertRaises(TypeError, range, 0, 42, "spam")
1120
1121 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1122 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1123
Walter Dörwald919497e2003-01-19 16:23:59 +00001124 def test_input_and_raw_input(self):
1125 self.write_testfile()
1126 fp = open(TESTFN, 'r')
1127 savestdin = sys.stdin
1128 savestdout = sys.stdout # Eats the echo
1129 try:
1130 sys.stdin = fp
1131 sys.stdout = BitBucket()
1132 self.assertEqual(input(), 2)
1133 self.assertEqual(input('testing\n'), 2)
1134 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1135 self.assertEqual(raw_input('testing\n'), 'Dear John')
1136 sys.stdin = cStringIO.StringIO("NULL\0")
1137 self.assertRaises(TypeError, input, 42, 42)
1138 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1139 self.assertEqual(input(), 'whitespace')
1140 sys.stdin = cStringIO.StringIO()
1141 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001142
1143 # SF 876178: make sure input() respect future options.
1144 sys.stdin = cStringIO.StringIO('1/2')
1145 sys.stdout = cStringIO.StringIO()
1146 exec compile('print input()', 'test_builtin_tmp', 'exec')
1147 sys.stdin.seek(0, 0)
1148 exec compile('from __future__ import division;print input()',
1149 'test_builtin_tmp', 'exec')
1150 sys.stdin.seek(0, 0)
1151 exec compile('print input()', 'test_builtin_tmp', 'exec')
1152 self.assertEqual(sys.stdout.getvalue().splitlines(),
1153 ['0', '0.5', '0'])
1154
Walter Dörwald919497e2003-01-19 16:23:59 +00001155 del sys.stdout
1156 self.assertRaises(RuntimeError, input, 'prompt')
1157 del sys.stdin
1158 self.assertRaises(RuntimeError, input, 'prompt')
1159 finally:
1160 sys.stdin = savestdin
1161 sys.stdout = savestdout
1162 fp.close()
1163 unlink(TESTFN)
1164
1165 def test_reduce(self):
1166 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1167 self.assertEqual(
1168 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1169 ['a','c','d','w']
1170 )
1171 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1172 self.assertEqual(
1173 reduce(lambda x, y: x*y, range(2,21), 1L),
1174 2432902008176640000L
1175 )
1176 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1177 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1178 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1179 self.assertRaises(TypeError, reduce)
1180 self.assertRaises(TypeError, reduce, 42, 42)
1181 self.assertRaises(TypeError, reduce, 42, 42, 42)
1182 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1183 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1184 self.assertRaises(TypeError, reduce, 42, (42, 42))
1185
1186 class BadSeq:
1187 def __getitem__(self, index):
1188 raise ValueError
1189 self.assertRaises(ValueError, reduce, 42, BadSeq())
1190
1191 def test_reload(self):
1192 import marshal
1193 reload(marshal)
1194 import string
1195 reload(string)
1196 ## import sys
1197 ## self.assertRaises(ImportError, reload, sys)
1198
1199 def test_repr(self):
1200 self.assertEqual(repr(''), '\'\'')
1201 self.assertEqual(repr(0), '0')
1202 self.assertEqual(repr(0L), '0L')
1203 self.assertEqual(repr(()), '()')
1204 self.assertEqual(repr([]), '[]')
1205 self.assertEqual(repr({}), '{}')
1206 a = []
1207 a.append(a)
1208 self.assertEqual(repr(a), '[[...]]')
1209 a = {}
1210 a[0] = a
1211 self.assertEqual(repr(a), '{0: {...}}')
1212
1213 def test_round(self):
1214 self.assertEqual(round(0.0), 0.0)
1215 self.assertEqual(round(1.0), 1.0)
1216 self.assertEqual(round(10.0), 10.0)
1217 self.assertEqual(round(1000000000.0), 1000000000.0)
1218 self.assertEqual(round(1e20), 1e20)
1219
1220 self.assertEqual(round(-1.0), -1.0)
1221 self.assertEqual(round(-10.0), -10.0)
1222 self.assertEqual(round(-1000000000.0), -1000000000.0)
1223 self.assertEqual(round(-1e20), -1e20)
1224
1225 self.assertEqual(round(0.1), 0.0)
1226 self.assertEqual(round(1.1), 1.0)
1227 self.assertEqual(round(10.1), 10.0)
1228 self.assertEqual(round(1000000000.1), 1000000000.0)
1229
1230 self.assertEqual(round(-1.1), -1.0)
1231 self.assertEqual(round(-10.1), -10.0)
1232 self.assertEqual(round(-1000000000.1), -1000000000.0)
1233
1234 self.assertEqual(round(0.9), 1.0)
1235 self.assertEqual(round(9.9), 10.0)
1236 self.assertEqual(round(999999999.9), 1000000000.0)
1237
1238 self.assertEqual(round(-0.9), -1.0)
1239 self.assertEqual(round(-9.9), -10.0)
1240 self.assertEqual(round(-999999999.9), -1000000000.0)
1241
1242 self.assertEqual(round(-8.0, -1), -10.0)
1243
1244 self.assertRaises(TypeError, round)
1245
1246 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001247 setattr(sys, 'spam', 1)
1248 self.assertEqual(sys.spam, 1)
1249 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1250 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001251
1252 def test_str(self):
1253 self.assertEqual(str(''), '')
1254 self.assertEqual(str(0), '0')
1255 self.assertEqual(str(0L), '0')
1256 self.assertEqual(str(()), '()')
1257 self.assertEqual(str([]), '[]')
1258 self.assertEqual(str({}), '{}')
1259 a = []
1260 a.append(a)
1261 self.assertEqual(str(a), '[[...]]')
1262 a = {}
1263 a[0] = a
1264 self.assertEqual(str(a), '{0: {...}}')
1265
Alex Martellia70b1912003-04-22 08:12:33 +00001266 def test_sum(self):
1267 self.assertEqual(sum([]), 0)
1268 self.assertEqual(sum(range(2,8)), 27)
1269 self.assertEqual(sum(iter(range(2,8))), 27)
1270 self.assertEqual(sum(Squares(10)), 285)
1271 self.assertEqual(sum(iter(Squares(10))), 285)
1272 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1273
1274 self.assertRaises(TypeError, sum)
1275 self.assertRaises(TypeError, sum, 42)
1276 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1277 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1278 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1279 self.assertRaises(TypeError, sum, [{2:3}])
1280 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1281
1282 class BadSeq:
1283 def __getitem__(self, index):
1284 raise ValueError
1285 self.assertRaises(ValueError, sum, BadSeq())
1286
Walter Dörwald919497e2003-01-19 16:23:59 +00001287 def test_tuple(self):
1288 self.assertEqual(tuple(()), ())
1289 t0_3 = (0, 1, 2, 3)
1290 t0_3_bis = tuple(t0_3)
1291 self.assert_(t0_3 is t0_3_bis)
1292 self.assertEqual(tuple([]), ())
1293 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1294 self.assertEqual(tuple(''), ())
1295 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1296
1297 def test_type(self):
1298 self.assertEqual(type(''), type('123'))
1299 self.assertNotEqual(type(''), type(()))
1300
1301 def test_unichr(self):
1302 if have_unicode:
1303 self.assertEqual(unichr(32), unicode(' '))
1304 self.assertEqual(unichr(65), unicode('A'))
1305 self.assertEqual(unichr(97), unicode('a'))
1306 self.assertEqual(
1307 unichr(sys.maxunicode),
1308 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1309 )
1310 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1311 self.assertRaises(TypeError, unichr)
1312
Guido van Rossumfee7b932005-01-16 00:21:28 +00001313 # We don't want self in vars(), so these are static methods
1314
1315 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001316 def get_vars_f0():
1317 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001318
Guido van Rossumfee7b932005-01-16 00:21:28 +00001319 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001320 def get_vars_f2():
1321 BuiltinTest.get_vars_f0()
1322 a = 1
1323 b = 2
1324 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001325
1326 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001327 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001328 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001329 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001330 self.assertEqual(self.get_vars_f0(), {})
1331 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1332 self.assertRaises(TypeError, vars, 42, 42)
1333 self.assertRaises(TypeError, vars, 42)
1334
1335 def test_zip(self):
1336 a = (1, 2, 3)
1337 b = (4, 5, 6)
1338 t = [(1, 4), (2, 5), (3, 6)]
1339 self.assertEqual(zip(a, b), t)
1340 b = [4, 5, 6]
1341 self.assertEqual(zip(a, b), t)
1342 b = (4, 5, 6, 7)
1343 self.assertEqual(zip(a, b), t)
1344 class I:
1345 def __getitem__(self, i):
1346 if i < 0 or i > 2: raise IndexError
1347 return i + 4
1348 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001349 self.assertEqual(zip(), [])
1350 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001351 self.assertRaises(TypeError, zip, None)
1352 class G:
1353 pass
1354 self.assertRaises(TypeError, zip, a, G())
1355
1356 # Make sure zip doesn't try to allocate a billion elements for the
1357 # result list when one of its arguments doesn't say how long it is.
1358 # A MemoryError is the most likely failure mode.
1359 class SequenceWithoutALength:
1360 def __getitem__(self, i):
1361 if i == 5:
1362 raise IndexError
1363 else:
1364 return i
1365 self.assertEqual(
1366 zip(SequenceWithoutALength(), xrange(2**30)),
1367 list(enumerate(range(5)))
1368 )
1369
1370 class BadSeq:
1371 def __getitem__(self, i):
1372 if i == 5:
1373 raise ValueError
1374 else:
1375 return i
1376 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1377
Raymond Hettinger64958a12003-12-17 20:43:33 +00001378class TestSorted(unittest.TestCase):
1379
1380 def test_basic(self):
1381 data = range(100)
1382 copy = data[:]
1383 random.shuffle(copy)
1384 self.assertEqual(data, sorted(copy))
1385 self.assertNotEqual(data, copy)
1386
1387 data.reverse()
1388 random.shuffle(copy)
1389 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1390 self.assertNotEqual(data, copy)
1391 random.shuffle(copy)
1392 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1393 self.assertNotEqual(data, copy)
1394 random.shuffle(copy)
1395 self.assertEqual(data, sorted(copy, reverse=1))
1396 self.assertNotEqual(data, copy)
1397
1398 def test_inputtypes(self):
1399 s = 'abracadabra'
1400 for T in [unicode, list, tuple]:
1401 self.assertEqual(sorted(s), sorted(T(s)))
1402
1403 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
1404 for T in [unicode, set, frozenset, list, tuple, dict.fromkeys]:
1405 self.assertEqual(sorted(s), sorted(T(s)))
1406
1407 def test_baddecorator(self):
1408 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1409 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1410
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001411def test_main(verbose=None):
1412 test_classes = (BuiltinTest, TestSorted)
1413
1414 run_unittest(*test_classes)
1415
1416 # verify reference counting
1417 if verbose and hasattr(sys, "gettotalrefcount"):
1418 import gc
1419 counts = [None] * 5
1420 for i in xrange(len(counts)):
1421 run_unittest(*test_classes)
1422 gc.collect()
1423 counts[i] = sys.gettotalrefcount()
1424 print counts
1425
Walter Dörwald919497e2003-01-19 16:23:59 +00001426
1427if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001428 test_main(verbose=True)