blob: 6654f565374c39d4ae5e55ad82db319b4fc0a7b0 [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
Walter Dörwald919497e2003-01-19 16:23:59 +0000325 # Done outside of the method test_z to get the correct scope
326 z = 0
327 f = open(TESTFN, 'w')
328 f.write('z = z+1\n')
329 f.write('z = z*2\n')
330 f.close()
331 execfile(TESTFN)
332
333 def test_execfile(self):
334 globals = {'a': 1, 'b': 2}
335 locals = {'b': 200, 'c': 300}
336
337 self.assertEqual(self.__class__.z, 2)
338 globals['z'] = 0
339 execfile(TESTFN, globals)
340 self.assertEqual(globals['z'], 2)
341 locals['z'] = 0
342 execfile(TESTFN, globals, locals)
343 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000344
345 class M:
346 "Test mapping interface versus possible calls from execfile()."
347 def __init__(self):
348 self.z = 10
349 def __getitem__(self, key):
350 if key == 'z':
351 return self.z
352 raise KeyError
353 def __setitem__(self, key, value):
354 if key == 'z':
355 self.z = value
356 return
357 raise KeyError
358
359 locals = M()
360 locals['z'] = 0
361 execfile(TESTFN, globals, locals)
362 self.assertEqual(locals['z'], 2)
363
Walter Dörwald919497e2003-01-19 16:23:59 +0000364 unlink(TESTFN)
365 self.assertRaises(TypeError, execfile)
366 import os
367 self.assertRaises(IOError, execfile, os.curdir)
368 self.assertRaises(IOError, execfile, "I_dont_exist")
369
370 def test_filter(self):
371 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
372 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
373 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
374 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
375 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
376 def identity(item):
377 return 1
378 filter(identity, Squares(5))
379 self.assertRaises(TypeError, filter)
380 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000381 def __getitem__(self, index):
382 if index<4:
383 return 42
384 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000385 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
386 def badfunc():
387 pass
388 self.assertRaises(TypeError, filter, badfunc, range(5))
389
Walter Dörwaldbf517072003-01-27 15:57:14 +0000390 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000391 self.assertEqual(filter(None, (1, 2)), (1, 2))
392 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
393 self.assertRaises(TypeError, filter, 42, (1, 2))
394
Walter Dörwaldbf517072003-01-27 15:57:14 +0000395 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000396 self.assertEqual(filter(None, "12"), "12")
397 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
398 self.assertRaises(TypeError, filter, 42, "12")
399 class badstr(str):
400 def __getitem__(self, index):
401 raise ValueError
402 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000403
Walter Dörwald903f1e02003-02-04 16:28:00 +0000404 class badstr2(str):
405 def __getitem__(self, index):
406 return 42
407 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
408
409 class weirdstr(str):
410 def __getitem__(self, index):
411 return weirdstr(2*str.__getitem__(self, index))
412 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
413
Walter Dörwald5e61e242003-02-04 17:04:01 +0000414 class shiftstr(str):
415 def __getitem__(self, index):
416 return chr(ord(str.__getitem__(self, index))+1)
417 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
418
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000419 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000420 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000421 self.assertEqual(filter(None, unicode("12")), unicode("12"))
422 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
423 self.assertRaises(TypeError, filter, 42, unicode("12"))
424 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000425
Walter Dörwald903f1e02003-02-04 16:28:00 +0000426 class badunicode(unicode):
427 def __getitem__(self, index):
428 return 42
429 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
430
431 class weirdunicode(unicode):
432 def __getitem__(self, index):
433 return weirdunicode(2*unicode.__getitem__(self, index))
434 self.assertEqual(
435 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
436
Walter Dörwald5e61e242003-02-04 17:04:01 +0000437 class shiftunicode(unicode):
438 def __getitem__(self, index):
439 return unichr(ord(unicode.__getitem__(self, index))+1)
440 self.assertEqual(
441 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
442 unicode("345")
443 )
444
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000445 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000446 # test that filter() never returns tuple, str or unicode subclasses
447 # and that the result always goes through __getitem__
448 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000449 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000450 def __getitem__(self, index):
451 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000452 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000453 def __getitem__(self, index):
454 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000455 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000456 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000457 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000458 }
459 if have_unicode:
460 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000461 def __getitem__(self, index):
462 return 2*unicode.__getitem__(self, index)
463 inputs[unicode2] = {
464 unicode(): unicode(),
465 unicode("123"): unicode("112233")
466 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000467
Walter Dörwald1918f772003-02-10 13:19:13 +0000468 for (cls, inps) in inputs.iteritems():
469 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000470 # make sure the output goes through __getitem__
471 # even if func is None
472 self.assertEqual(
473 filter(funcs[0], cls(inp)),
474 filter(funcs[1], cls(inp))
475 )
476 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000477 outp = filter(func, cls(inp))
478 self.assertEqual(outp, exp)
479 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000480
Walter Dörwald919497e2003-01-19 16:23:59 +0000481 def test_float(self):
482 self.assertEqual(float(3.14), 3.14)
483 self.assertEqual(float(314), 314.0)
484 self.assertEqual(float(314L), 314.0)
485 self.assertEqual(float(" 3.14 "), 3.14)
486 if have_unicode:
487 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
488 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
489
490 def test_getattr(self):
491 import sys
492 self.assert_(getattr(sys, 'stdout') is sys.stdout)
493 self.assertRaises(TypeError, getattr, sys, 1)
494 self.assertRaises(TypeError, getattr, sys, 1, "foo")
495 self.assertRaises(TypeError, getattr)
496 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
497
498 def test_hasattr(self):
499 import sys
500 self.assert_(hasattr(sys, 'stdout'))
501 self.assertRaises(TypeError, hasattr, sys, 1)
502 self.assertRaises(TypeError, hasattr)
503 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
504
505 def test_hash(self):
506 hash(None)
507 self.assertEqual(hash(1), hash(1L))
508 self.assertEqual(hash(1), hash(1.0))
509 hash('spam')
510 if have_unicode:
511 self.assertEqual(hash('spam'), hash(unicode('spam')))
512 hash((0,1,2,3))
513 def f(): pass
514 self.assertRaises(TypeError, hash, [])
515 self.assertRaises(TypeError, hash, {})
516
517 def test_hex(self):
518 self.assertEqual(hex(16), '0x10')
519 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000520 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000521 self.assertEqual(hex(-16L), '-0x10L')
522 self.assertRaises(TypeError, hex, {})
523
524 def test_id(self):
525 id(None)
526 id(1)
527 id(1L)
528 id(1.0)
529 id('spam')
530 id((0,1,2,3))
531 id([0,1,2,3])
532 id({'spam': 1, 'eggs': 2, 'ham': 3})
533
534 # Test input() later, together with raw_input
535
536 def test_int(self):
537 self.assertEqual(int(314), 314)
538 self.assertEqual(int(3.14), 3)
539 self.assertEqual(int(314L), 314)
540 # Check that conversion from float truncates towards zero
541 self.assertEqual(int(-3.14), -3)
542 self.assertEqual(int(3.9), 3)
543 self.assertEqual(int(-3.9), -3)
544 self.assertEqual(int(3.5), 3)
545 self.assertEqual(int(-3.5), -3)
546 # Different base:
547 self.assertEqual(int("10",16), 16L)
548 if have_unicode:
549 self.assertEqual(int(unicode("10"),16), 16L)
550 # Test conversion from strings and various anomalies
551 for s, v in L:
552 for sign in "", "+", "-":
553 for prefix in "", " ", "\t", " \t\t ":
554 ss = prefix + sign + s
555 vv = v
556 if sign == "-" and v is not ValueError:
557 vv = -v
558 try:
559 self.assertEqual(int(ss), vv)
560 except v:
561 pass
562
Walter Dörwald70a6b492004-02-12 17:35:32 +0000563 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000564 self.assertEqual(int(s)+1, -sys.maxint)
565 # should return long
566 int(s[1:])
567
568 # should return long
569 x = int(1e100)
570 self.assert_(isinstance(x, long))
571 x = int(-1e100)
572 self.assert_(isinstance(x, long))
573
574
575 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
576 # Worked by accident in Windows release build, but failed in debug build.
577 # Failed in all Linux builds.
578 x = -1-sys.maxint
579 self.assertEqual(x >> 1, x//2)
580
581 self.assertRaises(ValueError, int, '123\0')
582 self.assertRaises(ValueError, int, '53', 40)
583
584 x = int('1' * 600)
585 self.assert_(isinstance(x, long))
586
587 if have_unicode:
588 x = int(unichr(0x661) * 600)
589 self.assert_(isinstance(x, long))
590
591 self.assertRaises(TypeError, int, 1, 12)
592
593 self.assertEqual(int('0123', 0), 83)
594
595 def test_intern(self):
596 self.assertRaises(TypeError, intern)
597 s = "never interned before"
598 self.assert_(intern(s) is s)
599 s2 = s.swapcase().swapcase()
600 self.assert_(intern(s2) is s)
601
602 def test_iter(self):
603 self.assertRaises(TypeError, iter)
604 self.assertRaises(TypeError, iter, 42, 42)
605 lists = [("1", "2"), ["1", "2"], "12"]
606 if have_unicode:
607 lists.append(unicode("12"))
608 for l in lists:
609 i = iter(l)
610 self.assertEqual(i.next(), '1')
611 self.assertEqual(i.next(), '2')
612 self.assertRaises(StopIteration, i.next)
613
614 def test_isinstance(self):
615 class C:
616 pass
617 class D(C):
618 pass
619 class E:
620 pass
621 c = C()
622 d = D()
623 e = E()
624 self.assert_(isinstance(c, C))
625 self.assert_(isinstance(d, C))
626 self.assert_(not isinstance(e, C))
627 self.assert_(not isinstance(c, D))
628 self.assert_(not isinstance('foo', E))
629 self.assertRaises(TypeError, isinstance, E, 'foo')
630 self.assertRaises(TypeError, isinstance)
631
632 def test_issubclass(self):
633 class C:
634 pass
635 class D(C):
636 pass
637 class E:
638 pass
639 c = C()
640 d = D()
641 e = E()
642 self.assert_(issubclass(D, C))
643 self.assert_(issubclass(C, C))
644 self.assert_(not issubclass(C, D))
645 self.assertRaises(TypeError, issubclass, 'foo', E)
646 self.assertRaises(TypeError, issubclass, E, 'foo')
647 self.assertRaises(TypeError, issubclass)
648
649 def test_len(self):
650 self.assertEqual(len('123'), 3)
651 self.assertEqual(len(()), 0)
652 self.assertEqual(len((1, 2, 3, 4)), 4)
653 self.assertEqual(len([1, 2, 3, 4]), 4)
654 self.assertEqual(len({}), 0)
655 self.assertEqual(len({'a':1, 'b': 2}), 2)
656 class BadSeq:
657 def __len__(self):
658 raise ValueError
659 self.assertRaises(ValueError, len, BadSeq())
660
661 def test_list(self):
662 self.assertEqual(list([]), [])
663 l0_3 = [0, 1, 2, 3]
664 l0_3_bis = list(l0_3)
665 self.assertEqual(l0_3, l0_3_bis)
666 self.assert_(l0_3 is not l0_3_bis)
667 self.assertEqual(list(()), [])
668 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
669 self.assertEqual(list(''), [])
670 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
671
672 if sys.maxint == 0x7fffffff:
673 # This test can currently only work on 32-bit machines.
674 # XXX If/when PySequence_Length() returns a ssize_t, it should be
675 # XXX re-enabled.
676 # Verify clearing of bug #556025.
677 # This assumes that the max data size (sys.maxint) == max
678 # address size this also assumes that the address size is at
679 # least 4 bytes with 8 byte addresses, the bug is not well
680 # tested
681 #
682 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
683 # earlier due to a newlib bug. See the following mailing list
684 # thread for the details:
685
686 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
687 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
688
689 def test_long(self):
690 self.assertEqual(long(314), 314L)
691 self.assertEqual(long(3.14), 3L)
692 self.assertEqual(long(314L), 314L)
693 # Check that conversion from float truncates towards zero
694 self.assertEqual(long(-3.14), -3L)
695 self.assertEqual(long(3.9), 3L)
696 self.assertEqual(long(-3.9), -3L)
697 self.assertEqual(long(3.5), 3L)
698 self.assertEqual(long(-3.5), -3L)
699 self.assertEqual(long("-3"), -3L)
700 if have_unicode:
701 self.assertEqual(long(unicode("-3")), -3L)
702 # Different base:
703 self.assertEqual(long("10",16), 16L)
704 if have_unicode:
705 self.assertEqual(long(unicode("10"),16), 16L)
706 # Check conversions from string (same test set as for int(), and then some)
707 LL = [
708 ('1' + '0'*20, 10L**20),
709 ('1' + '0'*100, 10L**100)
710 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000711 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000712 if have_unicode:
713 L2 += [
714 (unicode('1') + unicode('0')*20, 10L**20),
715 (unicode('1') + unicode('0')*100, 10L**100),
716 ]
717 for s, v in L2 + LL:
718 for sign in "", "+", "-":
719 for prefix in "", " ", "\t", " \t\t ":
720 ss = prefix + sign + s
721 vv = v
722 if sign == "-" and v is not ValueError:
723 vv = -v
724 try:
725 self.assertEqual(long(ss), long(vv))
726 except v:
727 pass
728
729 self.assertRaises(ValueError, long, '123\0')
730 self.assertRaises(ValueError, long, '53', 40)
731 self.assertRaises(TypeError, long, 1, 12)
732
733 def test_map(self):
734 self.assertEqual(
735 map(None, 'hello world'),
736 ['h','e','l','l','o',' ','w','o','r','l','d']
737 )
738 self.assertEqual(
739 map(None, 'abcd', 'efg'),
740 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
741 )
742 self.assertEqual(
743 map(None, range(10)),
744 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
745 )
746 self.assertEqual(
747 map(lambda x: x*x, range(1,4)),
748 [1, 4, 9]
749 )
750 try:
751 from math import sqrt
752 except ImportError:
753 def sqrt(x):
754 return pow(x, 0.5)
755 self.assertEqual(
756 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
757 [[4.0, 2.0], [9.0, 3.0]]
758 )
759 self.assertEqual(
760 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
761 [10, 4, 6]
762 )
763
764 def plus(*v):
765 accu = 0
766 for i in v: accu = accu + i
767 return accu
768 self.assertEqual(
769 map(plus, [1, 3, 7]),
770 [1, 3, 7]
771 )
772 self.assertEqual(
773 map(plus, [1, 3, 7], [4, 9, 2]),
774 [1+4, 3+9, 7+2]
775 )
776 self.assertEqual(
777 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
778 [1+4+1, 3+9+1, 7+2+0]
779 )
780 self.assertEqual(
781 map(None, Squares(10)),
782 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
783 )
784 self.assertEqual(
785 map(int, Squares(10)),
786 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
787 )
788 self.assertEqual(
789 map(None, Squares(3), Squares(2)),
790 [(0,0), (1,1), (4,None)]
791 )
792 self.assertEqual(
793 map(max, Squares(3), Squares(2)),
794 [0, 1, 4]
795 )
796 self.assertRaises(TypeError, map)
797 self.assertRaises(TypeError, map, lambda x: x, 42)
798 self.assertEqual(map(None, [42]), [42])
799 class BadSeq:
800 def __getitem__(self, index):
801 raise ValueError
802 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
803
804 def test_max(self):
805 self.assertEqual(max('123123'), '3')
806 self.assertEqual(max(1, 2, 3), 3)
807 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
808 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
809
810 self.assertEqual(max(1, 2L, 3.0), 3.0)
811 self.assertEqual(max(1L, 2.0, 3), 3)
812 self.assertEqual(max(1.0, 2, 3L), 3L)
813
814 def test_min(self):
815 self.assertEqual(min('123123'), '1')
816 self.assertEqual(min(1, 2, 3), 1)
817 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
818 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
819
820 self.assertEqual(min(1, 2L, 3.0), 1)
821 self.assertEqual(min(1L, 2.0, 3), 1L)
822 self.assertEqual(min(1.0, 2, 3L), 1.0)
823
824 self.assertRaises(TypeError, min)
825 self.assertRaises(TypeError, min, 42)
826 self.assertRaises(ValueError, min, ())
827 class BadSeq:
828 def __getitem__(self, index):
829 raise ValueError
830 self.assertRaises(ValueError, min, BadSeq())
831 class BadNumber:
832 def __cmp__(self, other):
833 raise ValueError
834 self.assertRaises(ValueError, min, (42, BadNumber()))
835
836 def test_oct(self):
837 self.assertEqual(oct(100), '0144')
838 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000839 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000840 self.assertEqual(oct(-100L), '-0144L')
841 self.assertRaises(TypeError, oct, ())
842
843 def write_testfile(self):
844 # NB the first 4 lines are also used to test input and raw_input, below
845 fp = open(TESTFN, 'w')
846 try:
847 fp.write('1+1\n')
848 fp.write('1+1\n')
849 fp.write('The quick brown fox jumps over the lazy dog')
850 fp.write('.\n')
851 fp.write('Dear John\n')
852 fp.write('XXX'*100)
853 fp.write('YYY'*100)
854 finally:
855 fp.close()
856
857 def test_open(self):
858 self.write_testfile()
859 fp = open(TESTFN, 'r')
860 try:
861 self.assertEqual(fp.readline(4), '1+1\n')
862 self.assertEqual(fp.readline(4), '1+1\n')
863 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
864 self.assertEqual(fp.readline(4), 'Dear')
865 self.assertEqual(fp.readline(100), ' John\n')
866 self.assertEqual(fp.read(300), 'XXX'*100)
867 self.assertEqual(fp.read(1000), 'YYY'*100)
868 finally:
869 fp.close()
870 unlink(TESTFN)
871
872 def test_ord(self):
873 self.assertEqual(ord(' '), 32)
874 self.assertEqual(ord('A'), 65)
875 self.assertEqual(ord('a'), 97)
876 if have_unicode:
877 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
878 self.assertRaises(TypeError, ord, 42)
879 self.assertRaises(TypeError, ord, unicode("12"))
880
881 def test_pow(self):
882 self.assertEqual(pow(0,0), 1)
883 self.assertEqual(pow(0,1), 0)
884 self.assertEqual(pow(1,0), 1)
885 self.assertEqual(pow(1,1), 1)
886
887 self.assertEqual(pow(2,0), 1)
888 self.assertEqual(pow(2,10), 1024)
889 self.assertEqual(pow(2,20), 1024*1024)
890 self.assertEqual(pow(2,30), 1024*1024*1024)
891
892 self.assertEqual(pow(-2,0), 1)
893 self.assertEqual(pow(-2,1), -2)
894 self.assertEqual(pow(-2,2), 4)
895 self.assertEqual(pow(-2,3), -8)
896
897 self.assertEqual(pow(0L,0), 1)
898 self.assertEqual(pow(0L,1), 0)
899 self.assertEqual(pow(1L,0), 1)
900 self.assertEqual(pow(1L,1), 1)
901
902 self.assertEqual(pow(2L,0), 1)
903 self.assertEqual(pow(2L,10), 1024)
904 self.assertEqual(pow(2L,20), 1024*1024)
905 self.assertEqual(pow(2L,30), 1024*1024*1024)
906
907 self.assertEqual(pow(-2L,0), 1)
908 self.assertEqual(pow(-2L,1), -2)
909 self.assertEqual(pow(-2L,2), 4)
910 self.assertEqual(pow(-2L,3), -8)
911
912 self.assertAlmostEqual(pow(0.,0), 1.)
913 self.assertAlmostEqual(pow(0.,1), 0.)
914 self.assertAlmostEqual(pow(1.,0), 1.)
915 self.assertAlmostEqual(pow(1.,1), 1.)
916
917 self.assertAlmostEqual(pow(2.,0), 1.)
918 self.assertAlmostEqual(pow(2.,10), 1024.)
919 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
920 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
921
922 self.assertAlmostEqual(pow(-2.,0), 1.)
923 self.assertAlmostEqual(pow(-2.,1), -2.)
924 self.assertAlmostEqual(pow(-2.,2), 4.)
925 self.assertAlmostEqual(pow(-2.,3), -8.)
926
927 for x in 2, 2L, 2.0:
928 for y in 10, 10L, 10.0:
929 for z in 1000, 1000L, 1000.0:
930 if isinstance(x, float) or \
931 isinstance(y, float) or \
932 isinstance(z, float):
933 self.assertRaises(TypeError, pow, x, y, z)
934 else:
935 self.assertAlmostEqual(pow(x, y, z), 24.0)
936
937 self.assertRaises(TypeError, pow, -1, -2, 3)
938 self.assertRaises(ValueError, pow, 1, 2, 0)
939 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
940 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
941 self.assertRaises(ValueError, pow, -342.43, 0.234)
942
943 self.assertRaises(TypeError, pow)
944
945 def test_range(self):
946 self.assertEqual(range(3), [0, 1, 2])
947 self.assertEqual(range(1, 5), [1, 2, 3, 4])
948 self.assertEqual(range(0), [])
949 self.assertEqual(range(-3), [])
950 self.assertEqual(range(1, 10, 3), [1, 4, 7])
951 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
952
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000953 # Now test range() with longs
954 self.assertEqual(range(-2**100), [])
955 self.assertEqual(range(0, -2**100), [])
956 self.assertEqual(range(0, 2**100, -1), [])
957 self.assertEqual(range(0, 2**100, -1), [])
958
959 a = long(10 * sys.maxint)
960 b = long(100 * sys.maxint)
961 c = long(50 * sys.maxint)
962
963 self.assertEqual(range(a, a+2), [a, a+1])
964 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
965 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
966
967 seq = range(a, b, c)
968 self.assert_(a in seq)
969 self.assert_(b not in seq)
970 self.assertEqual(len(seq), 2)
971
972 seq = range(b, a, -c)
973 self.assert_(b in seq)
974 self.assert_(a not in seq)
975 self.assertEqual(len(seq), 2)
976
977 seq = range(-a, -b, -c)
978 self.assert_(-a in seq)
979 self.assert_(-b not in seq)
980 self.assertEqual(len(seq), 2)
981
Walter Dörwald919497e2003-01-19 16:23:59 +0000982 self.assertRaises(TypeError, range)
983 self.assertRaises(TypeError, range, 1, 2, 3, 4)
984 self.assertRaises(ValueError, range, 1, 2, 0)
985
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000986 # Reject floats when it would require PyLongs to represent.
987 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +0000988 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000989
Walter Dörwald357981e2003-04-15 18:59:28 +0000990 self.assertRaises(TypeError, range, 0, "spam")
991 self.assertRaises(TypeError, range, 0, 42, "spam")
992
993 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
994 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
995
Walter Dörwald919497e2003-01-19 16:23:59 +0000996 def test_input_and_raw_input(self):
997 self.write_testfile()
998 fp = open(TESTFN, 'r')
999 savestdin = sys.stdin
1000 savestdout = sys.stdout # Eats the echo
1001 try:
1002 sys.stdin = fp
1003 sys.stdout = BitBucket()
1004 self.assertEqual(input(), 2)
1005 self.assertEqual(input('testing\n'), 2)
1006 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1007 self.assertEqual(raw_input('testing\n'), 'Dear John')
1008 sys.stdin = cStringIO.StringIO("NULL\0")
1009 self.assertRaises(TypeError, input, 42, 42)
1010 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1011 self.assertEqual(input(), 'whitespace')
1012 sys.stdin = cStringIO.StringIO()
1013 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001014
1015 # SF 876178: make sure input() respect future options.
1016 sys.stdin = cStringIO.StringIO('1/2')
1017 sys.stdout = cStringIO.StringIO()
1018 exec compile('print input()', 'test_builtin_tmp', 'exec')
1019 sys.stdin.seek(0, 0)
1020 exec compile('from __future__ import division;print input()',
1021 'test_builtin_tmp', 'exec')
1022 sys.stdin.seek(0, 0)
1023 exec compile('print input()', 'test_builtin_tmp', 'exec')
1024 self.assertEqual(sys.stdout.getvalue().splitlines(),
1025 ['0', '0.5', '0'])
1026
Walter Dörwald919497e2003-01-19 16:23:59 +00001027 del sys.stdout
1028 self.assertRaises(RuntimeError, input, 'prompt')
1029 del sys.stdin
1030 self.assertRaises(RuntimeError, input, 'prompt')
1031 finally:
1032 sys.stdin = savestdin
1033 sys.stdout = savestdout
1034 fp.close()
1035 unlink(TESTFN)
1036
1037 def test_reduce(self):
1038 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1039 self.assertEqual(
1040 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1041 ['a','c','d','w']
1042 )
1043 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1044 self.assertEqual(
1045 reduce(lambda x, y: x*y, range(2,21), 1L),
1046 2432902008176640000L
1047 )
1048 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1049 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1050 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1051 self.assertRaises(TypeError, reduce)
1052 self.assertRaises(TypeError, reduce, 42, 42)
1053 self.assertRaises(TypeError, reduce, 42, 42, 42)
1054 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1055 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1056 self.assertRaises(TypeError, reduce, 42, (42, 42))
1057
1058 class BadSeq:
1059 def __getitem__(self, index):
1060 raise ValueError
1061 self.assertRaises(ValueError, reduce, 42, BadSeq())
1062
1063 def test_reload(self):
1064 import marshal
1065 reload(marshal)
1066 import string
1067 reload(string)
1068 ## import sys
1069 ## self.assertRaises(ImportError, reload, sys)
1070
1071 def test_repr(self):
1072 self.assertEqual(repr(''), '\'\'')
1073 self.assertEqual(repr(0), '0')
1074 self.assertEqual(repr(0L), '0L')
1075 self.assertEqual(repr(()), '()')
1076 self.assertEqual(repr([]), '[]')
1077 self.assertEqual(repr({}), '{}')
1078 a = []
1079 a.append(a)
1080 self.assertEqual(repr(a), '[[...]]')
1081 a = {}
1082 a[0] = a
1083 self.assertEqual(repr(a), '{0: {...}}')
1084
1085 def test_round(self):
1086 self.assertEqual(round(0.0), 0.0)
1087 self.assertEqual(round(1.0), 1.0)
1088 self.assertEqual(round(10.0), 10.0)
1089 self.assertEqual(round(1000000000.0), 1000000000.0)
1090 self.assertEqual(round(1e20), 1e20)
1091
1092 self.assertEqual(round(-1.0), -1.0)
1093 self.assertEqual(round(-10.0), -10.0)
1094 self.assertEqual(round(-1000000000.0), -1000000000.0)
1095 self.assertEqual(round(-1e20), -1e20)
1096
1097 self.assertEqual(round(0.1), 0.0)
1098 self.assertEqual(round(1.1), 1.0)
1099 self.assertEqual(round(10.1), 10.0)
1100 self.assertEqual(round(1000000000.1), 1000000000.0)
1101
1102 self.assertEqual(round(-1.1), -1.0)
1103 self.assertEqual(round(-10.1), -10.0)
1104 self.assertEqual(round(-1000000000.1), -1000000000.0)
1105
1106 self.assertEqual(round(0.9), 1.0)
1107 self.assertEqual(round(9.9), 10.0)
1108 self.assertEqual(round(999999999.9), 1000000000.0)
1109
1110 self.assertEqual(round(-0.9), -1.0)
1111 self.assertEqual(round(-9.9), -10.0)
1112 self.assertEqual(round(-999999999.9), -1000000000.0)
1113
1114 self.assertEqual(round(-8.0, -1), -10.0)
1115
1116 self.assertRaises(TypeError, round)
1117
1118 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001119 setattr(sys, 'spam', 1)
1120 self.assertEqual(sys.spam, 1)
1121 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1122 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001123
1124 def test_str(self):
1125 self.assertEqual(str(''), '')
1126 self.assertEqual(str(0), '0')
1127 self.assertEqual(str(0L), '0')
1128 self.assertEqual(str(()), '()')
1129 self.assertEqual(str([]), '[]')
1130 self.assertEqual(str({}), '{}')
1131 a = []
1132 a.append(a)
1133 self.assertEqual(str(a), '[[...]]')
1134 a = {}
1135 a[0] = a
1136 self.assertEqual(str(a), '{0: {...}}')
1137
Alex Martellia70b1912003-04-22 08:12:33 +00001138 def test_sum(self):
1139 self.assertEqual(sum([]), 0)
1140 self.assertEqual(sum(range(2,8)), 27)
1141 self.assertEqual(sum(iter(range(2,8))), 27)
1142 self.assertEqual(sum(Squares(10)), 285)
1143 self.assertEqual(sum(iter(Squares(10))), 285)
1144 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1145
1146 self.assertRaises(TypeError, sum)
1147 self.assertRaises(TypeError, sum, 42)
1148 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1149 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1150 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1151 self.assertRaises(TypeError, sum, [{2:3}])
1152 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1153
1154 class BadSeq:
1155 def __getitem__(self, index):
1156 raise ValueError
1157 self.assertRaises(ValueError, sum, BadSeq())
1158
Walter Dörwald919497e2003-01-19 16:23:59 +00001159 def test_tuple(self):
1160 self.assertEqual(tuple(()), ())
1161 t0_3 = (0, 1, 2, 3)
1162 t0_3_bis = tuple(t0_3)
1163 self.assert_(t0_3 is t0_3_bis)
1164 self.assertEqual(tuple([]), ())
1165 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1166 self.assertEqual(tuple(''), ())
1167 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1168
1169 def test_type(self):
1170 self.assertEqual(type(''), type('123'))
1171 self.assertNotEqual(type(''), type(()))
1172
1173 def test_unichr(self):
1174 if have_unicode:
1175 self.assertEqual(unichr(32), unicode(' '))
1176 self.assertEqual(unichr(65), unicode('A'))
1177 self.assertEqual(unichr(97), unicode('a'))
1178 self.assertEqual(
1179 unichr(sys.maxunicode),
1180 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1181 )
1182 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1183 self.assertRaises(TypeError, unichr)
1184
1185 def get_vars_f0():
1186 return vars()
1187 # we don't want self in vars(), so use staticmethod
1188 get_vars_f0 = staticmethod(get_vars_f0)
1189
1190 def get_vars_f2():
1191 BuiltinTest.get_vars_f0()
1192 a = 1
1193 b = 2
1194 return vars()
1195 get_vars_f2 = staticmethod(get_vars_f2)
1196
1197 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001198 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001199 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001200 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001201 self.assertEqual(self.get_vars_f0(), {})
1202 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1203 self.assertRaises(TypeError, vars, 42, 42)
1204 self.assertRaises(TypeError, vars, 42)
1205
1206 def test_zip(self):
1207 a = (1, 2, 3)
1208 b = (4, 5, 6)
1209 t = [(1, 4), (2, 5), (3, 6)]
1210 self.assertEqual(zip(a, b), t)
1211 b = [4, 5, 6]
1212 self.assertEqual(zip(a, b), t)
1213 b = (4, 5, 6, 7)
1214 self.assertEqual(zip(a, b), t)
1215 class I:
1216 def __getitem__(self, i):
1217 if i < 0 or i > 2: raise IndexError
1218 return i + 4
1219 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001220 self.assertEqual(zip(), [])
1221 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001222 self.assertRaises(TypeError, zip, None)
1223 class G:
1224 pass
1225 self.assertRaises(TypeError, zip, a, G())
1226
1227 # Make sure zip doesn't try to allocate a billion elements for the
1228 # result list when one of its arguments doesn't say how long it is.
1229 # A MemoryError is the most likely failure mode.
1230 class SequenceWithoutALength:
1231 def __getitem__(self, i):
1232 if i == 5:
1233 raise IndexError
1234 else:
1235 return i
1236 self.assertEqual(
1237 zip(SequenceWithoutALength(), xrange(2**30)),
1238 list(enumerate(range(5)))
1239 )
1240
1241 class BadSeq:
1242 def __getitem__(self, i):
1243 if i == 5:
1244 raise ValueError
1245 else:
1246 return i
1247 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1248
Raymond Hettinger64958a12003-12-17 20:43:33 +00001249class TestSorted(unittest.TestCase):
1250
1251 def test_basic(self):
1252 data = range(100)
1253 copy = data[:]
1254 random.shuffle(copy)
1255 self.assertEqual(data, sorted(copy))
1256 self.assertNotEqual(data, copy)
1257
1258 data.reverse()
1259 random.shuffle(copy)
1260 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1261 self.assertNotEqual(data, copy)
1262 random.shuffle(copy)
1263 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1264 self.assertNotEqual(data, copy)
1265 random.shuffle(copy)
1266 self.assertEqual(data, sorted(copy, reverse=1))
1267 self.assertNotEqual(data, copy)
1268
1269 def test_inputtypes(self):
1270 s = 'abracadabra'
1271 for T in [unicode, list, tuple]:
1272 self.assertEqual(sorted(s), sorted(T(s)))
1273
1274 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
1275 for T in [unicode, set, frozenset, list, tuple, dict.fromkeys]:
1276 self.assertEqual(sorted(s), sorted(T(s)))
1277
1278 def test_baddecorator(self):
1279 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1280 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1281
Walter Dörwald919497e2003-01-19 16:23:59 +00001282def test_main():
Raymond Hettinger64958a12003-12-17 20:43:33 +00001283 test.test_support.run_unittest(BuiltinTest, TestSorted)
Walter Dörwald919497e2003-01-19 16:23:59 +00001284
1285if __name__ == "__main__":
1286 test_main()