blob: 6f11fdd6cba0cd8590f12b0775fc999ed0170971 [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_callable(self):
157 self.assert_(callable(len))
158 def f(): pass
159 self.assert_(callable(f))
160 class C:
161 def meth(self): pass
162 self.assert_(callable(C))
163 x = C()
164 self.assert_(callable(x.meth))
165 self.assert_(not callable(x))
166 class D(C):
167 def __call__(self): pass
168 y = D()
169 self.assert_(callable(y))
170 y()
171
172 def test_chr(self):
173 self.assertEqual(chr(32), ' ')
174 self.assertEqual(chr(65), 'A')
175 self.assertEqual(chr(97), 'a')
176 self.assertEqual(chr(0xff), '\xff')
177 self.assertRaises(ValueError, chr, 256)
178 self.assertRaises(TypeError, chr)
179
180 def test_cmp(self):
181 self.assertEqual(cmp(-1, 1), -1)
182 self.assertEqual(cmp(1, -1), 1)
183 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000184 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000185 a = []; a.append(a)
186 b = []; b.append(b)
187 from UserList import UserList
188 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000189 self.assertRaises(RuntimeError, cmp, a, b)
190 self.assertRaises(RuntimeError, cmp, b, c)
191 self.assertRaises(RuntimeError, cmp, c, a)
192 self.assertRaises(RuntimeError, cmp, a, c)
193 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000194 a.pop(); b.pop(); c.pop()
195 self.assertRaises(TypeError, cmp)
196
197 def test_coerce(self):
198 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
199 self.assertEqual(coerce(1, 1L), (1L, 1L))
200 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
201 self.assertRaises(TypeError, coerce)
202 class BadNumber:
203 def __coerce__(self, other):
204 raise ValueError
205 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000206 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000207
208 def test_compile(self):
209 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000210 bom = '\xef\xbb\xbf'
211 compile(bom + 'print 1\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000212 self.assertRaises(TypeError, compile)
213 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
214 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000215 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000216 if have_unicode:
217 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000218 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
219 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000220
Walter Dörwald919497e2003-01-19 16:23:59 +0000221 def test_delattr(self):
222 import sys
223 sys.spam = 1
224 delattr(sys, 'spam')
225 self.assertRaises(TypeError, delattr)
226
227 def test_dir(self):
228 x = 1
229 self.assert_('x' in dir())
230 import sys
231 self.assert_('modules' in dir(sys))
232 self.assertRaises(TypeError, dir, 42, 42)
233
234 def test_divmod(self):
235 self.assertEqual(divmod(12, 7), (1, 5))
236 self.assertEqual(divmod(-12, 7), (-2, 2))
237 self.assertEqual(divmod(12, -7), (-2, -2))
238 self.assertEqual(divmod(-12, -7), (1, -5))
239
240 self.assertEqual(divmod(12L, 7L), (1L, 5L))
241 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
242 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
243 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
244
245 self.assertEqual(divmod(12, 7L), (1, 5L))
246 self.assertEqual(divmod(-12, 7L), (-2, 2L))
247 self.assertEqual(divmod(12L, -7), (-2L, -2))
248 self.assertEqual(divmod(-12L, -7), (1L, -5))
249
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000250 self.assertEqual(divmod(-sys.maxint-1, -1),
251 (sys.maxint+1, 0))
252
Walter Dörwald919497e2003-01-19 16:23:59 +0000253 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
254 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
255 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
256 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
257
258 self.assertRaises(TypeError, divmod)
259
260 def test_eval(self):
261 self.assertEqual(eval('1+1'), 2)
262 self.assertEqual(eval(' 1+1\n'), 2)
263 globals = {'a': 1, 'b': 2}
264 locals = {'b': 200, 'c': 300}
265 self.assertEqual(eval('a', globals) , 1)
266 self.assertEqual(eval('a', globals, locals), 1)
267 self.assertEqual(eval('b', globals, locals), 200)
268 self.assertEqual(eval('c', globals, locals), 300)
269 if have_unicode:
270 self.assertEqual(eval(unicode('1+1')), 2)
271 self.assertEqual(eval(unicode(' 1+1\n')), 2)
272 globals = {'a': 1, 'b': 2}
273 locals = {'b': 200, 'c': 300}
274 if have_unicode:
275 self.assertEqual(eval(unicode('a'), globals), 1)
276 self.assertEqual(eval(unicode('a'), globals, locals), 1)
277 self.assertEqual(eval(unicode('b'), globals, locals), 200)
278 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000279 bom = '\xef\xbb\xbf'
280 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000281 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
282 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000283 self.assertRaises(TypeError, eval)
284 self.assertRaises(TypeError, eval, ())
285
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000286 def test_general_eval(self):
287 # Tests that general mappings can be used for the locals argument
288
289 class M:
290 "Test mapping interface versus possible calls from eval()."
291 def __getitem__(self, key):
292 if key == 'a':
293 return 12
294 raise KeyError
295 def keys(self):
296 return list('xyz')
297
298 m = M()
299 g = globals()
300 self.assertEqual(eval('a', g, m), 12)
301 self.assertRaises(NameError, eval, 'b', g, m)
302 self.assertEqual(eval('dir()', g, m), list('xyz'))
303 self.assertEqual(eval('globals()', g, m), g)
304 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000305 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000306 class A:
307 "Non-mapping"
308 pass
309 m = A()
310 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000311
312 # Verify that dict subclasses work as well
313 class D(dict):
314 def __getitem__(self, key):
315 if key == 'a':
316 return 12
317 return dict.__getitem__(self, key)
318 def keys(self):
319 return list('xyz')
320
321 d = D()
322 self.assertEqual(eval('a', g, d), 12)
323 self.assertRaises(NameError, eval, 'b', g, d)
324 self.assertEqual(eval('dir()', g, d), list('xyz'))
325 self.assertEqual(eval('globals()', g, d), g)
326 self.assertEqual(eval('locals()', g, d), d)
327
328 # Verify locals stores (used by list comps)
329 eval('[locals() for i in (2,3)]', g, d)
330 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
331
332 class SpreadSheet:
333 "Sample application showing nested, calculated lookups."
334 _cells = {}
335 def __setitem__(self, key, formula):
336 self._cells[key] = formula
337 def __getitem__(self, key ):
338 return eval(self._cells[key], globals(), self)
339
340 ss = SpreadSheet()
341 ss['a1'] = '5'
342 ss['a2'] = 'a1*6'
343 ss['a3'] = 'a2*7'
344 self.assertEqual(ss['a3'], 210)
345
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000346 # Verify that dir() catches a non-list returned by eval
347 # SF bug #1004669
348 class C:
349 def __getitem__(self, item):
350 raise KeyError(item)
351 def keys(self):
352 return 'a'
353 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
354
Walter Dörwald919497e2003-01-19 16:23:59 +0000355 # Done outside of the method test_z to get the correct scope
356 z = 0
357 f = open(TESTFN, 'w')
358 f.write('z = z+1\n')
359 f.write('z = z*2\n')
360 f.close()
361 execfile(TESTFN)
362
363 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000364 global numruns
365 if numruns:
366 return
367 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000368
Walter Dörwald919497e2003-01-19 16:23:59 +0000369 globals = {'a': 1, 'b': 2}
370 locals = {'b': 200, 'c': 300}
371
372 self.assertEqual(self.__class__.z, 2)
373 globals['z'] = 0
374 execfile(TESTFN, globals)
375 self.assertEqual(globals['z'], 2)
376 locals['z'] = 0
377 execfile(TESTFN, globals, locals)
378 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000379
380 class M:
381 "Test mapping interface versus possible calls from execfile()."
382 def __init__(self):
383 self.z = 10
384 def __getitem__(self, key):
385 if key == 'z':
386 return self.z
387 raise KeyError
388 def __setitem__(self, key, value):
389 if key == 'z':
390 self.z = value
391 return
392 raise KeyError
393
394 locals = M()
395 locals['z'] = 0
396 execfile(TESTFN, globals, locals)
397 self.assertEqual(locals['z'], 2)
398
Walter Dörwald919497e2003-01-19 16:23:59 +0000399 unlink(TESTFN)
400 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000401 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000402 import os
403 self.assertRaises(IOError, execfile, os.curdir)
404 self.assertRaises(IOError, execfile, "I_dont_exist")
405
406 def test_filter(self):
407 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
408 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
409 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
410 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
411 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
412 def identity(item):
413 return 1
414 filter(identity, Squares(5))
415 self.assertRaises(TypeError, filter)
416 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000417 def __getitem__(self, index):
418 if index<4:
419 return 42
420 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000421 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
422 def badfunc():
423 pass
424 self.assertRaises(TypeError, filter, badfunc, range(5))
425
Walter Dörwaldbf517072003-01-27 15:57:14 +0000426 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000427 self.assertEqual(filter(None, (1, 2)), (1, 2))
428 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
429 self.assertRaises(TypeError, filter, 42, (1, 2))
430
Walter Dörwaldbf517072003-01-27 15:57:14 +0000431 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000432 self.assertEqual(filter(None, "12"), "12")
433 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
434 self.assertRaises(TypeError, filter, 42, "12")
435 class badstr(str):
436 def __getitem__(self, index):
437 raise ValueError
438 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000439
Walter Dörwald903f1e02003-02-04 16:28:00 +0000440 class badstr2(str):
441 def __getitem__(self, index):
442 return 42
443 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
444
445 class weirdstr(str):
446 def __getitem__(self, index):
447 return weirdstr(2*str.__getitem__(self, index))
448 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
449
Walter Dörwald5e61e242003-02-04 17:04:01 +0000450 class shiftstr(str):
451 def __getitem__(self, index):
452 return chr(ord(str.__getitem__(self, index))+1)
453 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
454
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000455 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000456 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000457 self.assertEqual(filter(None, unicode("12")), unicode("12"))
458 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
459 self.assertRaises(TypeError, filter, 42, unicode("12"))
460 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000461
Walter Dörwald903f1e02003-02-04 16:28:00 +0000462 class badunicode(unicode):
463 def __getitem__(self, index):
464 return 42
465 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
466
467 class weirdunicode(unicode):
468 def __getitem__(self, index):
469 return weirdunicode(2*unicode.__getitem__(self, index))
470 self.assertEqual(
471 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
472
Walter Dörwald5e61e242003-02-04 17:04:01 +0000473 class shiftunicode(unicode):
474 def __getitem__(self, index):
475 return unichr(ord(unicode.__getitem__(self, index))+1)
476 self.assertEqual(
477 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
478 unicode("345")
479 )
480
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000481 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000482 # test that filter() never returns tuple, str or unicode subclasses
483 # and that the result always goes through __getitem__
484 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000485 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000486 def __getitem__(self, index):
487 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000488 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000489 def __getitem__(self, index):
490 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000491 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000492 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000493 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000494 }
495 if have_unicode:
496 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000497 def __getitem__(self, index):
498 return 2*unicode.__getitem__(self, index)
499 inputs[unicode2] = {
500 unicode(): unicode(),
501 unicode("123"): unicode("112233")
502 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000503
Walter Dörwald1918f772003-02-10 13:19:13 +0000504 for (cls, inps) in inputs.iteritems():
505 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000506 # make sure the output goes through __getitem__
507 # even if func is None
508 self.assertEqual(
509 filter(funcs[0], cls(inp)),
510 filter(funcs[1], cls(inp))
511 )
512 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000513 outp = filter(func, cls(inp))
514 self.assertEqual(outp, exp)
515 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000516
Walter Dörwald919497e2003-01-19 16:23:59 +0000517 def test_float(self):
518 self.assertEqual(float(3.14), 3.14)
519 self.assertEqual(float(314), 314.0)
520 self.assertEqual(float(314L), 314.0)
521 self.assertEqual(float(" 3.14 "), 3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000522 self.assertRaises(ValueError, float, " 0x3.1 ")
523 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Walter Dörwald919497e2003-01-19 16:23:59 +0000524 if have_unicode:
525 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
526 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
Walter Dörwaldede187f2005-11-29 15:45:14 +0000527 # Implementation limitation in PyFloat_FromString()
528 self.assertRaises(ValueError, float, unicode("1"*10000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000529
Neal Norwitz5898fa22005-11-22 05:17:40 +0000530 def test_float_with_comma(self):
531 # set locale to something that doesn't use '.' for the decimal point
532 try:
533 import locale
Georg Brandled1e4972006-01-09 22:36:58 +0000534 orig_locale = locale.setlocale(locale.LC_NUMERIC)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000535 locale.setlocale(locale.LC_NUMERIC, 'fr_FR')
536 except:
537 # if we can't set the locale, just ignore this test
538 return
539
540 try:
541 self.assertEqual(locale.localeconv()['decimal_point'], ',')
542 except:
543 # this test is worthless, just skip it and reset the locale
544 locale.setlocale(locale.LC_NUMERIC, orig_locale)
545 return
546
547 try:
548 self.assertEqual(float(" 3,14 "), 3.14)
549 self.assertEqual(float(" +3,14 "), 3.14)
550 self.assertEqual(float(" -3,14 "), -3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000551 self.assertRaises(ValueError, float, " 0x3.1 ")
552 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Neal Norwitz5898fa22005-11-22 05:17:40 +0000553 self.assertEqual(float(" 25.e-1 "), 2.5)
554 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
555 finally:
556 locale.setlocale(locale.LC_NUMERIC, orig_locale)
557
Brett Cannonc3647ac2005-04-26 03:45:26 +0000558 def test_floatconversion(self):
559 # Make sure that calls to __float__() work properly
560 class Foo0:
561 def __float__(self):
562 return 42.
563
564 class Foo1(object):
565 def __float__(self):
566 return 42.
567
568 class Foo2(float):
569 def __float__(self):
570 return 42.
571
572 class Foo3(float):
573 def __new__(cls, value=0.):
574 return float.__new__(cls, 2*value)
575
576 def __float__(self):
577 return self
578
579 class Foo4(float):
580 def __float__(self):
581 return 42
582
583 self.assertAlmostEqual(float(Foo0()), 42.)
584 self.assertAlmostEqual(float(Foo1()), 42.)
585 self.assertAlmostEqual(float(Foo2()), 42.)
586 self.assertAlmostEqual(float(Foo3(21)), 42.)
587 self.assertRaises(TypeError, float, Foo4(42))
588
Walter Dörwald919497e2003-01-19 16:23:59 +0000589 def test_getattr(self):
590 import sys
591 self.assert_(getattr(sys, 'stdout') is sys.stdout)
592 self.assertRaises(TypeError, getattr, sys, 1)
593 self.assertRaises(TypeError, getattr, sys, 1, "foo")
594 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000595 if have_unicode:
596 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000597
598 def test_hasattr(self):
599 import sys
600 self.assert_(hasattr(sys, 'stdout'))
601 self.assertRaises(TypeError, hasattr, sys, 1)
602 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000603 if have_unicode:
604 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000605
606 def test_hash(self):
607 hash(None)
608 self.assertEqual(hash(1), hash(1L))
609 self.assertEqual(hash(1), hash(1.0))
610 hash('spam')
611 if have_unicode:
612 self.assertEqual(hash('spam'), hash(unicode('spam')))
613 hash((0,1,2,3))
614 def f(): pass
615 self.assertRaises(TypeError, hash, [])
616 self.assertRaises(TypeError, hash, {})
617
618 def test_hex(self):
619 self.assertEqual(hex(16), '0x10')
620 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000621 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000622 self.assertEqual(hex(-16L), '-0x10L')
623 self.assertRaises(TypeError, hex, {})
624
625 def test_id(self):
626 id(None)
627 id(1)
628 id(1L)
629 id(1.0)
630 id('spam')
631 id((0,1,2,3))
632 id([0,1,2,3])
633 id({'spam': 1, 'eggs': 2, 'ham': 3})
634
Walter Dörwald919497e2003-01-19 16:23:59 +0000635 def test_int(self):
636 self.assertEqual(int(314), 314)
637 self.assertEqual(int(3.14), 3)
638 self.assertEqual(int(314L), 314)
639 # Check that conversion from float truncates towards zero
640 self.assertEqual(int(-3.14), -3)
641 self.assertEqual(int(3.9), 3)
642 self.assertEqual(int(-3.9), -3)
643 self.assertEqual(int(3.5), 3)
644 self.assertEqual(int(-3.5), -3)
645 # Different base:
646 self.assertEqual(int("10",16), 16L)
647 if have_unicode:
648 self.assertEqual(int(unicode("10"),16), 16L)
649 # Test conversion from strings and various anomalies
650 for s, v in L:
651 for sign in "", "+", "-":
652 for prefix in "", " ", "\t", " \t\t ":
653 ss = prefix + sign + s
654 vv = v
655 if sign == "-" and v is not ValueError:
656 vv = -v
657 try:
658 self.assertEqual(int(ss), vv)
659 except v:
660 pass
661
Walter Dörwald70a6b492004-02-12 17:35:32 +0000662 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000663 self.assertEqual(int(s)+1, -sys.maxint)
664 # should return long
665 int(s[1:])
666
667 # should return long
668 x = int(1e100)
669 self.assert_(isinstance(x, long))
670 x = int(-1e100)
671 self.assert_(isinstance(x, long))
672
673
674 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
675 # Worked by accident in Windows release build, but failed in debug build.
676 # Failed in all Linux builds.
677 x = -1-sys.maxint
678 self.assertEqual(x >> 1, x//2)
679
680 self.assertRaises(ValueError, int, '123\0')
681 self.assertRaises(ValueError, int, '53', 40)
682
683 x = int('1' * 600)
684 self.assert_(isinstance(x, long))
685
686 if have_unicode:
687 x = int(unichr(0x661) * 600)
688 self.assert_(isinstance(x, long))
689
690 self.assertRaises(TypeError, int, 1, 12)
691
692 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000693 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000694
Brett Cannonc3647ac2005-04-26 03:45:26 +0000695 def test_intconversion(self):
696 # Test __int__()
697 class Foo0:
698 def __int__(self):
699 return 42
700
701 class Foo1(object):
702 def __int__(self):
703 return 42
704
705 class Foo2(int):
706 def __int__(self):
707 return 42
708
709 class Foo3(int):
710 def __int__(self):
711 return self
712
713 class Foo4(int):
714 def __int__(self):
715 return 42L
716
717 class Foo5(int):
718 def __int__(self):
719 return 42.
720
721 self.assertEqual(int(Foo0()), 42)
722 self.assertEqual(int(Foo1()), 42)
723 self.assertEqual(int(Foo2()), 42)
724 self.assertEqual(int(Foo3()), 0)
725 self.assertEqual(int(Foo4()), 42L)
726 self.assertRaises(TypeError, int, Foo5())
727
Walter Dörwald919497e2003-01-19 16:23:59 +0000728 def test_intern(self):
729 self.assertRaises(TypeError, intern)
730 s = "never interned before"
731 self.assert_(intern(s) is s)
732 s2 = s.swapcase().swapcase()
733 self.assert_(intern(s2) is s)
734
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000735 # Subclasses of string can't be interned, because they
736 # provide too much opportunity for insane things to happen.
737 # We don't want them in the interned dict and if they aren't
738 # actually interned, we don't want to create the appearance
739 # that they are by allowing intern() to succeeed.
740 class S(str):
741 def __hash__(self):
742 return 123
743
744 self.assertRaises(TypeError, intern, S("abc"))
745
746 # It's still safe to pass these strings to routines that
747 # call intern internally, e.g. PyObject_SetAttr().
748 s = S("abc")
749 setattr(s, s, s)
750 self.assertEqual(getattr(s, s), s)
751
Walter Dörwald919497e2003-01-19 16:23:59 +0000752 def test_iter(self):
753 self.assertRaises(TypeError, iter)
754 self.assertRaises(TypeError, iter, 42, 42)
755 lists = [("1", "2"), ["1", "2"], "12"]
756 if have_unicode:
757 lists.append(unicode("12"))
758 for l in lists:
759 i = iter(l)
760 self.assertEqual(i.next(), '1')
761 self.assertEqual(i.next(), '2')
762 self.assertRaises(StopIteration, i.next)
763
764 def test_isinstance(self):
765 class C:
766 pass
767 class D(C):
768 pass
769 class E:
770 pass
771 c = C()
772 d = D()
773 e = E()
774 self.assert_(isinstance(c, C))
775 self.assert_(isinstance(d, C))
776 self.assert_(not isinstance(e, C))
777 self.assert_(not isinstance(c, D))
778 self.assert_(not isinstance('foo', E))
779 self.assertRaises(TypeError, isinstance, E, 'foo')
780 self.assertRaises(TypeError, isinstance)
781
782 def test_issubclass(self):
783 class C:
784 pass
785 class D(C):
786 pass
787 class E:
788 pass
789 c = C()
790 d = D()
791 e = E()
792 self.assert_(issubclass(D, C))
793 self.assert_(issubclass(C, C))
794 self.assert_(not issubclass(C, D))
795 self.assertRaises(TypeError, issubclass, 'foo', E)
796 self.assertRaises(TypeError, issubclass, E, 'foo')
797 self.assertRaises(TypeError, issubclass)
798
799 def test_len(self):
800 self.assertEqual(len('123'), 3)
801 self.assertEqual(len(()), 0)
802 self.assertEqual(len((1, 2, 3, 4)), 4)
803 self.assertEqual(len([1, 2, 3, 4]), 4)
804 self.assertEqual(len({}), 0)
805 self.assertEqual(len({'a':1, 'b': 2}), 2)
806 class BadSeq:
807 def __len__(self):
808 raise ValueError
809 self.assertRaises(ValueError, len, BadSeq())
810
811 def test_list(self):
812 self.assertEqual(list([]), [])
813 l0_3 = [0, 1, 2, 3]
814 l0_3_bis = list(l0_3)
815 self.assertEqual(l0_3, l0_3_bis)
816 self.assert_(l0_3 is not l0_3_bis)
817 self.assertEqual(list(()), [])
818 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
819 self.assertEqual(list(''), [])
820 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
821
822 if sys.maxint == 0x7fffffff:
823 # This test can currently only work on 32-bit machines.
824 # XXX If/when PySequence_Length() returns a ssize_t, it should be
825 # XXX re-enabled.
826 # Verify clearing of bug #556025.
827 # This assumes that the max data size (sys.maxint) == max
828 # address size this also assumes that the address size is at
829 # least 4 bytes with 8 byte addresses, the bug is not well
830 # tested
831 #
832 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
833 # earlier due to a newlib bug. See the following mailing list
834 # thread for the details:
835
836 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
837 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
838
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000839 # This code used to segfault in Py2.4a3
840 x = []
841 x.extend(-y for y in x)
842 self.assertEqual(x, [])
843
Walter Dörwald919497e2003-01-19 16:23:59 +0000844 def test_long(self):
845 self.assertEqual(long(314), 314L)
846 self.assertEqual(long(3.14), 3L)
847 self.assertEqual(long(314L), 314L)
848 # Check that conversion from float truncates towards zero
849 self.assertEqual(long(-3.14), -3L)
850 self.assertEqual(long(3.9), 3L)
851 self.assertEqual(long(-3.9), -3L)
852 self.assertEqual(long(3.5), 3L)
853 self.assertEqual(long(-3.5), -3L)
854 self.assertEqual(long("-3"), -3L)
855 if have_unicode:
856 self.assertEqual(long(unicode("-3")), -3L)
857 # Different base:
858 self.assertEqual(long("10",16), 16L)
859 if have_unicode:
860 self.assertEqual(long(unicode("10"),16), 16L)
861 # Check conversions from string (same test set as for int(), and then some)
862 LL = [
863 ('1' + '0'*20, 10L**20),
864 ('1' + '0'*100, 10L**100)
865 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000866 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000867 if have_unicode:
868 L2 += [
869 (unicode('1') + unicode('0')*20, 10L**20),
870 (unicode('1') + unicode('0')*100, 10L**100),
871 ]
872 for s, v in L2 + LL:
873 for sign in "", "+", "-":
874 for prefix in "", " ", "\t", " \t\t ":
875 ss = prefix + sign + s
876 vv = v
877 if sign == "-" and v is not ValueError:
878 vv = -v
879 try:
880 self.assertEqual(long(ss), long(vv))
881 except v:
882 pass
883
884 self.assertRaises(ValueError, long, '123\0')
885 self.assertRaises(ValueError, long, '53', 40)
886 self.assertRaises(TypeError, long, 1, 12)
887
Brett Cannonc3647ac2005-04-26 03:45:26 +0000888 def test_longconversion(self):
889 # Test __long__()
890 class Foo0:
891 def __long__(self):
892 return 42L
893
894 class Foo1(object):
895 def __long__(self):
896 return 42L
897
898 class Foo2(long):
899 def __long__(self):
900 return 42L
901
902 class Foo3(long):
903 def __long__(self):
904 return self
905
906 class Foo4(long):
907 def __long__(self):
908 return 42
909
910 class Foo5(long):
911 def __long__(self):
912 return 42.
913
914 self.assertEqual(long(Foo0()), 42L)
915 self.assertEqual(long(Foo1()), 42L)
916 self.assertEqual(long(Foo2()), 42L)
917 self.assertEqual(long(Foo3()), 0)
918 self.assertEqual(long(Foo4()), 42)
919 self.assertRaises(TypeError, long, Foo5())
920
Walter Dörwald919497e2003-01-19 16:23:59 +0000921 def test_map(self):
922 self.assertEqual(
923 map(None, 'hello world'),
924 ['h','e','l','l','o',' ','w','o','r','l','d']
925 )
926 self.assertEqual(
927 map(None, 'abcd', 'efg'),
928 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
929 )
930 self.assertEqual(
931 map(None, range(10)),
932 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
933 )
934 self.assertEqual(
935 map(lambda x: x*x, range(1,4)),
936 [1, 4, 9]
937 )
938 try:
939 from math import sqrt
940 except ImportError:
941 def sqrt(x):
942 return pow(x, 0.5)
943 self.assertEqual(
944 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
945 [[4.0, 2.0], [9.0, 3.0]]
946 )
947 self.assertEqual(
948 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
949 [10, 4, 6]
950 )
951
952 def plus(*v):
953 accu = 0
954 for i in v: accu = accu + i
955 return accu
956 self.assertEqual(
957 map(plus, [1, 3, 7]),
958 [1, 3, 7]
959 )
960 self.assertEqual(
961 map(plus, [1, 3, 7], [4, 9, 2]),
962 [1+4, 3+9, 7+2]
963 )
964 self.assertEqual(
965 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
966 [1+4+1, 3+9+1, 7+2+0]
967 )
968 self.assertEqual(
969 map(None, Squares(10)),
970 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
971 )
972 self.assertEqual(
973 map(int, Squares(10)),
974 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
975 )
976 self.assertEqual(
977 map(None, Squares(3), Squares(2)),
978 [(0,0), (1,1), (4,None)]
979 )
980 self.assertEqual(
981 map(max, Squares(3), Squares(2)),
982 [0, 1, 4]
983 )
984 self.assertRaises(TypeError, map)
985 self.assertRaises(TypeError, map, lambda x: x, 42)
986 self.assertEqual(map(None, [42]), [42])
987 class BadSeq:
988 def __getitem__(self, index):
989 raise ValueError
990 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +0000991 def badfunc(x):
992 raise RuntimeError
993 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000994
995 def test_max(self):
996 self.assertEqual(max('123123'), '3')
997 self.assertEqual(max(1, 2, 3), 3)
998 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
999 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1000
1001 self.assertEqual(max(1, 2L, 3.0), 3.0)
1002 self.assertEqual(max(1L, 2.0, 3), 3)
1003 self.assertEqual(max(1.0, 2, 3L), 3L)
1004
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001005 for stmt in (
1006 "max(key=int)", # no args
1007 "max(1, key=int)", # single arg not iterable
1008 "max(1, 2, keystone=int)", # wrong keyword
1009 "max(1, 2, key=int, abc=int)", # two many keywords
1010 "max(1, 2, key=1)", # keyfunc is not callable
1011 ):
Tim Peters7f061872004-12-07 21:17:46 +00001012 try:
1013 exec(stmt) in globals()
1014 except TypeError:
1015 pass
1016 else:
1017 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001018
1019 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1020 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1021 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1022
1023 data = [random.randrange(200) for i in range(100)]
1024 keys = dict((elem, random.randrange(50)) for elem in data)
1025 f = keys.__getitem__
1026 self.assertEqual(max(data, key=f),
1027 sorted(reversed(data), key=f)[-1])
1028
Walter Dörwald919497e2003-01-19 16:23:59 +00001029 def test_min(self):
1030 self.assertEqual(min('123123'), '1')
1031 self.assertEqual(min(1, 2, 3), 1)
1032 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1033 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1034
1035 self.assertEqual(min(1, 2L, 3.0), 1)
1036 self.assertEqual(min(1L, 2.0, 3), 1L)
1037 self.assertEqual(min(1.0, 2, 3L), 1.0)
1038
1039 self.assertRaises(TypeError, min)
1040 self.assertRaises(TypeError, min, 42)
1041 self.assertRaises(ValueError, min, ())
1042 class BadSeq:
1043 def __getitem__(self, index):
1044 raise ValueError
1045 self.assertRaises(ValueError, min, BadSeq())
1046 class BadNumber:
1047 def __cmp__(self, other):
1048 raise ValueError
1049 self.assertRaises(ValueError, min, (42, BadNumber()))
1050
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001051 for stmt in (
1052 "min(key=int)", # no args
1053 "min(1, key=int)", # single arg not iterable
1054 "min(1, 2, keystone=int)", # wrong keyword
1055 "min(1, 2, key=int, abc=int)", # two many keywords
1056 "min(1, 2, key=1)", # keyfunc is not callable
1057 ):
Tim Peters7f061872004-12-07 21:17:46 +00001058 try:
1059 exec(stmt) in globals()
1060 except TypeError:
1061 pass
1062 else:
1063 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001064
1065 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1066 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1067 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1068
1069 data = [random.randrange(200) for i in range(100)]
1070 keys = dict((elem, random.randrange(50)) for elem in data)
1071 f = keys.__getitem__
1072 self.assertEqual(min(data, key=f),
1073 sorted(data, key=f)[0])
1074
Walter Dörwald919497e2003-01-19 16:23:59 +00001075 def test_oct(self):
1076 self.assertEqual(oct(100), '0144')
1077 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001078 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001079 self.assertEqual(oct(-100L), '-0144L')
1080 self.assertRaises(TypeError, oct, ())
1081
1082 def write_testfile(self):
Walter Dörwald919497e2003-01-19 16:23:59 +00001083 fp = open(TESTFN, 'w')
1084 try:
1085 fp.write('1+1\n')
1086 fp.write('1+1\n')
1087 fp.write('The quick brown fox jumps over the lazy dog')
1088 fp.write('.\n')
1089 fp.write('Dear John\n')
1090 fp.write('XXX'*100)
1091 fp.write('YYY'*100)
1092 finally:
1093 fp.close()
1094
1095 def test_open(self):
1096 self.write_testfile()
1097 fp = open(TESTFN, 'r')
1098 try:
1099 self.assertEqual(fp.readline(4), '1+1\n')
1100 self.assertEqual(fp.readline(4), '1+1\n')
1101 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1102 self.assertEqual(fp.readline(4), 'Dear')
1103 self.assertEqual(fp.readline(100), ' John\n')
1104 self.assertEqual(fp.read(300), 'XXX'*100)
1105 self.assertEqual(fp.read(1000), 'YYY'*100)
1106 finally:
1107 fp.close()
1108 unlink(TESTFN)
1109
1110 def test_ord(self):
1111 self.assertEqual(ord(' '), 32)
1112 self.assertEqual(ord('A'), 65)
1113 self.assertEqual(ord('a'), 97)
1114 if have_unicode:
1115 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1116 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001117 if have_unicode:
1118 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001119
1120 def test_pow(self):
1121 self.assertEqual(pow(0,0), 1)
1122 self.assertEqual(pow(0,1), 0)
1123 self.assertEqual(pow(1,0), 1)
1124 self.assertEqual(pow(1,1), 1)
1125
1126 self.assertEqual(pow(2,0), 1)
1127 self.assertEqual(pow(2,10), 1024)
1128 self.assertEqual(pow(2,20), 1024*1024)
1129 self.assertEqual(pow(2,30), 1024*1024*1024)
1130
1131 self.assertEqual(pow(-2,0), 1)
1132 self.assertEqual(pow(-2,1), -2)
1133 self.assertEqual(pow(-2,2), 4)
1134 self.assertEqual(pow(-2,3), -8)
1135
1136 self.assertEqual(pow(0L,0), 1)
1137 self.assertEqual(pow(0L,1), 0)
1138 self.assertEqual(pow(1L,0), 1)
1139 self.assertEqual(pow(1L,1), 1)
1140
1141 self.assertEqual(pow(2L,0), 1)
1142 self.assertEqual(pow(2L,10), 1024)
1143 self.assertEqual(pow(2L,20), 1024*1024)
1144 self.assertEqual(pow(2L,30), 1024*1024*1024)
1145
1146 self.assertEqual(pow(-2L,0), 1)
1147 self.assertEqual(pow(-2L,1), -2)
1148 self.assertEqual(pow(-2L,2), 4)
1149 self.assertEqual(pow(-2L,3), -8)
1150
1151 self.assertAlmostEqual(pow(0.,0), 1.)
1152 self.assertAlmostEqual(pow(0.,1), 0.)
1153 self.assertAlmostEqual(pow(1.,0), 1.)
1154 self.assertAlmostEqual(pow(1.,1), 1.)
1155
1156 self.assertAlmostEqual(pow(2.,0), 1.)
1157 self.assertAlmostEqual(pow(2.,10), 1024.)
1158 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1159 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1160
1161 self.assertAlmostEqual(pow(-2.,0), 1.)
1162 self.assertAlmostEqual(pow(-2.,1), -2.)
1163 self.assertAlmostEqual(pow(-2.,2), 4.)
1164 self.assertAlmostEqual(pow(-2.,3), -8.)
1165
1166 for x in 2, 2L, 2.0:
1167 for y in 10, 10L, 10.0:
1168 for z in 1000, 1000L, 1000.0:
1169 if isinstance(x, float) or \
1170 isinstance(y, float) or \
1171 isinstance(z, float):
1172 self.assertRaises(TypeError, pow, x, y, z)
1173 else:
1174 self.assertAlmostEqual(pow(x, y, z), 24.0)
1175
1176 self.assertRaises(TypeError, pow, -1, -2, 3)
1177 self.assertRaises(ValueError, pow, 1, 2, 0)
1178 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1179 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1180 self.assertRaises(ValueError, pow, -342.43, 0.234)
1181
1182 self.assertRaises(TypeError, pow)
1183
1184 def test_range(self):
1185 self.assertEqual(range(3), [0, 1, 2])
1186 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1187 self.assertEqual(range(0), [])
1188 self.assertEqual(range(-3), [])
1189 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1190 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1191
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001192 # Now test range() with longs
1193 self.assertEqual(range(-2**100), [])
1194 self.assertEqual(range(0, -2**100), [])
1195 self.assertEqual(range(0, 2**100, -1), [])
1196 self.assertEqual(range(0, 2**100, -1), [])
1197
1198 a = long(10 * sys.maxint)
1199 b = long(100 * sys.maxint)
1200 c = long(50 * sys.maxint)
1201
1202 self.assertEqual(range(a, a+2), [a, a+1])
1203 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1204 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1205
1206 seq = range(a, b, c)
1207 self.assert_(a in seq)
1208 self.assert_(b not in seq)
1209 self.assertEqual(len(seq), 2)
1210
1211 seq = range(b, a, -c)
1212 self.assert_(b in seq)
1213 self.assert_(a not in seq)
1214 self.assertEqual(len(seq), 2)
1215
1216 seq = range(-a, -b, -c)
1217 self.assert_(-a in seq)
1218 self.assert_(-b not in seq)
1219 self.assertEqual(len(seq), 2)
1220
Walter Dörwald919497e2003-01-19 16:23:59 +00001221 self.assertRaises(TypeError, range)
1222 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1223 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001224 self.assertRaises(ValueError, range, a, a + 1, long(0))
1225
1226 class badzero(int):
1227 def __cmp__(self, other):
1228 raise RuntimeError
1229 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001230
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001231 # Reject floats when it would require PyLongs to represent.
1232 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001233 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001234
Walter Dörwald357981e2003-04-15 18:59:28 +00001235 self.assertRaises(TypeError, range, 0, "spam")
1236 self.assertRaises(TypeError, range, 0, 42, "spam")
1237
1238 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1239 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1240
Walter Dörwald919497e2003-01-19 16:23:59 +00001241 def test_reduce(self):
1242 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1243 self.assertEqual(
1244 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1245 ['a','c','d','w']
1246 )
1247 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1248 self.assertEqual(
1249 reduce(lambda x, y: x*y, range(2,21), 1L),
1250 2432902008176640000L
1251 )
1252 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1253 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1254 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1255 self.assertRaises(TypeError, reduce)
1256 self.assertRaises(TypeError, reduce, 42, 42)
1257 self.assertRaises(TypeError, reduce, 42, 42, 42)
1258 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1259 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1260 self.assertRaises(TypeError, reduce, 42, (42, 42))
1261
1262 class BadSeq:
1263 def __getitem__(self, index):
1264 raise ValueError
1265 self.assertRaises(ValueError, reduce, 42, BadSeq())
1266
1267 def test_reload(self):
1268 import marshal
1269 reload(marshal)
1270 import string
1271 reload(string)
1272 ## import sys
1273 ## self.assertRaises(ImportError, reload, sys)
1274
1275 def test_repr(self):
1276 self.assertEqual(repr(''), '\'\'')
1277 self.assertEqual(repr(0), '0')
1278 self.assertEqual(repr(0L), '0L')
1279 self.assertEqual(repr(()), '()')
1280 self.assertEqual(repr([]), '[]')
1281 self.assertEqual(repr({}), '{}')
1282 a = []
1283 a.append(a)
1284 self.assertEqual(repr(a), '[[...]]')
1285 a = {}
1286 a[0] = a
1287 self.assertEqual(repr(a), '{0: {...}}')
1288
1289 def test_round(self):
1290 self.assertEqual(round(0.0), 0.0)
1291 self.assertEqual(round(1.0), 1.0)
1292 self.assertEqual(round(10.0), 10.0)
1293 self.assertEqual(round(1000000000.0), 1000000000.0)
1294 self.assertEqual(round(1e20), 1e20)
1295
1296 self.assertEqual(round(-1.0), -1.0)
1297 self.assertEqual(round(-10.0), -10.0)
1298 self.assertEqual(round(-1000000000.0), -1000000000.0)
1299 self.assertEqual(round(-1e20), -1e20)
1300
1301 self.assertEqual(round(0.1), 0.0)
1302 self.assertEqual(round(1.1), 1.0)
1303 self.assertEqual(round(10.1), 10.0)
1304 self.assertEqual(round(1000000000.1), 1000000000.0)
1305
1306 self.assertEqual(round(-1.1), -1.0)
1307 self.assertEqual(round(-10.1), -10.0)
1308 self.assertEqual(round(-1000000000.1), -1000000000.0)
1309
1310 self.assertEqual(round(0.9), 1.0)
1311 self.assertEqual(round(9.9), 10.0)
1312 self.assertEqual(round(999999999.9), 1000000000.0)
1313
1314 self.assertEqual(round(-0.9), -1.0)
1315 self.assertEqual(round(-9.9), -10.0)
1316 self.assertEqual(round(-999999999.9), -1000000000.0)
1317
1318 self.assertEqual(round(-8.0, -1), -10.0)
1319
1320 self.assertRaises(TypeError, round)
1321
1322 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001323 setattr(sys, 'spam', 1)
1324 self.assertEqual(sys.spam, 1)
1325 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1326 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001327
1328 def test_str(self):
1329 self.assertEqual(str(''), '')
1330 self.assertEqual(str(0), '0')
1331 self.assertEqual(str(0L), '0')
1332 self.assertEqual(str(()), '()')
1333 self.assertEqual(str([]), '[]')
1334 self.assertEqual(str({}), '{}')
1335 a = []
1336 a.append(a)
1337 self.assertEqual(str(a), '[[...]]')
1338 a = {}
1339 a[0] = a
1340 self.assertEqual(str(a), '{0: {...}}')
1341
Alex Martellia70b1912003-04-22 08:12:33 +00001342 def test_sum(self):
1343 self.assertEqual(sum([]), 0)
1344 self.assertEqual(sum(range(2,8)), 27)
1345 self.assertEqual(sum(iter(range(2,8))), 27)
1346 self.assertEqual(sum(Squares(10)), 285)
1347 self.assertEqual(sum(iter(Squares(10))), 285)
1348 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1349
1350 self.assertRaises(TypeError, sum)
1351 self.assertRaises(TypeError, sum, 42)
1352 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1353 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1354 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1355 self.assertRaises(TypeError, sum, [{2:3}])
1356 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1357
1358 class BadSeq:
1359 def __getitem__(self, index):
1360 raise ValueError
1361 self.assertRaises(ValueError, sum, BadSeq())
1362
Walter Dörwald919497e2003-01-19 16:23:59 +00001363 def test_tuple(self):
1364 self.assertEqual(tuple(()), ())
1365 t0_3 = (0, 1, 2, 3)
1366 t0_3_bis = tuple(t0_3)
1367 self.assert_(t0_3 is t0_3_bis)
1368 self.assertEqual(tuple([]), ())
1369 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1370 self.assertEqual(tuple(''), ())
1371 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1372
1373 def test_type(self):
1374 self.assertEqual(type(''), type('123'))
1375 self.assertNotEqual(type(''), type(()))
1376
1377 def test_unichr(self):
1378 if have_unicode:
1379 self.assertEqual(unichr(32), unicode(' '))
1380 self.assertEqual(unichr(65), unicode('A'))
1381 self.assertEqual(unichr(97), unicode('a'))
1382 self.assertEqual(
1383 unichr(sys.maxunicode),
1384 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1385 )
1386 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1387 self.assertRaises(TypeError, unichr)
1388
Guido van Rossumfee7b932005-01-16 00:21:28 +00001389 # We don't want self in vars(), so these are static methods
1390
1391 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001392 def get_vars_f0():
1393 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001394
Guido van Rossumfee7b932005-01-16 00:21:28 +00001395 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001396 def get_vars_f2():
1397 BuiltinTest.get_vars_f0()
1398 a = 1
1399 b = 2
1400 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001401
1402 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001403 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001404 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001405 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001406 self.assertEqual(self.get_vars_f0(), {})
1407 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1408 self.assertRaises(TypeError, vars, 42, 42)
1409 self.assertRaises(TypeError, vars, 42)
1410
1411 def test_zip(self):
1412 a = (1, 2, 3)
1413 b = (4, 5, 6)
1414 t = [(1, 4), (2, 5), (3, 6)]
1415 self.assertEqual(zip(a, b), t)
1416 b = [4, 5, 6]
1417 self.assertEqual(zip(a, b), t)
1418 b = (4, 5, 6, 7)
1419 self.assertEqual(zip(a, b), t)
1420 class I:
1421 def __getitem__(self, i):
1422 if i < 0 or i > 2: raise IndexError
1423 return i + 4
1424 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001425 self.assertEqual(zip(), [])
1426 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001427 self.assertRaises(TypeError, zip, None)
1428 class G:
1429 pass
1430 self.assertRaises(TypeError, zip, a, G())
1431
1432 # Make sure zip doesn't try to allocate a billion elements for the
1433 # result list when one of its arguments doesn't say how long it is.
1434 # A MemoryError is the most likely failure mode.
1435 class SequenceWithoutALength:
1436 def __getitem__(self, i):
1437 if i == 5:
1438 raise IndexError
1439 else:
1440 return i
1441 self.assertEqual(
1442 zip(SequenceWithoutALength(), xrange(2**30)),
1443 list(enumerate(range(5)))
1444 )
1445
1446 class BadSeq:
1447 def __getitem__(self, i):
1448 if i == 5:
1449 raise ValueError
1450 else:
1451 return i
1452 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1453
Raymond Hettinger64958a12003-12-17 20:43:33 +00001454class TestSorted(unittest.TestCase):
1455
1456 def test_basic(self):
1457 data = range(100)
1458 copy = data[:]
1459 random.shuffle(copy)
1460 self.assertEqual(data, sorted(copy))
1461 self.assertNotEqual(data, copy)
1462
1463 data.reverse()
1464 random.shuffle(copy)
1465 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1466 self.assertNotEqual(data, copy)
1467 random.shuffle(copy)
1468 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1469 self.assertNotEqual(data, copy)
1470 random.shuffle(copy)
1471 self.assertEqual(data, sorted(copy, reverse=1))
1472 self.assertNotEqual(data, copy)
1473
1474 def test_inputtypes(self):
1475 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001476 types = [list, tuple]
1477 if have_unicode:
1478 types.insert(0, unicode)
1479 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001480 self.assertEqual(sorted(s), sorted(T(s)))
1481
1482 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001483 types = [set, frozenset, list, tuple, dict.fromkeys]
1484 if have_unicode:
1485 types.insert(0, unicode)
1486 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001487 self.assertEqual(sorted(s), sorted(T(s)))
1488
1489 def test_baddecorator(self):
1490 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1491 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1492
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001493def test_main(verbose=None):
1494 test_classes = (BuiltinTest, TestSorted)
1495
1496 run_unittest(*test_classes)
1497
1498 # verify reference counting
1499 if verbose and hasattr(sys, "gettotalrefcount"):
1500 import gc
1501 counts = [None] * 5
1502 for i in xrange(len(counts)):
1503 run_unittest(*test_classes)
1504 gc.collect()
1505 counts[i] = sys.gettotalrefcount()
1506 print counts
1507
Walter Dörwald919497e2003-01-19 16:23:59 +00001508
1509if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001510 test_main(verbose=True)