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