blob: 51ef7c64191b69b6a2d9221b79ee92cf5bfa8bf3 [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
95class BuiltinTest(unittest.TestCase):
96
97 def test_import(self):
98 __import__('sys')
99 __import__('time')
100 __import__('string')
101 self.assertRaises(ImportError, __import__, 'spamspam')
102 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
103
104 def test_abs(self):
105 # int
106 self.assertEqual(abs(0), 0)
107 self.assertEqual(abs(1234), 1234)
108 self.assertEqual(abs(-1234), 1234)
109 # float
110 self.assertEqual(abs(0.0), 0.0)
111 self.assertEqual(abs(3.14), 3.14)
112 self.assertEqual(abs(-3.14), 3.14)
113 # long
114 self.assertEqual(abs(0L), 0L)
115 self.assertEqual(abs(1234L), 1234L)
116 self.assertEqual(abs(-1234L), 1234L)
117 # str
118 self.assertRaises(TypeError, abs, 'a')
119
120 def test_apply(self):
121 def f0(*args):
122 self.assertEqual(args, ())
123 def f1(a1):
124 self.assertEqual(a1, 1)
125 def f2(a1, a2):
126 self.assertEqual(a1, 1)
127 self.assertEqual(a2, 2)
128 def f3(a1, a2, a3):
129 self.assertEqual(a1, 1)
130 self.assertEqual(a2, 2)
131 self.assertEqual(a3, 3)
132 apply(f0, ())
133 apply(f1, (1,))
134 apply(f2, (1, 2))
135 apply(f3, (1, 2, 3))
136
137 # A PyCFunction that takes only positional parameters should allow an
138 # empty keyword dictionary to pass without a complaint, but raise a
139 # TypeError if the dictionary is non-empty.
140 apply(id, (1,), {})
141 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
142 self.assertRaises(TypeError, apply)
143 self.assertRaises(TypeError, apply, id, 42)
144 self.assertRaises(TypeError, apply, id, (42,), 42)
145
146 def test_callable(self):
147 self.assert_(callable(len))
148 def f(): pass
149 self.assert_(callable(f))
150 class C:
151 def meth(self): pass
152 self.assert_(callable(C))
153 x = C()
154 self.assert_(callable(x.meth))
155 self.assert_(not callable(x))
156 class D(C):
157 def __call__(self): pass
158 y = D()
159 self.assert_(callable(y))
160 y()
161
162 def test_chr(self):
163 self.assertEqual(chr(32), ' ')
164 self.assertEqual(chr(65), 'A')
165 self.assertEqual(chr(97), 'a')
166 self.assertEqual(chr(0xff), '\xff')
167 self.assertRaises(ValueError, chr, 256)
168 self.assertRaises(TypeError, chr)
169
170 def test_cmp(self):
171 self.assertEqual(cmp(-1, 1), -1)
172 self.assertEqual(cmp(1, -1), 1)
173 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000174 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000175 a = []; a.append(a)
176 b = []; b.append(b)
177 from UserList import UserList
178 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000179 self.assertRaises(RuntimeError, cmp, a, b)
180 self.assertRaises(RuntimeError, cmp, b, c)
181 self.assertRaises(RuntimeError, cmp, c, a)
182 self.assertRaises(RuntimeError, cmp, a, c)
183 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000184 a.pop(); b.pop(); c.pop()
185 self.assertRaises(TypeError, cmp)
186
187 def test_coerce(self):
188 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
189 self.assertEqual(coerce(1, 1L), (1L, 1L))
190 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
191 self.assertRaises(TypeError, coerce)
192 class BadNumber:
193 def __coerce__(self, other):
194 raise ValueError
195 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000196 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000197
198 def test_compile(self):
199 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000200 bom = '\xef\xbb\xbf'
201 compile(bom + 'print 1\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000202 self.assertRaises(TypeError, compile)
203 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
204 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000205 if have_unicode:
206 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000207
Walter Dörwald919497e2003-01-19 16:23:59 +0000208 def test_delattr(self):
209 import sys
210 sys.spam = 1
211 delattr(sys, 'spam')
212 self.assertRaises(TypeError, delattr)
213
214 def test_dir(self):
215 x = 1
216 self.assert_('x' in dir())
217 import sys
218 self.assert_('modules' in dir(sys))
219 self.assertRaises(TypeError, dir, 42, 42)
220
221 def test_divmod(self):
222 self.assertEqual(divmod(12, 7), (1, 5))
223 self.assertEqual(divmod(-12, 7), (-2, 2))
224 self.assertEqual(divmod(12, -7), (-2, -2))
225 self.assertEqual(divmod(-12, -7), (1, -5))
226
227 self.assertEqual(divmod(12L, 7L), (1L, 5L))
228 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
229 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
230 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
231
232 self.assertEqual(divmod(12, 7L), (1, 5L))
233 self.assertEqual(divmod(-12, 7L), (-2, 2L))
234 self.assertEqual(divmod(12L, -7), (-2L, -2))
235 self.assertEqual(divmod(-12L, -7), (1L, -5))
236
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000237 self.assertEqual(divmod(-sys.maxint-1, -1),
238 (sys.maxint+1, 0))
239
Walter Dörwald919497e2003-01-19 16:23:59 +0000240 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
241 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
242 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
243 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
244
245 self.assertRaises(TypeError, divmod)
246
247 def test_eval(self):
248 self.assertEqual(eval('1+1'), 2)
249 self.assertEqual(eval(' 1+1\n'), 2)
250 globals = {'a': 1, 'b': 2}
251 locals = {'b': 200, 'c': 300}
252 self.assertEqual(eval('a', globals) , 1)
253 self.assertEqual(eval('a', globals, locals), 1)
254 self.assertEqual(eval('b', globals, locals), 200)
255 self.assertEqual(eval('c', globals, locals), 300)
256 if have_unicode:
257 self.assertEqual(eval(unicode('1+1')), 2)
258 self.assertEqual(eval(unicode(' 1+1\n')), 2)
259 globals = {'a': 1, 'b': 2}
260 locals = {'b': 200, 'c': 300}
261 if have_unicode:
262 self.assertEqual(eval(unicode('a'), globals), 1)
263 self.assertEqual(eval(unicode('a'), globals, locals), 1)
264 self.assertEqual(eval(unicode('b'), globals, locals), 200)
265 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000266 bom = '\xef\xbb\xbf'
267 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000268 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
269 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000270 self.assertRaises(TypeError, eval)
271 self.assertRaises(TypeError, eval, ())
272
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000273 def test_general_eval(self):
274 # Tests that general mappings can be used for the locals argument
275
276 class M:
277 "Test mapping interface versus possible calls from eval()."
278 def __getitem__(self, key):
279 if key == 'a':
280 return 12
281 raise KeyError
282 def keys(self):
283 return list('xyz')
284
285 m = M()
286 g = globals()
287 self.assertEqual(eval('a', g, m), 12)
288 self.assertRaises(NameError, eval, 'b', g, m)
289 self.assertEqual(eval('dir()', g, m), list('xyz'))
290 self.assertEqual(eval('globals()', g, m), g)
291 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000292 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000293 class A:
294 "Non-mapping"
295 pass
296 m = A()
297 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000298
299 # Verify that dict subclasses work as well
300 class D(dict):
301 def __getitem__(self, key):
302 if key == 'a':
303 return 12
304 return dict.__getitem__(self, key)
305 def keys(self):
306 return list('xyz')
307
308 d = D()
309 self.assertEqual(eval('a', g, d), 12)
310 self.assertRaises(NameError, eval, 'b', g, d)
311 self.assertEqual(eval('dir()', g, d), list('xyz'))
312 self.assertEqual(eval('globals()', g, d), g)
313 self.assertEqual(eval('locals()', g, d), d)
314
315 # Verify locals stores (used by list comps)
316 eval('[locals() for i in (2,3)]', g, d)
317 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
318
319 class SpreadSheet:
320 "Sample application showing nested, calculated lookups."
321 _cells = {}
322 def __setitem__(self, key, formula):
323 self._cells[key] = formula
324 def __getitem__(self, key ):
325 return eval(self._cells[key], globals(), self)
326
327 ss = SpreadSheet()
328 ss['a1'] = '5'
329 ss['a2'] = 'a1*6'
330 ss['a3'] = 'a2*7'
331 self.assertEqual(ss['a3'], 210)
332
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000333 # Verify that dir() catches a non-list returned by eval
334 # SF bug #1004669
335 class C:
336 def __getitem__(self, item):
337 raise KeyError(item)
338 def keys(self):
339 return 'a'
340 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
341
Walter Dörwald919497e2003-01-19 16:23:59 +0000342 # Done outside of the method test_z to get the correct scope
343 z = 0
344 f = open(TESTFN, 'w')
345 f.write('z = z+1\n')
346 f.write('z = z*2\n')
347 f.close()
348 execfile(TESTFN)
349
350 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000351 global numruns
352 if numruns:
353 return
354 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000355
Walter Dörwald919497e2003-01-19 16:23:59 +0000356 globals = {'a': 1, 'b': 2}
357 locals = {'b': 200, 'c': 300}
358
359 self.assertEqual(self.__class__.z, 2)
360 globals['z'] = 0
361 execfile(TESTFN, globals)
362 self.assertEqual(globals['z'], 2)
363 locals['z'] = 0
364 execfile(TESTFN, globals, locals)
365 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000366
367 class M:
368 "Test mapping interface versus possible calls from execfile()."
369 def __init__(self):
370 self.z = 10
371 def __getitem__(self, key):
372 if key == 'z':
373 return self.z
374 raise KeyError
375 def __setitem__(self, key, value):
376 if key == 'z':
377 self.z = value
378 return
379 raise KeyError
380
381 locals = M()
382 locals['z'] = 0
383 execfile(TESTFN, globals, locals)
384 self.assertEqual(locals['z'], 2)
385
Walter Dörwald919497e2003-01-19 16:23:59 +0000386 unlink(TESTFN)
387 self.assertRaises(TypeError, execfile)
388 import os
389 self.assertRaises(IOError, execfile, os.curdir)
390 self.assertRaises(IOError, execfile, "I_dont_exist")
391
392 def test_filter(self):
393 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
394 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
395 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
396 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
397 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
398 def identity(item):
399 return 1
400 filter(identity, Squares(5))
401 self.assertRaises(TypeError, filter)
402 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000403 def __getitem__(self, index):
404 if index<4:
405 return 42
406 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000407 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
408 def badfunc():
409 pass
410 self.assertRaises(TypeError, filter, badfunc, range(5))
411
Walter Dörwaldbf517072003-01-27 15:57:14 +0000412 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000413 self.assertEqual(filter(None, (1, 2)), (1, 2))
414 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
415 self.assertRaises(TypeError, filter, 42, (1, 2))
416
Walter Dörwaldbf517072003-01-27 15:57:14 +0000417 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000418 self.assertEqual(filter(None, "12"), "12")
419 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
420 self.assertRaises(TypeError, filter, 42, "12")
421 class badstr(str):
422 def __getitem__(self, index):
423 raise ValueError
424 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000425
Walter Dörwald903f1e02003-02-04 16:28:00 +0000426 class badstr2(str):
427 def __getitem__(self, index):
428 return 42
429 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
430
431 class weirdstr(str):
432 def __getitem__(self, index):
433 return weirdstr(2*str.__getitem__(self, index))
434 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
435
Walter Dörwald5e61e242003-02-04 17:04:01 +0000436 class shiftstr(str):
437 def __getitem__(self, index):
438 return chr(ord(str.__getitem__(self, index))+1)
439 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
440
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000441 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000442 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000443 self.assertEqual(filter(None, unicode("12")), unicode("12"))
444 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
445 self.assertRaises(TypeError, filter, 42, unicode("12"))
446 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000447
Walter Dörwald903f1e02003-02-04 16:28:00 +0000448 class badunicode(unicode):
449 def __getitem__(self, index):
450 return 42
451 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
452
453 class weirdunicode(unicode):
454 def __getitem__(self, index):
455 return weirdunicode(2*unicode.__getitem__(self, index))
456 self.assertEqual(
457 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
458
Walter Dörwald5e61e242003-02-04 17:04:01 +0000459 class shiftunicode(unicode):
460 def __getitem__(self, index):
461 return unichr(ord(unicode.__getitem__(self, index))+1)
462 self.assertEqual(
463 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
464 unicode("345")
465 )
466
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000467 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000468 # test that filter() never returns tuple, str or unicode subclasses
469 # and that the result always goes through __getitem__
470 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000471 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000472 def __getitem__(self, index):
473 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000474 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000475 def __getitem__(self, index):
476 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000477 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000478 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000479 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000480 }
481 if have_unicode:
482 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000483 def __getitem__(self, index):
484 return 2*unicode.__getitem__(self, index)
485 inputs[unicode2] = {
486 unicode(): unicode(),
487 unicode("123"): unicode("112233")
488 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000489
Walter Dörwald1918f772003-02-10 13:19:13 +0000490 for (cls, inps) in inputs.iteritems():
491 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000492 # make sure the output goes through __getitem__
493 # even if func is None
494 self.assertEqual(
495 filter(funcs[0], cls(inp)),
496 filter(funcs[1], cls(inp))
497 )
498 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000499 outp = filter(func, cls(inp))
500 self.assertEqual(outp, exp)
501 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000502
Walter Dörwald919497e2003-01-19 16:23:59 +0000503 def test_float(self):
504 self.assertEqual(float(3.14), 3.14)
505 self.assertEqual(float(314), 314.0)
506 self.assertEqual(float(314L), 314.0)
507 self.assertEqual(float(" 3.14 "), 3.14)
508 if have_unicode:
509 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
510 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
511
512 def test_getattr(self):
513 import sys
514 self.assert_(getattr(sys, 'stdout') is sys.stdout)
515 self.assertRaises(TypeError, getattr, sys, 1)
516 self.assertRaises(TypeError, getattr, sys, 1, "foo")
517 self.assertRaises(TypeError, getattr)
518 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
519
520 def test_hasattr(self):
521 import sys
522 self.assert_(hasattr(sys, 'stdout'))
523 self.assertRaises(TypeError, hasattr, sys, 1)
524 self.assertRaises(TypeError, hasattr)
525 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
526
527 def test_hash(self):
528 hash(None)
529 self.assertEqual(hash(1), hash(1L))
530 self.assertEqual(hash(1), hash(1.0))
531 hash('spam')
532 if have_unicode:
533 self.assertEqual(hash('spam'), hash(unicode('spam')))
534 hash((0,1,2,3))
535 def f(): pass
536 self.assertRaises(TypeError, hash, [])
537 self.assertRaises(TypeError, hash, {})
538
539 def test_hex(self):
540 self.assertEqual(hex(16), '0x10')
541 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000542 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000543 self.assertEqual(hex(-16L), '-0x10L')
544 self.assertRaises(TypeError, hex, {})
545
546 def test_id(self):
547 id(None)
548 id(1)
549 id(1L)
550 id(1.0)
551 id('spam')
552 id((0,1,2,3))
553 id([0,1,2,3])
554 id({'spam': 1, 'eggs': 2, 'ham': 3})
555
556 # Test input() later, together with raw_input
557
558 def test_int(self):
559 self.assertEqual(int(314), 314)
560 self.assertEqual(int(3.14), 3)
561 self.assertEqual(int(314L), 314)
562 # Check that conversion from float truncates towards zero
563 self.assertEqual(int(-3.14), -3)
564 self.assertEqual(int(3.9), 3)
565 self.assertEqual(int(-3.9), -3)
566 self.assertEqual(int(3.5), 3)
567 self.assertEqual(int(-3.5), -3)
568 # Different base:
569 self.assertEqual(int("10",16), 16L)
570 if have_unicode:
571 self.assertEqual(int(unicode("10"),16), 16L)
572 # Test conversion from strings and various anomalies
573 for s, v in L:
574 for sign in "", "+", "-":
575 for prefix in "", " ", "\t", " \t\t ":
576 ss = prefix + sign + s
577 vv = v
578 if sign == "-" and v is not ValueError:
579 vv = -v
580 try:
581 self.assertEqual(int(ss), vv)
582 except v:
583 pass
584
Walter Dörwald70a6b492004-02-12 17:35:32 +0000585 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000586 self.assertEqual(int(s)+1, -sys.maxint)
587 # should return long
588 int(s[1:])
589
590 # should return long
591 x = int(1e100)
592 self.assert_(isinstance(x, long))
593 x = int(-1e100)
594 self.assert_(isinstance(x, long))
595
596
597 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
598 # Worked by accident in Windows release build, but failed in debug build.
599 # Failed in all Linux builds.
600 x = -1-sys.maxint
601 self.assertEqual(x >> 1, x//2)
602
603 self.assertRaises(ValueError, int, '123\0')
604 self.assertRaises(ValueError, int, '53', 40)
605
606 x = int('1' * 600)
607 self.assert_(isinstance(x, long))
608
609 if have_unicode:
610 x = int(unichr(0x661) * 600)
611 self.assert_(isinstance(x, long))
612
613 self.assertRaises(TypeError, int, 1, 12)
614
615 self.assertEqual(int('0123', 0), 83)
616
617 def test_intern(self):
618 self.assertRaises(TypeError, intern)
619 s = "never interned before"
620 self.assert_(intern(s) is s)
621 s2 = s.swapcase().swapcase()
622 self.assert_(intern(s2) is s)
623
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000624 # Subclasses of string can't be interned, because they
625 # provide too much opportunity for insane things to happen.
626 # We don't want them in the interned dict and if they aren't
627 # actually interned, we don't want to create the appearance
628 # that they are by allowing intern() to succeeed.
629 class S(str):
630 def __hash__(self):
631 return 123
632
633 self.assertRaises(TypeError, intern, S("abc"))
634
635 # It's still safe to pass these strings to routines that
636 # call intern internally, e.g. PyObject_SetAttr().
637 s = S("abc")
638 setattr(s, s, s)
639 self.assertEqual(getattr(s, s), s)
640
Walter Dörwald919497e2003-01-19 16:23:59 +0000641 def test_iter(self):
642 self.assertRaises(TypeError, iter)
643 self.assertRaises(TypeError, iter, 42, 42)
644 lists = [("1", "2"), ["1", "2"], "12"]
645 if have_unicode:
646 lists.append(unicode("12"))
647 for l in lists:
648 i = iter(l)
649 self.assertEqual(i.next(), '1')
650 self.assertEqual(i.next(), '2')
651 self.assertRaises(StopIteration, i.next)
652
653 def test_isinstance(self):
654 class C:
655 pass
656 class D(C):
657 pass
658 class E:
659 pass
660 c = C()
661 d = D()
662 e = E()
663 self.assert_(isinstance(c, C))
664 self.assert_(isinstance(d, C))
665 self.assert_(not isinstance(e, C))
666 self.assert_(not isinstance(c, D))
667 self.assert_(not isinstance('foo', E))
668 self.assertRaises(TypeError, isinstance, E, 'foo')
669 self.assertRaises(TypeError, isinstance)
670
671 def test_issubclass(self):
672 class C:
673 pass
674 class D(C):
675 pass
676 class E:
677 pass
678 c = C()
679 d = D()
680 e = E()
681 self.assert_(issubclass(D, C))
682 self.assert_(issubclass(C, C))
683 self.assert_(not issubclass(C, D))
684 self.assertRaises(TypeError, issubclass, 'foo', E)
685 self.assertRaises(TypeError, issubclass, E, 'foo')
686 self.assertRaises(TypeError, issubclass)
687
688 def test_len(self):
689 self.assertEqual(len('123'), 3)
690 self.assertEqual(len(()), 0)
691 self.assertEqual(len((1, 2, 3, 4)), 4)
692 self.assertEqual(len([1, 2, 3, 4]), 4)
693 self.assertEqual(len({}), 0)
694 self.assertEqual(len({'a':1, 'b': 2}), 2)
695 class BadSeq:
696 def __len__(self):
697 raise ValueError
698 self.assertRaises(ValueError, len, BadSeq())
699
700 def test_list(self):
701 self.assertEqual(list([]), [])
702 l0_3 = [0, 1, 2, 3]
703 l0_3_bis = list(l0_3)
704 self.assertEqual(l0_3, l0_3_bis)
705 self.assert_(l0_3 is not l0_3_bis)
706 self.assertEqual(list(()), [])
707 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
708 self.assertEqual(list(''), [])
709 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
710
711 if sys.maxint == 0x7fffffff:
712 # This test can currently only work on 32-bit machines.
713 # XXX If/when PySequence_Length() returns a ssize_t, it should be
714 # XXX re-enabled.
715 # Verify clearing of bug #556025.
716 # This assumes that the max data size (sys.maxint) == max
717 # address size this also assumes that the address size is at
718 # least 4 bytes with 8 byte addresses, the bug is not well
719 # tested
720 #
721 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
722 # earlier due to a newlib bug. See the following mailing list
723 # thread for the details:
724
725 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
726 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
727
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000728 # This code used to segfault in Py2.4a3
729 x = []
730 x.extend(-y for y in x)
731 self.assertEqual(x, [])
732
Walter Dörwald919497e2003-01-19 16:23:59 +0000733 def test_long(self):
734 self.assertEqual(long(314), 314L)
735 self.assertEqual(long(3.14), 3L)
736 self.assertEqual(long(314L), 314L)
737 # Check that conversion from float truncates towards zero
738 self.assertEqual(long(-3.14), -3L)
739 self.assertEqual(long(3.9), 3L)
740 self.assertEqual(long(-3.9), -3L)
741 self.assertEqual(long(3.5), 3L)
742 self.assertEqual(long(-3.5), -3L)
743 self.assertEqual(long("-3"), -3L)
744 if have_unicode:
745 self.assertEqual(long(unicode("-3")), -3L)
746 # Different base:
747 self.assertEqual(long("10",16), 16L)
748 if have_unicode:
749 self.assertEqual(long(unicode("10"),16), 16L)
750 # Check conversions from string (same test set as for int(), and then some)
751 LL = [
752 ('1' + '0'*20, 10L**20),
753 ('1' + '0'*100, 10L**100)
754 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000755 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000756 if have_unicode:
757 L2 += [
758 (unicode('1') + unicode('0')*20, 10L**20),
759 (unicode('1') + unicode('0')*100, 10L**100),
760 ]
761 for s, v in L2 + LL:
762 for sign in "", "+", "-":
763 for prefix in "", " ", "\t", " \t\t ":
764 ss = prefix + sign + s
765 vv = v
766 if sign == "-" and v is not ValueError:
767 vv = -v
768 try:
769 self.assertEqual(long(ss), long(vv))
770 except v:
771 pass
772
773 self.assertRaises(ValueError, long, '123\0')
774 self.assertRaises(ValueError, long, '53', 40)
775 self.assertRaises(TypeError, long, 1, 12)
776
777 def test_map(self):
778 self.assertEqual(
779 map(None, 'hello world'),
780 ['h','e','l','l','o',' ','w','o','r','l','d']
781 )
782 self.assertEqual(
783 map(None, 'abcd', 'efg'),
784 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
785 )
786 self.assertEqual(
787 map(None, range(10)),
788 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
789 )
790 self.assertEqual(
791 map(lambda x: x*x, range(1,4)),
792 [1, 4, 9]
793 )
794 try:
795 from math import sqrt
796 except ImportError:
797 def sqrt(x):
798 return pow(x, 0.5)
799 self.assertEqual(
800 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
801 [[4.0, 2.0], [9.0, 3.0]]
802 )
803 self.assertEqual(
804 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
805 [10, 4, 6]
806 )
807
808 def plus(*v):
809 accu = 0
810 for i in v: accu = accu + i
811 return accu
812 self.assertEqual(
813 map(plus, [1, 3, 7]),
814 [1, 3, 7]
815 )
816 self.assertEqual(
817 map(plus, [1, 3, 7], [4, 9, 2]),
818 [1+4, 3+9, 7+2]
819 )
820 self.assertEqual(
821 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
822 [1+4+1, 3+9+1, 7+2+0]
823 )
824 self.assertEqual(
825 map(None, Squares(10)),
826 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
827 )
828 self.assertEqual(
829 map(int, Squares(10)),
830 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
831 )
832 self.assertEqual(
833 map(None, Squares(3), Squares(2)),
834 [(0,0), (1,1), (4,None)]
835 )
836 self.assertEqual(
837 map(max, Squares(3), Squares(2)),
838 [0, 1, 4]
839 )
840 self.assertRaises(TypeError, map)
841 self.assertRaises(TypeError, map, lambda x: x, 42)
842 self.assertEqual(map(None, [42]), [42])
843 class BadSeq:
844 def __getitem__(self, index):
845 raise ValueError
846 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
847
848 def test_max(self):
849 self.assertEqual(max('123123'), '3')
850 self.assertEqual(max(1, 2, 3), 3)
851 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
852 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
853
854 self.assertEqual(max(1, 2L, 3.0), 3.0)
855 self.assertEqual(max(1L, 2.0, 3), 3)
856 self.assertEqual(max(1.0, 2, 3L), 3L)
857
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000858 for stmt in (
859 "max(key=int)", # no args
860 "max(1, key=int)", # single arg not iterable
861 "max(1, 2, keystone=int)", # wrong keyword
862 "max(1, 2, key=int, abc=int)", # two many keywords
863 "max(1, 2, key=1)", # keyfunc is not callable
864 ):
Tim Peters7f061872004-12-07 21:17:46 +0000865 try:
866 exec(stmt) in globals()
867 except TypeError:
868 pass
869 else:
870 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000871
872 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
873 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
874 self.assertEqual(max(1, 2, key=neg), 1) # two elems
875
876 data = [random.randrange(200) for i in range(100)]
877 keys = dict((elem, random.randrange(50)) for elem in data)
878 f = keys.__getitem__
879 self.assertEqual(max(data, key=f),
880 sorted(reversed(data), key=f)[-1])
881
Walter Dörwald919497e2003-01-19 16:23:59 +0000882 def test_min(self):
883 self.assertEqual(min('123123'), '1')
884 self.assertEqual(min(1, 2, 3), 1)
885 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
886 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
887
888 self.assertEqual(min(1, 2L, 3.0), 1)
889 self.assertEqual(min(1L, 2.0, 3), 1L)
890 self.assertEqual(min(1.0, 2, 3L), 1.0)
891
892 self.assertRaises(TypeError, min)
893 self.assertRaises(TypeError, min, 42)
894 self.assertRaises(ValueError, min, ())
895 class BadSeq:
896 def __getitem__(self, index):
897 raise ValueError
898 self.assertRaises(ValueError, min, BadSeq())
899 class BadNumber:
900 def __cmp__(self, other):
901 raise ValueError
902 self.assertRaises(ValueError, min, (42, BadNumber()))
903
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000904 for stmt in (
905 "min(key=int)", # no args
906 "min(1, key=int)", # single arg not iterable
907 "min(1, 2, keystone=int)", # wrong keyword
908 "min(1, 2, key=int, abc=int)", # two many keywords
909 "min(1, 2, key=1)", # keyfunc is not callable
910 ):
Tim Peters7f061872004-12-07 21:17:46 +0000911 try:
912 exec(stmt) in globals()
913 except TypeError:
914 pass
915 else:
916 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000917
918 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
919 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
920 self.assertEqual(min(1, 2, key=neg), 2) # two elems
921
922 data = [random.randrange(200) for i in range(100)]
923 keys = dict((elem, random.randrange(50)) for elem in data)
924 f = keys.__getitem__
925 self.assertEqual(min(data, key=f),
926 sorted(data, key=f)[0])
927
Walter Dörwald919497e2003-01-19 16:23:59 +0000928 def test_oct(self):
929 self.assertEqual(oct(100), '0144')
930 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000931 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000932 self.assertEqual(oct(-100L), '-0144L')
933 self.assertRaises(TypeError, oct, ())
934
935 def write_testfile(self):
936 # NB the first 4 lines are also used to test input and raw_input, below
937 fp = open(TESTFN, 'w')
938 try:
939 fp.write('1+1\n')
940 fp.write('1+1\n')
941 fp.write('The quick brown fox jumps over the lazy dog')
942 fp.write('.\n')
943 fp.write('Dear John\n')
944 fp.write('XXX'*100)
945 fp.write('YYY'*100)
946 finally:
947 fp.close()
948
949 def test_open(self):
950 self.write_testfile()
951 fp = open(TESTFN, 'r')
952 try:
953 self.assertEqual(fp.readline(4), '1+1\n')
954 self.assertEqual(fp.readline(4), '1+1\n')
955 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
956 self.assertEqual(fp.readline(4), 'Dear')
957 self.assertEqual(fp.readline(100), ' John\n')
958 self.assertEqual(fp.read(300), 'XXX'*100)
959 self.assertEqual(fp.read(1000), 'YYY'*100)
960 finally:
961 fp.close()
962 unlink(TESTFN)
963
964 def test_ord(self):
965 self.assertEqual(ord(' '), 32)
966 self.assertEqual(ord('A'), 65)
967 self.assertEqual(ord('a'), 97)
968 if have_unicode:
969 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
970 self.assertRaises(TypeError, ord, 42)
971 self.assertRaises(TypeError, ord, unicode("12"))
972
973 def test_pow(self):
974 self.assertEqual(pow(0,0), 1)
975 self.assertEqual(pow(0,1), 0)
976 self.assertEqual(pow(1,0), 1)
977 self.assertEqual(pow(1,1), 1)
978
979 self.assertEqual(pow(2,0), 1)
980 self.assertEqual(pow(2,10), 1024)
981 self.assertEqual(pow(2,20), 1024*1024)
982 self.assertEqual(pow(2,30), 1024*1024*1024)
983
984 self.assertEqual(pow(-2,0), 1)
985 self.assertEqual(pow(-2,1), -2)
986 self.assertEqual(pow(-2,2), 4)
987 self.assertEqual(pow(-2,3), -8)
988
989 self.assertEqual(pow(0L,0), 1)
990 self.assertEqual(pow(0L,1), 0)
991 self.assertEqual(pow(1L,0), 1)
992 self.assertEqual(pow(1L,1), 1)
993
994 self.assertEqual(pow(2L,0), 1)
995 self.assertEqual(pow(2L,10), 1024)
996 self.assertEqual(pow(2L,20), 1024*1024)
997 self.assertEqual(pow(2L,30), 1024*1024*1024)
998
999 self.assertEqual(pow(-2L,0), 1)
1000 self.assertEqual(pow(-2L,1), -2)
1001 self.assertEqual(pow(-2L,2), 4)
1002 self.assertEqual(pow(-2L,3), -8)
1003
1004 self.assertAlmostEqual(pow(0.,0), 1.)
1005 self.assertAlmostEqual(pow(0.,1), 0.)
1006 self.assertAlmostEqual(pow(1.,0), 1.)
1007 self.assertAlmostEqual(pow(1.,1), 1.)
1008
1009 self.assertAlmostEqual(pow(2.,0), 1.)
1010 self.assertAlmostEqual(pow(2.,10), 1024.)
1011 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1012 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1013
1014 self.assertAlmostEqual(pow(-2.,0), 1.)
1015 self.assertAlmostEqual(pow(-2.,1), -2.)
1016 self.assertAlmostEqual(pow(-2.,2), 4.)
1017 self.assertAlmostEqual(pow(-2.,3), -8.)
1018
1019 for x in 2, 2L, 2.0:
1020 for y in 10, 10L, 10.0:
1021 for z in 1000, 1000L, 1000.0:
1022 if isinstance(x, float) or \
1023 isinstance(y, float) or \
1024 isinstance(z, float):
1025 self.assertRaises(TypeError, pow, x, y, z)
1026 else:
1027 self.assertAlmostEqual(pow(x, y, z), 24.0)
1028
1029 self.assertRaises(TypeError, pow, -1, -2, 3)
1030 self.assertRaises(ValueError, pow, 1, 2, 0)
1031 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1032 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1033 self.assertRaises(ValueError, pow, -342.43, 0.234)
1034
1035 self.assertRaises(TypeError, pow)
1036
1037 def test_range(self):
1038 self.assertEqual(range(3), [0, 1, 2])
1039 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1040 self.assertEqual(range(0), [])
1041 self.assertEqual(range(-3), [])
1042 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1043 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1044
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001045 # Now test range() with longs
1046 self.assertEqual(range(-2**100), [])
1047 self.assertEqual(range(0, -2**100), [])
1048 self.assertEqual(range(0, 2**100, -1), [])
1049 self.assertEqual(range(0, 2**100, -1), [])
1050
1051 a = long(10 * sys.maxint)
1052 b = long(100 * sys.maxint)
1053 c = long(50 * sys.maxint)
1054
1055 self.assertEqual(range(a, a+2), [a, a+1])
1056 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1057 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1058
1059 seq = range(a, b, c)
1060 self.assert_(a in seq)
1061 self.assert_(b not in seq)
1062 self.assertEqual(len(seq), 2)
1063
1064 seq = range(b, a, -c)
1065 self.assert_(b in seq)
1066 self.assert_(a not in seq)
1067 self.assertEqual(len(seq), 2)
1068
1069 seq = range(-a, -b, -c)
1070 self.assert_(-a in seq)
1071 self.assert_(-b not in seq)
1072 self.assertEqual(len(seq), 2)
1073
Walter Dörwald919497e2003-01-19 16:23:59 +00001074 self.assertRaises(TypeError, range)
1075 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1076 self.assertRaises(ValueError, range, 1, 2, 0)
1077
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001078 # Reject floats when it would require PyLongs to represent.
1079 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001080 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001081
Walter Dörwald357981e2003-04-15 18:59:28 +00001082 self.assertRaises(TypeError, range, 0, "spam")
1083 self.assertRaises(TypeError, range, 0, 42, "spam")
1084
1085 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1086 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1087
Walter Dörwald919497e2003-01-19 16:23:59 +00001088 def test_input_and_raw_input(self):
1089 self.write_testfile()
1090 fp = open(TESTFN, 'r')
1091 savestdin = sys.stdin
1092 savestdout = sys.stdout # Eats the echo
1093 try:
1094 sys.stdin = fp
1095 sys.stdout = BitBucket()
1096 self.assertEqual(input(), 2)
1097 self.assertEqual(input('testing\n'), 2)
1098 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1099 self.assertEqual(raw_input('testing\n'), 'Dear John')
1100 sys.stdin = cStringIO.StringIO("NULL\0")
1101 self.assertRaises(TypeError, input, 42, 42)
1102 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1103 self.assertEqual(input(), 'whitespace')
1104 sys.stdin = cStringIO.StringIO()
1105 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001106
1107 # SF 876178: make sure input() respect future options.
1108 sys.stdin = cStringIO.StringIO('1/2')
1109 sys.stdout = cStringIO.StringIO()
1110 exec compile('print input()', 'test_builtin_tmp', 'exec')
1111 sys.stdin.seek(0, 0)
1112 exec compile('from __future__ import division;print input()',
1113 'test_builtin_tmp', 'exec')
1114 sys.stdin.seek(0, 0)
1115 exec compile('print input()', 'test_builtin_tmp', 'exec')
1116 self.assertEqual(sys.stdout.getvalue().splitlines(),
1117 ['0', '0.5', '0'])
1118
Walter Dörwald919497e2003-01-19 16:23:59 +00001119 del sys.stdout
1120 self.assertRaises(RuntimeError, input, 'prompt')
1121 del sys.stdin
1122 self.assertRaises(RuntimeError, input, 'prompt')
1123 finally:
1124 sys.stdin = savestdin
1125 sys.stdout = savestdout
1126 fp.close()
1127 unlink(TESTFN)
1128
1129 def test_reduce(self):
1130 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1131 self.assertEqual(
1132 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1133 ['a','c','d','w']
1134 )
1135 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1136 self.assertEqual(
1137 reduce(lambda x, y: x*y, range(2,21), 1L),
1138 2432902008176640000L
1139 )
1140 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1141 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1142 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1143 self.assertRaises(TypeError, reduce)
1144 self.assertRaises(TypeError, reduce, 42, 42)
1145 self.assertRaises(TypeError, reduce, 42, 42, 42)
1146 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1147 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1148 self.assertRaises(TypeError, reduce, 42, (42, 42))
1149
1150 class BadSeq:
1151 def __getitem__(self, index):
1152 raise ValueError
1153 self.assertRaises(ValueError, reduce, 42, BadSeq())
1154
1155 def test_reload(self):
1156 import marshal
1157 reload(marshal)
1158 import string
1159 reload(string)
1160 ## import sys
1161 ## self.assertRaises(ImportError, reload, sys)
1162
1163 def test_repr(self):
1164 self.assertEqual(repr(''), '\'\'')
1165 self.assertEqual(repr(0), '0')
1166 self.assertEqual(repr(0L), '0L')
1167 self.assertEqual(repr(()), '()')
1168 self.assertEqual(repr([]), '[]')
1169 self.assertEqual(repr({}), '{}')
1170 a = []
1171 a.append(a)
1172 self.assertEqual(repr(a), '[[...]]')
1173 a = {}
1174 a[0] = a
1175 self.assertEqual(repr(a), '{0: {...}}')
1176
1177 def test_round(self):
1178 self.assertEqual(round(0.0), 0.0)
1179 self.assertEqual(round(1.0), 1.0)
1180 self.assertEqual(round(10.0), 10.0)
1181 self.assertEqual(round(1000000000.0), 1000000000.0)
1182 self.assertEqual(round(1e20), 1e20)
1183
1184 self.assertEqual(round(-1.0), -1.0)
1185 self.assertEqual(round(-10.0), -10.0)
1186 self.assertEqual(round(-1000000000.0), -1000000000.0)
1187 self.assertEqual(round(-1e20), -1e20)
1188
1189 self.assertEqual(round(0.1), 0.0)
1190 self.assertEqual(round(1.1), 1.0)
1191 self.assertEqual(round(10.1), 10.0)
1192 self.assertEqual(round(1000000000.1), 1000000000.0)
1193
1194 self.assertEqual(round(-1.1), -1.0)
1195 self.assertEqual(round(-10.1), -10.0)
1196 self.assertEqual(round(-1000000000.1), -1000000000.0)
1197
1198 self.assertEqual(round(0.9), 1.0)
1199 self.assertEqual(round(9.9), 10.0)
1200 self.assertEqual(round(999999999.9), 1000000000.0)
1201
1202 self.assertEqual(round(-0.9), -1.0)
1203 self.assertEqual(round(-9.9), -10.0)
1204 self.assertEqual(round(-999999999.9), -1000000000.0)
1205
1206 self.assertEqual(round(-8.0, -1), -10.0)
1207
1208 self.assertRaises(TypeError, round)
1209
1210 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001211 setattr(sys, 'spam', 1)
1212 self.assertEqual(sys.spam, 1)
1213 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1214 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001215
1216 def test_str(self):
1217 self.assertEqual(str(''), '')
1218 self.assertEqual(str(0), '0')
1219 self.assertEqual(str(0L), '0')
1220 self.assertEqual(str(()), '()')
1221 self.assertEqual(str([]), '[]')
1222 self.assertEqual(str({}), '{}')
1223 a = []
1224 a.append(a)
1225 self.assertEqual(str(a), '[[...]]')
1226 a = {}
1227 a[0] = a
1228 self.assertEqual(str(a), '{0: {...}}')
1229
Alex Martellia70b1912003-04-22 08:12:33 +00001230 def test_sum(self):
1231 self.assertEqual(sum([]), 0)
1232 self.assertEqual(sum(range(2,8)), 27)
1233 self.assertEqual(sum(iter(range(2,8))), 27)
1234 self.assertEqual(sum(Squares(10)), 285)
1235 self.assertEqual(sum(iter(Squares(10))), 285)
1236 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1237
1238 self.assertRaises(TypeError, sum)
1239 self.assertRaises(TypeError, sum, 42)
1240 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1241 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1242 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1243 self.assertRaises(TypeError, sum, [{2:3}])
1244 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1245
1246 class BadSeq:
1247 def __getitem__(self, index):
1248 raise ValueError
1249 self.assertRaises(ValueError, sum, BadSeq())
1250
Walter Dörwald919497e2003-01-19 16:23:59 +00001251 def test_tuple(self):
1252 self.assertEqual(tuple(()), ())
1253 t0_3 = (0, 1, 2, 3)
1254 t0_3_bis = tuple(t0_3)
1255 self.assert_(t0_3 is t0_3_bis)
1256 self.assertEqual(tuple([]), ())
1257 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1258 self.assertEqual(tuple(''), ())
1259 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1260
1261 def test_type(self):
1262 self.assertEqual(type(''), type('123'))
1263 self.assertNotEqual(type(''), type(()))
1264
1265 def test_unichr(self):
1266 if have_unicode:
1267 self.assertEqual(unichr(32), unicode(' '))
1268 self.assertEqual(unichr(65), unicode('A'))
1269 self.assertEqual(unichr(97), unicode('a'))
1270 self.assertEqual(
1271 unichr(sys.maxunicode),
1272 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1273 )
1274 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1275 self.assertRaises(TypeError, unichr)
1276
1277 def get_vars_f0():
1278 return vars()
1279 # we don't want self in vars(), so use staticmethod
1280 get_vars_f0 = staticmethod(get_vars_f0)
1281
1282 def get_vars_f2():
1283 BuiltinTest.get_vars_f0()
1284 a = 1
1285 b = 2
1286 return vars()
1287 get_vars_f2 = staticmethod(get_vars_f2)
1288
1289 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001290 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001291 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001292 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001293 self.assertEqual(self.get_vars_f0(), {})
1294 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1295 self.assertRaises(TypeError, vars, 42, 42)
1296 self.assertRaises(TypeError, vars, 42)
1297
1298 def test_zip(self):
1299 a = (1, 2, 3)
1300 b = (4, 5, 6)
1301 t = [(1, 4), (2, 5), (3, 6)]
1302 self.assertEqual(zip(a, b), t)
1303 b = [4, 5, 6]
1304 self.assertEqual(zip(a, b), t)
1305 b = (4, 5, 6, 7)
1306 self.assertEqual(zip(a, b), t)
1307 class I:
1308 def __getitem__(self, i):
1309 if i < 0 or i > 2: raise IndexError
1310 return i + 4
1311 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001312 self.assertEqual(zip(), [])
1313 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001314 self.assertRaises(TypeError, zip, None)
1315 class G:
1316 pass
1317 self.assertRaises(TypeError, zip, a, G())
1318
1319 # Make sure zip doesn't try to allocate a billion elements for the
1320 # result list when one of its arguments doesn't say how long it is.
1321 # A MemoryError is the most likely failure mode.
1322 class SequenceWithoutALength:
1323 def __getitem__(self, i):
1324 if i == 5:
1325 raise IndexError
1326 else:
1327 return i
1328 self.assertEqual(
1329 zip(SequenceWithoutALength(), xrange(2**30)),
1330 list(enumerate(range(5)))
1331 )
1332
1333 class BadSeq:
1334 def __getitem__(self, i):
1335 if i == 5:
1336 raise ValueError
1337 else:
1338 return i
1339 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1340
Raymond Hettinger64958a12003-12-17 20:43:33 +00001341class TestSorted(unittest.TestCase):
1342
1343 def test_basic(self):
1344 data = range(100)
1345 copy = data[:]
1346 random.shuffle(copy)
1347 self.assertEqual(data, sorted(copy))
1348 self.assertNotEqual(data, copy)
1349
1350 data.reverse()
1351 random.shuffle(copy)
1352 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1353 self.assertNotEqual(data, copy)
1354 random.shuffle(copy)
1355 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1356 self.assertNotEqual(data, copy)
1357 random.shuffle(copy)
1358 self.assertEqual(data, sorted(copy, reverse=1))
1359 self.assertNotEqual(data, copy)
1360
1361 def test_inputtypes(self):
1362 s = 'abracadabra'
1363 for T in [unicode, list, tuple]:
1364 self.assertEqual(sorted(s), sorted(T(s)))
1365
1366 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
1367 for T in [unicode, set, frozenset, list, tuple, dict.fromkeys]:
1368 self.assertEqual(sorted(s), sorted(T(s)))
1369
1370 def test_baddecorator(self):
1371 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1372 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1373
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001374def test_main(verbose=None):
1375 test_classes = (BuiltinTest, TestSorted)
1376
1377 run_unittest(*test_classes)
1378
1379 # verify reference counting
1380 if verbose and hasattr(sys, "gettotalrefcount"):
1381 import gc
1382 counts = [None] * 5
1383 for i in xrange(len(counts)):
1384 run_unittest(*test_classes)
1385 gc.collect()
1386 counts[i] = sys.gettotalrefcount()
1387 print counts
1388
Walter Dörwald919497e2003-01-19 16:23:59 +00001389
1390if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001391 test_main(verbose=True)