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