blob: bc5afdcb41e190ed17a09c103e503fdc08873b61 [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
4from test.test_support import fcmp, have_unicode, TESTFN, unlink
Guido van Rossum3bead091992-01-27 17:00:37 +00005
Raymond Hettinger214b1c32004-07-02 06:41:07 +00006import sys, warnings, cStringIO, random, UserDict
Walter Dörwald919497e2003-01-19 16:23:59 +00007warnings.filterwarnings("ignore", "hex../oct.. of negative int",
8 FutureWarning, __name__)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00009warnings.filterwarnings("ignore", "integer argument expected",
10 DeprecationWarning, "unittest")
Guido van Rossum3bead091992-01-27 17:00:37 +000011
Walter Dörwald919497e2003-01-19 16:23:59 +000012class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000013
Walter Dörwald919497e2003-01-19 16:23:59 +000014 def __init__(self, max):
15 self.max = max
16 self.sofar = []
17
18 def __len__(self): return len(self.sofar)
19
20 def __getitem__(self, i):
21 if not 0 <= i < self.max: raise IndexError
22 n = len(self.sofar)
23 while n <= i:
24 self.sofar.append(n*n)
25 n += 1
26 return self.sofar[i]
27
28class StrSquares:
29
30 def __init__(self, max):
31 self.max = max
32 self.sofar = []
33
34 def __len__(self):
35 return len(self.sofar)
36
37 def __getitem__(self, i):
38 if not 0 <= i < self.max:
39 raise IndexError
40 n = len(self.sofar)
41 while n <= i:
42 self.sofar.append(str(n*n))
43 n += 1
44 return self.sofar[i]
45
46class BitBucket:
47 def write(self, line):
48 pass
49
50L = [
51 ('0', 0),
52 ('1', 1),
53 ('9', 9),
54 ('10', 10),
55 ('99', 99),
56 ('100', 100),
57 ('314', 314),
58 (' 314', 314),
59 ('314 ', 314),
60 (' \t\t 314 \t\t ', 314),
Walter Dörwald70a6b492004-02-12 17:35:32 +000061 (repr(sys.maxint), sys.maxint),
Walter Dörwald919497e2003-01-19 16:23:59 +000062 (' 1x', ValueError),
63 (' 1 ', 1),
64 (' 1\02 ', ValueError),
65 ('', ValueError),
66 (' ', ValueError),
67 (' \t\t ', ValueError)
68]
69if have_unicode:
70 L += [
71 (unicode('0'), 0),
72 (unicode('1'), 1),
73 (unicode('9'), 9),
74 (unicode('10'), 10),
75 (unicode('99'), 99),
76 (unicode('100'), 100),
77 (unicode('314'), 314),
78 (unicode(' 314'), 314),
79 (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
80 (unicode(' \t\t 314 \t\t '), 314),
81 (unicode(' 1x'), ValueError),
82 (unicode(' 1 '), 1),
83 (unicode(' 1\02 '), ValueError),
84 (unicode(''), ValueError),
85 (unicode(' '), ValueError),
86 (unicode(' \t\t '), ValueError),
87 (unichr(0x200), ValueError),
88]
89
90class BuiltinTest(unittest.TestCase):
91
92 def test_import(self):
93 __import__('sys')
94 __import__('time')
95 __import__('string')
96 self.assertRaises(ImportError, __import__, 'spamspam')
97 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
98
99 def test_abs(self):
100 # int
101 self.assertEqual(abs(0), 0)
102 self.assertEqual(abs(1234), 1234)
103 self.assertEqual(abs(-1234), 1234)
104 # float
105 self.assertEqual(abs(0.0), 0.0)
106 self.assertEqual(abs(3.14), 3.14)
107 self.assertEqual(abs(-3.14), 3.14)
108 # long
109 self.assertEqual(abs(0L), 0L)
110 self.assertEqual(abs(1234L), 1234L)
111 self.assertEqual(abs(-1234L), 1234L)
112 # str
113 self.assertRaises(TypeError, abs, 'a')
114
115 def test_apply(self):
116 def f0(*args):
117 self.assertEqual(args, ())
118 def f1(a1):
119 self.assertEqual(a1, 1)
120 def f2(a1, a2):
121 self.assertEqual(a1, 1)
122 self.assertEqual(a2, 2)
123 def f3(a1, a2, a3):
124 self.assertEqual(a1, 1)
125 self.assertEqual(a2, 2)
126 self.assertEqual(a3, 3)
127 apply(f0, ())
128 apply(f1, (1,))
129 apply(f2, (1, 2))
130 apply(f3, (1, 2, 3))
131
132 # A PyCFunction that takes only positional parameters should allow an
133 # empty keyword dictionary to pass without a complaint, but raise a
134 # TypeError if the dictionary is non-empty.
135 apply(id, (1,), {})
136 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
137 self.assertRaises(TypeError, apply)
138 self.assertRaises(TypeError, apply, id, 42)
139 self.assertRaises(TypeError, apply, id, (42,), 42)
140
141 def test_callable(self):
142 self.assert_(callable(len))
143 def f(): pass
144 self.assert_(callable(f))
145 class C:
146 def meth(self): pass
147 self.assert_(callable(C))
148 x = C()
149 self.assert_(callable(x.meth))
150 self.assert_(not callable(x))
151 class D(C):
152 def __call__(self): pass
153 y = D()
154 self.assert_(callable(y))
155 y()
156
157 def test_chr(self):
158 self.assertEqual(chr(32), ' ')
159 self.assertEqual(chr(65), 'A')
160 self.assertEqual(chr(97), 'a')
161 self.assertEqual(chr(0xff), '\xff')
162 self.assertRaises(ValueError, chr, 256)
163 self.assertRaises(TypeError, chr)
164
165 def test_cmp(self):
166 self.assertEqual(cmp(-1, 1), -1)
167 self.assertEqual(cmp(1, -1), 1)
168 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000169 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000170 a = []; a.append(a)
171 b = []; b.append(b)
172 from UserList import UserList
173 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000174 self.assertRaises(RuntimeError, cmp, a, b)
175 self.assertRaises(RuntimeError, cmp, b, c)
176 self.assertRaises(RuntimeError, cmp, c, a)
177 self.assertRaises(RuntimeError, cmp, a, c)
178 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000179 a.pop(); b.pop(); c.pop()
180 self.assertRaises(TypeError, cmp)
181
182 def test_coerce(self):
183 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
184 self.assertEqual(coerce(1, 1L), (1L, 1L))
185 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
186 self.assertRaises(TypeError, coerce)
187 class BadNumber:
188 def __coerce__(self, other):
189 raise ValueError
190 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000191 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000192
193 def test_compile(self):
194 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000195 bom = '\xef\xbb\xbf'
196 compile(bom + 'print 1\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000197 self.assertRaises(TypeError, compile)
198 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
199 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000200 if have_unicode:
201 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000202
Walter Dörwald919497e2003-01-19 16:23:59 +0000203 def test_delattr(self):
204 import sys
205 sys.spam = 1
206 delattr(sys, 'spam')
207 self.assertRaises(TypeError, delattr)
208
209 def test_dir(self):
210 x = 1
211 self.assert_('x' in dir())
212 import sys
213 self.assert_('modules' in dir(sys))
214 self.assertRaises(TypeError, dir, 42, 42)
215
216 def test_divmod(self):
217 self.assertEqual(divmod(12, 7), (1, 5))
218 self.assertEqual(divmod(-12, 7), (-2, 2))
219 self.assertEqual(divmod(12, -7), (-2, -2))
220 self.assertEqual(divmod(-12, -7), (1, -5))
221
222 self.assertEqual(divmod(12L, 7L), (1L, 5L))
223 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
224 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
225 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
226
227 self.assertEqual(divmod(12, 7L), (1, 5L))
228 self.assertEqual(divmod(-12, 7L), (-2, 2L))
229 self.assertEqual(divmod(12L, -7), (-2L, -2))
230 self.assertEqual(divmod(-12L, -7), (1L, -5))
231
232 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
233 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
234 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
235 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
236
237 self.assertRaises(TypeError, divmod)
238
239 def test_eval(self):
240 self.assertEqual(eval('1+1'), 2)
241 self.assertEqual(eval(' 1+1\n'), 2)
242 globals = {'a': 1, 'b': 2}
243 locals = {'b': 200, 'c': 300}
244 self.assertEqual(eval('a', globals) , 1)
245 self.assertEqual(eval('a', globals, locals), 1)
246 self.assertEqual(eval('b', globals, locals), 200)
247 self.assertEqual(eval('c', globals, locals), 300)
248 if have_unicode:
249 self.assertEqual(eval(unicode('1+1')), 2)
250 self.assertEqual(eval(unicode(' 1+1\n')), 2)
251 globals = {'a': 1, 'b': 2}
252 locals = {'b': 200, 'c': 300}
253 if have_unicode:
254 self.assertEqual(eval(unicode('a'), globals), 1)
255 self.assertEqual(eval(unicode('a'), globals, locals), 1)
256 self.assertEqual(eval(unicode('b'), globals, locals), 200)
257 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000258 bom = '\xef\xbb\xbf'
259 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000260 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
261 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000262 self.assertRaises(TypeError, eval)
263 self.assertRaises(TypeError, eval, ())
264
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000265 def test_general_eval(self):
266 # Tests that general mappings can be used for the locals argument
267
268 class M:
269 "Test mapping interface versus possible calls from eval()."
270 def __getitem__(self, key):
271 if key == 'a':
272 return 12
273 raise KeyError
274 def keys(self):
275 return list('xyz')
276
277 m = M()
278 g = globals()
279 self.assertEqual(eval('a', g, m), 12)
280 self.assertRaises(NameError, eval, 'b', g, m)
281 self.assertEqual(eval('dir()', g, m), list('xyz'))
282 self.assertEqual(eval('globals()', g, m), g)
283 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000284 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000285 class A:
286 "Non-mapping"
287 pass
288 m = A()
289 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000290
291 # Verify that dict subclasses work as well
292 class D(dict):
293 def __getitem__(self, key):
294 if key == 'a':
295 return 12
296 return dict.__getitem__(self, key)
297 def keys(self):
298 return list('xyz')
299
300 d = D()
301 self.assertEqual(eval('a', g, d), 12)
302 self.assertRaises(NameError, eval, 'b', g, d)
303 self.assertEqual(eval('dir()', g, d), list('xyz'))
304 self.assertEqual(eval('globals()', g, d), g)
305 self.assertEqual(eval('locals()', g, d), d)
306
307 # Verify locals stores (used by list comps)
308 eval('[locals() for i in (2,3)]', g, d)
309 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
310
311 class SpreadSheet:
312 "Sample application showing nested, calculated lookups."
313 _cells = {}
314 def __setitem__(self, key, formula):
315 self._cells[key] = formula
316 def __getitem__(self, key ):
317 return eval(self._cells[key], globals(), self)
318
319 ss = SpreadSheet()
320 ss['a1'] = '5'
321 ss['a2'] = 'a1*6'
322 ss['a3'] = 'a2*7'
323 self.assertEqual(ss['a3'], 210)
324
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000325 # Verify that dir() catches a non-list returned by eval
326 # SF bug #1004669
327 class C:
328 def __getitem__(self, item):
329 raise KeyError(item)
330 def keys(self):
331 return 'a'
332 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
333
Walter Dörwald919497e2003-01-19 16:23:59 +0000334 # Done outside of the method test_z to get the correct scope
335 z = 0
336 f = open(TESTFN, 'w')
337 f.write('z = z+1\n')
338 f.write('z = z*2\n')
339 f.close()
340 execfile(TESTFN)
341
342 def test_execfile(self):
343 globals = {'a': 1, 'b': 2}
344 locals = {'b': 200, 'c': 300}
345
346 self.assertEqual(self.__class__.z, 2)
347 globals['z'] = 0
348 execfile(TESTFN, globals)
349 self.assertEqual(globals['z'], 2)
350 locals['z'] = 0
351 execfile(TESTFN, globals, locals)
352 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000353
354 class M:
355 "Test mapping interface versus possible calls from execfile()."
356 def __init__(self):
357 self.z = 10
358 def __getitem__(self, key):
359 if key == 'z':
360 return self.z
361 raise KeyError
362 def __setitem__(self, key, value):
363 if key == 'z':
364 self.z = value
365 return
366 raise KeyError
367
368 locals = M()
369 locals['z'] = 0
370 execfile(TESTFN, globals, locals)
371 self.assertEqual(locals['z'], 2)
372
Walter Dörwald919497e2003-01-19 16:23:59 +0000373 unlink(TESTFN)
374 self.assertRaises(TypeError, execfile)
375 import os
376 self.assertRaises(IOError, execfile, os.curdir)
377 self.assertRaises(IOError, execfile, "I_dont_exist")
378
379 def test_filter(self):
380 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
381 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
382 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
383 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
384 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
385 def identity(item):
386 return 1
387 filter(identity, Squares(5))
388 self.assertRaises(TypeError, filter)
389 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000390 def __getitem__(self, index):
391 if index<4:
392 return 42
393 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000394 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
395 def badfunc():
396 pass
397 self.assertRaises(TypeError, filter, badfunc, range(5))
398
Walter Dörwaldbf517072003-01-27 15:57:14 +0000399 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000400 self.assertEqual(filter(None, (1, 2)), (1, 2))
401 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
402 self.assertRaises(TypeError, filter, 42, (1, 2))
403
Walter Dörwaldbf517072003-01-27 15:57:14 +0000404 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000405 self.assertEqual(filter(None, "12"), "12")
406 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
407 self.assertRaises(TypeError, filter, 42, "12")
408 class badstr(str):
409 def __getitem__(self, index):
410 raise ValueError
411 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000412
Walter Dörwald903f1e02003-02-04 16:28:00 +0000413 class badstr2(str):
414 def __getitem__(self, index):
415 return 42
416 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
417
418 class weirdstr(str):
419 def __getitem__(self, index):
420 return weirdstr(2*str.__getitem__(self, index))
421 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
422
Walter Dörwald5e61e242003-02-04 17:04:01 +0000423 class shiftstr(str):
424 def __getitem__(self, index):
425 return chr(ord(str.__getitem__(self, index))+1)
426 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
427
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000428 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000429 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000430 self.assertEqual(filter(None, unicode("12")), unicode("12"))
431 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
432 self.assertRaises(TypeError, filter, 42, unicode("12"))
433 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000434
Walter Dörwald903f1e02003-02-04 16:28:00 +0000435 class badunicode(unicode):
436 def __getitem__(self, index):
437 return 42
438 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
439
440 class weirdunicode(unicode):
441 def __getitem__(self, index):
442 return weirdunicode(2*unicode.__getitem__(self, index))
443 self.assertEqual(
444 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
445
Walter Dörwald5e61e242003-02-04 17:04:01 +0000446 class shiftunicode(unicode):
447 def __getitem__(self, index):
448 return unichr(ord(unicode.__getitem__(self, index))+1)
449 self.assertEqual(
450 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
451 unicode("345")
452 )
453
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000454 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000455 # test that filter() never returns tuple, str or unicode subclasses
456 # and that the result always goes through __getitem__
457 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000458 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000459 def __getitem__(self, index):
460 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000461 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000462 def __getitem__(self, index):
463 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000464 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000465 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000466 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000467 }
468 if have_unicode:
469 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000470 def __getitem__(self, index):
471 return 2*unicode.__getitem__(self, index)
472 inputs[unicode2] = {
473 unicode(): unicode(),
474 unicode("123"): unicode("112233")
475 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000476
Walter Dörwald1918f772003-02-10 13:19:13 +0000477 for (cls, inps) in inputs.iteritems():
478 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000479 # make sure the output goes through __getitem__
480 # even if func is None
481 self.assertEqual(
482 filter(funcs[0], cls(inp)),
483 filter(funcs[1], cls(inp))
484 )
485 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000486 outp = filter(func, cls(inp))
487 self.assertEqual(outp, exp)
488 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000489
Walter Dörwald919497e2003-01-19 16:23:59 +0000490 def test_float(self):
491 self.assertEqual(float(3.14), 3.14)
492 self.assertEqual(float(314), 314.0)
493 self.assertEqual(float(314L), 314.0)
494 self.assertEqual(float(" 3.14 "), 3.14)
495 if have_unicode:
496 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
497 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
498
499 def test_getattr(self):
500 import sys
501 self.assert_(getattr(sys, 'stdout') is sys.stdout)
502 self.assertRaises(TypeError, getattr, sys, 1)
503 self.assertRaises(TypeError, getattr, sys, 1, "foo")
504 self.assertRaises(TypeError, getattr)
505 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
506
507 def test_hasattr(self):
508 import sys
509 self.assert_(hasattr(sys, 'stdout'))
510 self.assertRaises(TypeError, hasattr, sys, 1)
511 self.assertRaises(TypeError, hasattr)
512 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
513
514 def test_hash(self):
515 hash(None)
516 self.assertEqual(hash(1), hash(1L))
517 self.assertEqual(hash(1), hash(1.0))
518 hash('spam')
519 if have_unicode:
520 self.assertEqual(hash('spam'), hash(unicode('spam')))
521 hash((0,1,2,3))
522 def f(): pass
523 self.assertRaises(TypeError, hash, [])
524 self.assertRaises(TypeError, hash, {})
525
526 def test_hex(self):
527 self.assertEqual(hex(16), '0x10')
528 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000529 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000530 self.assertEqual(hex(-16L), '-0x10L')
531 self.assertRaises(TypeError, hex, {})
532
533 def test_id(self):
534 id(None)
535 id(1)
536 id(1L)
537 id(1.0)
538 id('spam')
539 id((0,1,2,3))
540 id([0,1,2,3])
541 id({'spam': 1, 'eggs': 2, 'ham': 3})
542
543 # Test input() later, together with raw_input
544
545 def test_int(self):
546 self.assertEqual(int(314), 314)
547 self.assertEqual(int(3.14), 3)
548 self.assertEqual(int(314L), 314)
549 # Check that conversion from float truncates towards zero
550 self.assertEqual(int(-3.14), -3)
551 self.assertEqual(int(3.9), 3)
552 self.assertEqual(int(-3.9), -3)
553 self.assertEqual(int(3.5), 3)
554 self.assertEqual(int(-3.5), -3)
555 # Different base:
556 self.assertEqual(int("10",16), 16L)
557 if have_unicode:
558 self.assertEqual(int(unicode("10"),16), 16L)
559 # Test conversion from strings and various anomalies
560 for s, v in L:
561 for sign in "", "+", "-":
562 for prefix in "", " ", "\t", " \t\t ":
563 ss = prefix + sign + s
564 vv = v
565 if sign == "-" and v is not ValueError:
566 vv = -v
567 try:
568 self.assertEqual(int(ss), vv)
569 except v:
570 pass
571
Walter Dörwald70a6b492004-02-12 17:35:32 +0000572 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000573 self.assertEqual(int(s)+1, -sys.maxint)
574 # should return long
575 int(s[1:])
576
577 # should return long
578 x = int(1e100)
579 self.assert_(isinstance(x, long))
580 x = int(-1e100)
581 self.assert_(isinstance(x, long))
582
583
584 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
585 # Worked by accident in Windows release build, but failed in debug build.
586 # Failed in all Linux builds.
587 x = -1-sys.maxint
588 self.assertEqual(x >> 1, x//2)
589
590 self.assertRaises(ValueError, int, '123\0')
591 self.assertRaises(ValueError, int, '53', 40)
592
593 x = int('1' * 600)
594 self.assert_(isinstance(x, long))
595
596 if have_unicode:
597 x = int(unichr(0x661) * 600)
598 self.assert_(isinstance(x, long))
599
600 self.assertRaises(TypeError, int, 1, 12)
601
602 self.assertEqual(int('0123', 0), 83)
603
604 def test_intern(self):
605 self.assertRaises(TypeError, intern)
606 s = "never interned before"
607 self.assert_(intern(s) is s)
608 s2 = s.swapcase().swapcase()
609 self.assert_(intern(s2) is s)
610
611 def test_iter(self):
612 self.assertRaises(TypeError, iter)
613 self.assertRaises(TypeError, iter, 42, 42)
614 lists = [("1", "2"), ["1", "2"], "12"]
615 if have_unicode:
616 lists.append(unicode("12"))
617 for l in lists:
618 i = iter(l)
619 self.assertEqual(i.next(), '1')
620 self.assertEqual(i.next(), '2')
621 self.assertRaises(StopIteration, i.next)
622
623 def test_isinstance(self):
624 class C:
625 pass
626 class D(C):
627 pass
628 class E:
629 pass
630 c = C()
631 d = D()
632 e = E()
633 self.assert_(isinstance(c, C))
634 self.assert_(isinstance(d, C))
635 self.assert_(not isinstance(e, C))
636 self.assert_(not isinstance(c, D))
637 self.assert_(not isinstance('foo', E))
638 self.assertRaises(TypeError, isinstance, E, 'foo')
639 self.assertRaises(TypeError, isinstance)
640
641 def test_issubclass(self):
642 class C:
643 pass
644 class D(C):
645 pass
646 class E:
647 pass
648 c = C()
649 d = D()
650 e = E()
651 self.assert_(issubclass(D, C))
652 self.assert_(issubclass(C, C))
653 self.assert_(not issubclass(C, D))
654 self.assertRaises(TypeError, issubclass, 'foo', E)
655 self.assertRaises(TypeError, issubclass, E, 'foo')
656 self.assertRaises(TypeError, issubclass)
657
658 def test_len(self):
659 self.assertEqual(len('123'), 3)
660 self.assertEqual(len(()), 0)
661 self.assertEqual(len((1, 2, 3, 4)), 4)
662 self.assertEqual(len([1, 2, 3, 4]), 4)
663 self.assertEqual(len({}), 0)
664 self.assertEqual(len({'a':1, 'b': 2}), 2)
665 class BadSeq:
666 def __len__(self):
667 raise ValueError
668 self.assertRaises(ValueError, len, BadSeq())
669
670 def test_list(self):
671 self.assertEqual(list([]), [])
672 l0_3 = [0, 1, 2, 3]
673 l0_3_bis = list(l0_3)
674 self.assertEqual(l0_3, l0_3_bis)
675 self.assert_(l0_3 is not l0_3_bis)
676 self.assertEqual(list(()), [])
677 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
678 self.assertEqual(list(''), [])
679 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
680
681 if sys.maxint == 0x7fffffff:
682 # This test can currently only work on 32-bit machines.
683 # XXX If/when PySequence_Length() returns a ssize_t, it should be
684 # XXX re-enabled.
685 # Verify clearing of bug #556025.
686 # This assumes that the max data size (sys.maxint) == max
687 # address size this also assumes that the address size is at
688 # least 4 bytes with 8 byte addresses, the bug is not well
689 # tested
690 #
691 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
692 # earlier due to a newlib bug. See the following mailing list
693 # thread for the details:
694
695 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
696 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
697
698 def test_long(self):
699 self.assertEqual(long(314), 314L)
700 self.assertEqual(long(3.14), 3L)
701 self.assertEqual(long(314L), 314L)
702 # Check that conversion from float truncates towards zero
703 self.assertEqual(long(-3.14), -3L)
704 self.assertEqual(long(3.9), 3L)
705 self.assertEqual(long(-3.9), -3L)
706 self.assertEqual(long(3.5), 3L)
707 self.assertEqual(long(-3.5), -3L)
708 self.assertEqual(long("-3"), -3L)
709 if have_unicode:
710 self.assertEqual(long(unicode("-3")), -3L)
711 # Different base:
712 self.assertEqual(long("10",16), 16L)
713 if have_unicode:
714 self.assertEqual(long(unicode("10"),16), 16L)
715 # Check conversions from string (same test set as for int(), and then some)
716 LL = [
717 ('1' + '0'*20, 10L**20),
718 ('1' + '0'*100, 10L**100)
719 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000720 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000721 if have_unicode:
722 L2 += [
723 (unicode('1') + unicode('0')*20, 10L**20),
724 (unicode('1') + unicode('0')*100, 10L**100),
725 ]
726 for s, v in L2 + LL:
727 for sign in "", "+", "-":
728 for prefix in "", " ", "\t", " \t\t ":
729 ss = prefix + sign + s
730 vv = v
731 if sign == "-" and v is not ValueError:
732 vv = -v
733 try:
734 self.assertEqual(long(ss), long(vv))
735 except v:
736 pass
737
738 self.assertRaises(ValueError, long, '123\0')
739 self.assertRaises(ValueError, long, '53', 40)
740 self.assertRaises(TypeError, long, 1, 12)
741
742 def test_map(self):
743 self.assertEqual(
744 map(None, 'hello world'),
745 ['h','e','l','l','o',' ','w','o','r','l','d']
746 )
747 self.assertEqual(
748 map(None, 'abcd', 'efg'),
749 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
750 )
751 self.assertEqual(
752 map(None, range(10)),
753 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
754 )
755 self.assertEqual(
756 map(lambda x: x*x, range(1,4)),
757 [1, 4, 9]
758 )
759 try:
760 from math import sqrt
761 except ImportError:
762 def sqrt(x):
763 return pow(x, 0.5)
764 self.assertEqual(
765 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
766 [[4.0, 2.0], [9.0, 3.0]]
767 )
768 self.assertEqual(
769 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
770 [10, 4, 6]
771 )
772
773 def plus(*v):
774 accu = 0
775 for i in v: accu = accu + i
776 return accu
777 self.assertEqual(
778 map(plus, [1, 3, 7]),
779 [1, 3, 7]
780 )
781 self.assertEqual(
782 map(plus, [1, 3, 7], [4, 9, 2]),
783 [1+4, 3+9, 7+2]
784 )
785 self.assertEqual(
786 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
787 [1+4+1, 3+9+1, 7+2+0]
788 )
789 self.assertEqual(
790 map(None, Squares(10)),
791 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
792 )
793 self.assertEqual(
794 map(int, Squares(10)),
795 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
796 )
797 self.assertEqual(
798 map(None, Squares(3), Squares(2)),
799 [(0,0), (1,1), (4,None)]
800 )
801 self.assertEqual(
802 map(max, Squares(3), Squares(2)),
803 [0, 1, 4]
804 )
805 self.assertRaises(TypeError, map)
806 self.assertRaises(TypeError, map, lambda x: x, 42)
807 self.assertEqual(map(None, [42]), [42])
808 class BadSeq:
809 def __getitem__(self, index):
810 raise ValueError
811 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
812
813 def test_max(self):
814 self.assertEqual(max('123123'), '3')
815 self.assertEqual(max(1, 2, 3), 3)
816 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
817 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
818
819 self.assertEqual(max(1, 2L, 3.0), 3.0)
820 self.assertEqual(max(1L, 2.0, 3), 3)
821 self.assertEqual(max(1.0, 2, 3L), 3L)
822
823 def test_min(self):
824 self.assertEqual(min('123123'), '1')
825 self.assertEqual(min(1, 2, 3), 1)
826 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
827 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
828
829 self.assertEqual(min(1, 2L, 3.0), 1)
830 self.assertEqual(min(1L, 2.0, 3), 1L)
831 self.assertEqual(min(1.0, 2, 3L), 1.0)
832
833 self.assertRaises(TypeError, min)
834 self.assertRaises(TypeError, min, 42)
835 self.assertRaises(ValueError, min, ())
836 class BadSeq:
837 def __getitem__(self, index):
838 raise ValueError
839 self.assertRaises(ValueError, min, BadSeq())
840 class BadNumber:
841 def __cmp__(self, other):
842 raise ValueError
843 self.assertRaises(ValueError, min, (42, BadNumber()))
844
845 def test_oct(self):
846 self.assertEqual(oct(100), '0144')
847 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000848 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000849 self.assertEqual(oct(-100L), '-0144L')
850 self.assertRaises(TypeError, oct, ())
851
852 def write_testfile(self):
853 # NB the first 4 lines are also used to test input and raw_input, below
854 fp = open(TESTFN, 'w')
855 try:
856 fp.write('1+1\n')
857 fp.write('1+1\n')
858 fp.write('The quick brown fox jumps over the lazy dog')
859 fp.write('.\n')
860 fp.write('Dear John\n')
861 fp.write('XXX'*100)
862 fp.write('YYY'*100)
863 finally:
864 fp.close()
865
866 def test_open(self):
867 self.write_testfile()
868 fp = open(TESTFN, 'r')
869 try:
870 self.assertEqual(fp.readline(4), '1+1\n')
871 self.assertEqual(fp.readline(4), '1+1\n')
872 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
873 self.assertEqual(fp.readline(4), 'Dear')
874 self.assertEqual(fp.readline(100), ' John\n')
875 self.assertEqual(fp.read(300), 'XXX'*100)
876 self.assertEqual(fp.read(1000), 'YYY'*100)
877 finally:
878 fp.close()
879 unlink(TESTFN)
880
881 def test_ord(self):
882 self.assertEqual(ord(' '), 32)
883 self.assertEqual(ord('A'), 65)
884 self.assertEqual(ord('a'), 97)
885 if have_unicode:
886 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
887 self.assertRaises(TypeError, ord, 42)
888 self.assertRaises(TypeError, ord, unicode("12"))
889
890 def test_pow(self):
891 self.assertEqual(pow(0,0), 1)
892 self.assertEqual(pow(0,1), 0)
893 self.assertEqual(pow(1,0), 1)
894 self.assertEqual(pow(1,1), 1)
895
896 self.assertEqual(pow(2,0), 1)
897 self.assertEqual(pow(2,10), 1024)
898 self.assertEqual(pow(2,20), 1024*1024)
899 self.assertEqual(pow(2,30), 1024*1024*1024)
900
901 self.assertEqual(pow(-2,0), 1)
902 self.assertEqual(pow(-2,1), -2)
903 self.assertEqual(pow(-2,2), 4)
904 self.assertEqual(pow(-2,3), -8)
905
906 self.assertEqual(pow(0L,0), 1)
907 self.assertEqual(pow(0L,1), 0)
908 self.assertEqual(pow(1L,0), 1)
909 self.assertEqual(pow(1L,1), 1)
910
911 self.assertEqual(pow(2L,0), 1)
912 self.assertEqual(pow(2L,10), 1024)
913 self.assertEqual(pow(2L,20), 1024*1024)
914 self.assertEqual(pow(2L,30), 1024*1024*1024)
915
916 self.assertEqual(pow(-2L,0), 1)
917 self.assertEqual(pow(-2L,1), -2)
918 self.assertEqual(pow(-2L,2), 4)
919 self.assertEqual(pow(-2L,3), -8)
920
921 self.assertAlmostEqual(pow(0.,0), 1.)
922 self.assertAlmostEqual(pow(0.,1), 0.)
923 self.assertAlmostEqual(pow(1.,0), 1.)
924 self.assertAlmostEqual(pow(1.,1), 1.)
925
926 self.assertAlmostEqual(pow(2.,0), 1.)
927 self.assertAlmostEqual(pow(2.,10), 1024.)
928 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
929 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
930
931 self.assertAlmostEqual(pow(-2.,0), 1.)
932 self.assertAlmostEqual(pow(-2.,1), -2.)
933 self.assertAlmostEqual(pow(-2.,2), 4.)
934 self.assertAlmostEqual(pow(-2.,3), -8.)
935
936 for x in 2, 2L, 2.0:
937 for y in 10, 10L, 10.0:
938 for z in 1000, 1000L, 1000.0:
939 if isinstance(x, float) or \
940 isinstance(y, float) or \
941 isinstance(z, float):
942 self.assertRaises(TypeError, pow, x, y, z)
943 else:
944 self.assertAlmostEqual(pow(x, y, z), 24.0)
945
946 self.assertRaises(TypeError, pow, -1, -2, 3)
947 self.assertRaises(ValueError, pow, 1, 2, 0)
948 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
949 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
950 self.assertRaises(ValueError, pow, -342.43, 0.234)
951
952 self.assertRaises(TypeError, pow)
953
954 def test_range(self):
955 self.assertEqual(range(3), [0, 1, 2])
956 self.assertEqual(range(1, 5), [1, 2, 3, 4])
957 self.assertEqual(range(0), [])
958 self.assertEqual(range(-3), [])
959 self.assertEqual(range(1, 10, 3), [1, 4, 7])
960 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
961
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000962 # Now test range() with longs
963 self.assertEqual(range(-2**100), [])
964 self.assertEqual(range(0, -2**100), [])
965 self.assertEqual(range(0, 2**100, -1), [])
966 self.assertEqual(range(0, 2**100, -1), [])
967
968 a = long(10 * sys.maxint)
969 b = long(100 * sys.maxint)
970 c = long(50 * sys.maxint)
971
972 self.assertEqual(range(a, a+2), [a, a+1])
973 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
974 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
975
976 seq = range(a, b, c)
977 self.assert_(a in seq)
978 self.assert_(b not in seq)
979 self.assertEqual(len(seq), 2)
980
981 seq = range(b, a, -c)
982 self.assert_(b in seq)
983 self.assert_(a not in seq)
984 self.assertEqual(len(seq), 2)
985
986 seq = range(-a, -b, -c)
987 self.assert_(-a in seq)
988 self.assert_(-b not in seq)
989 self.assertEqual(len(seq), 2)
990
Walter Dörwald919497e2003-01-19 16:23:59 +0000991 self.assertRaises(TypeError, range)
992 self.assertRaises(TypeError, range, 1, 2, 3, 4)
993 self.assertRaises(ValueError, range, 1, 2, 0)
994
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000995 # Reject floats when it would require PyLongs to represent.
996 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +0000997 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000998
Walter Dörwald357981e2003-04-15 18:59:28 +0000999 self.assertRaises(TypeError, range, 0, "spam")
1000 self.assertRaises(TypeError, range, 0, 42, "spam")
1001
1002 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1003 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1004
Walter Dörwald919497e2003-01-19 16:23:59 +00001005 def test_input_and_raw_input(self):
1006 self.write_testfile()
1007 fp = open(TESTFN, 'r')
1008 savestdin = sys.stdin
1009 savestdout = sys.stdout # Eats the echo
1010 try:
1011 sys.stdin = fp
1012 sys.stdout = BitBucket()
1013 self.assertEqual(input(), 2)
1014 self.assertEqual(input('testing\n'), 2)
1015 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1016 self.assertEqual(raw_input('testing\n'), 'Dear John')
1017 sys.stdin = cStringIO.StringIO("NULL\0")
1018 self.assertRaises(TypeError, input, 42, 42)
1019 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1020 self.assertEqual(input(), 'whitespace')
1021 sys.stdin = cStringIO.StringIO()
1022 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001023
1024 # SF 876178: make sure input() respect future options.
1025 sys.stdin = cStringIO.StringIO('1/2')
1026 sys.stdout = cStringIO.StringIO()
1027 exec compile('print input()', 'test_builtin_tmp', 'exec')
1028 sys.stdin.seek(0, 0)
1029 exec compile('from __future__ import division;print input()',
1030 'test_builtin_tmp', 'exec')
1031 sys.stdin.seek(0, 0)
1032 exec compile('print input()', 'test_builtin_tmp', 'exec')
1033 self.assertEqual(sys.stdout.getvalue().splitlines(),
1034 ['0', '0.5', '0'])
1035
Walter Dörwald919497e2003-01-19 16:23:59 +00001036 del sys.stdout
1037 self.assertRaises(RuntimeError, input, 'prompt')
1038 del sys.stdin
1039 self.assertRaises(RuntimeError, input, 'prompt')
1040 finally:
1041 sys.stdin = savestdin
1042 sys.stdout = savestdout
1043 fp.close()
1044 unlink(TESTFN)
1045
1046 def test_reduce(self):
1047 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1048 self.assertEqual(
1049 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1050 ['a','c','d','w']
1051 )
1052 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1053 self.assertEqual(
1054 reduce(lambda x, y: x*y, range(2,21), 1L),
1055 2432902008176640000L
1056 )
1057 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1058 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1059 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1060 self.assertRaises(TypeError, reduce)
1061 self.assertRaises(TypeError, reduce, 42, 42)
1062 self.assertRaises(TypeError, reduce, 42, 42, 42)
1063 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1064 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1065 self.assertRaises(TypeError, reduce, 42, (42, 42))
1066
1067 class BadSeq:
1068 def __getitem__(self, index):
1069 raise ValueError
1070 self.assertRaises(ValueError, reduce, 42, BadSeq())
1071
1072 def test_reload(self):
1073 import marshal
1074 reload(marshal)
1075 import string
1076 reload(string)
1077 ## import sys
1078 ## self.assertRaises(ImportError, reload, sys)
1079
1080 def test_repr(self):
1081 self.assertEqual(repr(''), '\'\'')
1082 self.assertEqual(repr(0), '0')
1083 self.assertEqual(repr(0L), '0L')
1084 self.assertEqual(repr(()), '()')
1085 self.assertEqual(repr([]), '[]')
1086 self.assertEqual(repr({}), '{}')
1087 a = []
1088 a.append(a)
1089 self.assertEqual(repr(a), '[[...]]')
1090 a = {}
1091 a[0] = a
1092 self.assertEqual(repr(a), '{0: {...}}')
1093
1094 def test_round(self):
1095 self.assertEqual(round(0.0), 0.0)
1096 self.assertEqual(round(1.0), 1.0)
1097 self.assertEqual(round(10.0), 10.0)
1098 self.assertEqual(round(1000000000.0), 1000000000.0)
1099 self.assertEqual(round(1e20), 1e20)
1100
1101 self.assertEqual(round(-1.0), -1.0)
1102 self.assertEqual(round(-10.0), -10.0)
1103 self.assertEqual(round(-1000000000.0), -1000000000.0)
1104 self.assertEqual(round(-1e20), -1e20)
1105
1106 self.assertEqual(round(0.1), 0.0)
1107 self.assertEqual(round(1.1), 1.0)
1108 self.assertEqual(round(10.1), 10.0)
1109 self.assertEqual(round(1000000000.1), 1000000000.0)
1110
1111 self.assertEqual(round(-1.1), -1.0)
1112 self.assertEqual(round(-10.1), -10.0)
1113 self.assertEqual(round(-1000000000.1), -1000000000.0)
1114
1115 self.assertEqual(round(0.9), 1.0)
1116 self.assertEqual(round(9.9), 10.0)
1117 self.assertEqual(round(999999999.9), 1000000000.0)
1118
1119 self.assertEqual(round(-0.9), -1.0)
1120 self.assertEqual(round(-9.9), -10.0)
1121 self.assertEqual(round(-999999999.9), -1000000000.0)
1122
1123 self.assertEqual(round(-8.0, -1), -10.0)
1124
1125 self.assertRaises(TypeError, round)
1126
1127 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001128 setattr(sys, 'spam', 1)
1129 self.assertEqual(sys.spam, 1)
1130 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1131 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001132
1133 def test_str(self):
1134 self.assertEqual(str(''), '')
1135 self.assertEqual(str(0), '0')
1136 self.assertEqual(str(0L), '0')
1137 self.assertEqual(str(()), '()')
1138 self.assertEqual(str([]), '[]')
1139 self.assertEqual(str({}), '{}')
1140 a = []
1141 a.append(a)
1142 self.assertEqual(str(a), '[[...]]')
1143 a = {}
1144 a[0] = a
1145 self.assertEqual(str(a), '{0: {...}}')
1146
Alex Martellia70b1912003-04-22 08:12:33 +00001147 def test_sum(self):
1148 self.assertEqual(sum([]), 0)
1149 self.assertEqual(sum(range(2,8)), 27)
1150 self.assertEqual(sum(iter(range(2,8))), 27)
1151 self.assertEqual(sum(Squares(10)), 285)
1152 self.assertEqual(sum(iter(Squares(10))), 285)
1153 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1154
1155 self.assertRaises(TypeError, sum)
1156 self.assertRaises(TypeError, sum, 42)
1157 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1158 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1159 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1160 self.assertRaises(TypeError, sum, [{2:3}])
1161 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1162
1163 class BadSeq:
1164 def __getitem__(self, index):
1165 raise ValueError
1166 self.assertRaises(ValueError, sum, BadSeq())
1167
Walter Dörwald919497e2003-01-19 16:23:59 +00001168 def test_tuple(self):
1169 self.assertEqual(tuple(()), ())
1170 t0_3 = (0, 1, 2, 3)
1171 t0_3_bis = tuple(t0_3)
1172 self.assert_(t0_3 is t0_3_bis)
1173 self.assertEqual(tuple([]), ())
1174 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1175 self.assertEqual(tuple(''), ())
1176 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1177
1178 def test_type(self):
1179 self.assertEqual(type(''), type('123'))
1180 self.assertNotEqual(type(''), type(()))
1181
1182 def test_unichr(self):
1183 if have_unicode:
1184 self.assertEqual(unichr(32), unicode(' '))
1185 self.assertEqual(unichr(65), unicode('A'))
1186 self.assertEqual(unichr(97), unicode('a'))
1187 self.assertEqual(
1188 unichr(sys.maxunicode),
1189 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1190 )
1191 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1192 self.assertRaises(TypeError, unichr)
1193
1194 def get_vars_f0():
1195 return vars()
1196 # we don't want self in vars(), so use staticmethod
1197 get_vars_f0 = staticmethod(get_vars_f0)
1198
1199 def get_vars_f2():
1200 BuiltinTest.get_vars_f0()
1201 a = 1
1202 b = 2
1203 return vars()
1204 get_vars_f2 = staticmethod(get_vars_f2)
1205
1206 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001207 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001208 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001209 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001210 self.assertEqual(self.get_vars_f0(), {})
1211 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1212 self.assertRaises(TypeError, vars, 42, 42)
1213 self.assertRaises(TypeError, vars, 42)
1214
1215 def test_zip(self):
1216 a = (1, 2, 3)
1217 b = (4, 5, 6)
1218 t = [(1, 4), (2, 5), (3, 6)]
1219 self.assertEqual(zip(a, b), t)
1220 b = [4, 5, 6]
1221 self.assertEqual(zip(a, b), t)
1222 b = (4, 5, 6, 7)
1223 self.assertEqual(zip(a, b), t)
1224 class I:
1225 def __getitem__(self, i):
1226 if i < 0 or i > 2: raise IndexError
1227 return i + 4
1228 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001229 self.assertEqual(zip(), [])
1230 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001231 self.assertRaises(TypeError, zip, None)
1232 class G:
1233 pass
1234 self.assertRaises(TypeError, zip, a, G())
1235
1236 # Make sure zip doesn't try to allocate a billion elements for the
1237 # result list when one of its arguments doesn't say how long it is.
1238 # A MemoryError is the most likely failure mode.
1239 class SequenceWithoutALength:
1240 def __getitem__(self, i):
1241 if i == 5:
1242 raise IndexError
1243 else:
1244 return i
1245 self.assertEqual(
1246 zip(SequenceWithoutALength(), xrange(2**30)),
1247 list(enumerate(range(5)))
1248 )
1249
1250 class BadSeq:
1251 def __getitem__(self, i):
1252 if i == 5:
1253 raise ValueError
1254 else:
1255 return i
1256 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1257
Raymond Hettinger64958a12003-12-17 20:43:33 +00001258class TestSorted(unittest.TestCase):
1259
1260 def test_basic(self):
1261 data = range(100)
1262 copy = data[:]
1263 random.shuffle(copy)
1264 self.assertEqual(data, sorted(copy))
1265 self.assertNotEqual(data, copy)
1266
1267 data.reverse()
1268 random.shuffle(copy)
1269 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1270 self.assertNotEqual(data, copy)
1271 random.shuffle(copy)
1272 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1273 self.assertNotEqual(data, copy)
1274 random.shuffle(copy)
1275 self.assertEqual(data, sorted(copy, reverse=1))
1276 self.assertNotEqual(data, copy)
1277
1278 def test_inputtypes(self):
1279 s = 'abracadabra'
1280 for T in [unicode, list, tuple]:
1281 self.assertEqual(sorted(s), sorted(T(s)))
1282
1283 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
1284 for T in [unicode, set, frozenset, list, tuple, dict.fromkeys]:
1285 self.assertEqual(sorted(s), sorted(T(s)))
1286
1287 def test_baddecorator(self):
1288 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1289 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1290
Walter Dörwald919497e2003-01-19 16:23:59 +00001291def test_main():
Raymond Hettinger64958a12003-12-17 20:43:33 +00001292 test.test_support.run_unittest(BuiltinTest, TestSorted)
Walter Dörwald919497e2003-01-19 16:23:59 +00001293
1294if __name__ == "__main__":
1295 test_main()