blob: 8e3a925032d4420c8665d289f6ba24204b68ac65 [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
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000611 # Subclasses of string can't be interned, because they
612 # provide too much opportunity for insane things to happen.
613 # We don't want them in the interned dict and if they aren't
614 # actually interned, we don't want to create the appearance
615 # that they are by allowing intern() to succeeed.
616 class S(str):
617 def __hash__(self):
618 return 123
619
620 self.assertRaises(TypeError, intern, S("abc"))
621
622 # It's still safe to pass these strings to routines that
623 # call intern internally, e.g. PyObject_SetAttr().
624 s = S("abc")
625 setattr(s, s, s)
626 self.assertEqual(getattr(s, s), s)
627
Walter Dörwald919497e2003-01-19 16:23:59 +0000628 def test_iter(self):
629 self.assertRaises(TypeError, iter)
630 self.assertRaises(TypeError, iter, 42, 42)
631 lists = [("1", "2"), ["1", "2"], "12"]
632 if have_unicode:
633 lists.append(unicode("12"))
634 for l in lists:
635 i = iter(l)
636 self.assertEqual(i.next(), '1')
637 self.assertEqual(i.next(), '2')
638 self.assertRaises(StopIteration, i.next)
639
640 def test_isinstance(self):
641 class C:
642 pass
643 class D(C):
644 pass
645 class E:
646 pass
647 c = C()
648 d = D()
649 e = E()
650 self.assert_(isinstance(c, C))
651 self.assert_(isinstance(d, C))
652 self.assert_(not isinstance(e, C))
653 self.assert_(not isinstance(c, D))
654 self.assert_(not isinstance('foo', E))
655 self.assertRaises(TypeError, isinstance, E, 'foo')
656 self.assertRaises(TypeError, isinstance)
657
658 def test_issubclass(self):
659 class C:
660 pass
661 class D(C):
662 pass
663 class E:
664 pass
665 c = C()
666 d = D()
667 e = E()
668 self.assert_(issubclass(D, C))
669 self.assert_(issubclass(C, C))
670 self.assert_(not issubclass(C, D))
671 self.assertRaises(TypeError, issubclass, 'foo', E)
672 self.assertRaises(TypeError, issubclass, E, 'foo')
673 self.assertRaises(TypeError, issubclass)
674
675 def test_len(self):
676 self.assertEqual(len('123'), 3)
677 self.assertEqual(len(()), 0)
678 self.assertEqual(len((1, 2, 3, 4)), 4)
679 self.assertEqual(len([1, 2, 3, 4]), 4)
680 self.assertEqual(len({}), 0)
681 self.assertEqual(len({'a':1, 'b': 2}), 2)
682 class BadSeq:
683 def __len__(self):
684 raise ValueError
685 self.assertRaises(ValueError, len, BadSeq())
686
687 def test_list(self):
688 self.assertEqual(list([]), [])
689 l0_3 = [0, 1, 2, 3]
690 l0_3_bis = list(l0_3)
691 self.assertEqual(l0_3, l0_3_bis)
692 self.assert_(l0_3 is not l0_3_bis)
693 self.assertEqual(list(()), [])
694 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
695 self.assertEqual(list(''), [])
696 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
697
698 if sys.maxint == 0x7fffffff:
699 # This test can currently only work on 32-bit machines.
700 # XXX If/when PySequence_Length() returns a ssize_t, it should be
701 # XXX re-enabled.
702 # Verify clearing of bug #556025.
703 # This assumes that the max data size (sys.maxint) == max
704 # address size this also assumes that the address size is at
705 # least 4 bytes with 8 byte addresses, the bug is not well
706 # tested
707 #
708 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
709 # earlier due to a newlib bug. See the following mailing list
710 # thread for the details:
711
712 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
713 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
714
715 def test_long(self):
716 self.assertEqual(long(314), 314L)
717 self.assertEqual(long(3.14), 3L)
718 self.assertEqual(long(314L), 314L)
719 # Check that conversion from float truncates towards zero
720 self.assertEqual(long(-3.14), -3L)
721 self.assertEqual(long(3.9), 3L)
722 self.assertEqual(long(-3.9), -3L)
723 self.assertEqual(long(3.5), 3L)
724 self.assertEqual(long(-3.5), -3L)
725 self.assertEqual(long("-3"), -3L)
726 if have_unicode:
727 self.assertEqual(long(unicode("-3")), -3L)
728 # Different base:
729 self.assertEqual(long("10",16), 16L)
730 if have_unicode:
731 self.assertEqual(long(unicode("10"),16), 16L)
732 # Check conversions from string (same test set as for int(), and then some)
733 LL = [
734 ('1' + '0'*20, 10L**20),
735 ('1' + '0'*100, 10L**100)
736 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000737 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000738 if have_unicode:
739 L2 += [
740 (unicode('1') + unicode('0')*20, 10L**20),
741 (unicode('1') + unicode('0')*100, 10L**100),
742 ]
743 for s, v in L2 + LL:
744 for sign in "", "+", "-":
745 for prefix in "", " ", "\t", " \t\t ":
746 ss = prefix + sign + s
747 vv = v
748 if sign == "-" and v is not ValueError:
749 vv = -v
750 try:
751 self.assertEqual(long(ss), long(vv))
752 except v:
753 pass
754
755 self.assertRaises(ValueError, long, '123\0')
756 self.assertRaises(ValueError, long, '53', 40)
757 self.assertRaises(TypeError, long, 1, 12)
758
759 def test_map(self):
760 self.assertEqual(
761 map(None, 'hello world'),
762 ['h','e','l','l','o',' ','w','o','r','l','d']
763 )
764 self.assertEqual(
765 map(None, 'abcd', 'efg'),
766 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
767 )
768 self.assertEqual(
769 map(None, range(10)),
770 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
771 )
772 self.assertEqual(
773 map(lambda x: x*x, range(1,4)),
774 [1, 4, 9]
775 )
776 try:
777 from math import sqrt
778 except ImportError:
779 def sqrt(x):
780 return pow(x, 0.5)
781 self.assertEqual(
782 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
783 [[4.0, 2.0], [9.0, 3.0]]
784 )
785 self.assertEqual(
786 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
787 [10, 4, 6]
788 )
789
790 def plus(*v):
791 accu = 0
792 for i in v: accu = accu + i
793 return accu
794 self.assertEqual(
795 map(plus, [1, 3, 7]),
796 [1, 3, 7]
797 )
798 self.assertEqual(
799 map(plus, [1, 3, 7], [4, 9, 2]),
800 [1+4, 3+9, 7+2]
801 )
802 self.assertEqual(
803 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
804 [1+4+1, 3+9+1, 7+2+0]
805 )
806 self.assertEqual(
807 map(None, Squares(10)),
808 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
809 )
810 self.assertEqual(
811 map(int, Squares(10)),
812 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
813 )
814 self.assertEqual(
815 map(None, Squares(3), Squares(2)),
816 [(0,0), (1,1), (4,None)]
817 )
818 self.assertEqual(
819 map(max, Squares(3), Squares(2)),
820 [0, 1, 4]
821 )
822 self.assertRaises(TypeError, map)
823 self.assertRaises(TypeError, map, lambda x: x, 42)
824 self.assertEqual(map(None, [42]), [42])
825 class BadSeq:
826 def __getitem__(self, index):
827 raise ValueError
828 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
829
830 def test_max(self):
831 self.assertEqual(max('123123'), '3')
832 self.assertEqual(max(1, 2, 3), 3)
833 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
834 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
835
836 self.assertEqual(max(1, 2L, 3.0), 3.0)
837 self.assertEqual(max(1L, 2.0, 3), 3)
838 self.assertEqual(max(1.0, 2, 3L), 3L)
839
840 def test_min(self):
841 self.assertEqual(min('123123'), '1')
842 self.assertEqual(min(1, 2, 3), 1)
843 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
844 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
845
846 self.assertEqual(min(1, 2L, 3.0), 1)
847 self.assertEqual(min(1L, 2.0, 3), 1L)
848 self.assertEqual(min(1.0, 2, 3L), 1.0)
849
850 self.assertRaises(TypeError, min)
851 self.assertRaises(TypeError, min, 42)
852 self.assertRaises(ValueError, min, ())
853 class BadSeq:
854 def __getitem__(self, index):
855 raise ValueError
856 self.assertRaises(ValueError, min, BadSeq())
857 class BadNumber:
858 def __cmp__(self, other):
859 raise ValueError
860 self.assertRaises(ValueError, min, (42, BadNumber()))
861
862 def test_oct(self):
863 self.assertEqual(oct(100), '0144')
864 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000865 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000866 self.assertEqual(oct(-100L), '-0144L')
867 self.assertRaises(TypeError, oct, ())
868
869 def write_testfile(self):
870 # NB the first 4 lines are also used to test input and raw_input, below
871 fp = open(TESTFN, 'w')
872 try:
873 fp.write('1+1\n')
874 fp.write('1+1\n')
875 fp.write('The quick brown fox jumps over the lazy dog')
876 fp.write('.\n')
877 fp.write('Dear John\n')
878 fp.write('XXX'*100)
879 fp.write('YYY'*100)
880 finally:
881 fp.close()
882
883 def test_open(self):
884 self.write_testfile()
885 fp = open(TESTFN, 'r')
886 try:
887 self.assertEqual(fp.readline(4), '1+1\n')
888 self.assertEqual(fp.readline(4), '1+1\n')
889 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
890 self.assertEqual(fp.readline(4), 'Dear')
891 self.assertEqual(fp.readline(100), ' John\n')
892 self.assertEqual(fp.read(300), 'XXX'*100)
893 self.assertEqual(fp.read(1000), 'YYY'*100)
894 finally:
895 fp.close()
896 unlink(TESTFN)
897
898 def test_ord(self):
899 self.assertEqual(ord(' '), 32)
900 self.assertEqual(ord('A'), 65)
901 self.assertEqual(ord('a'), 97)
902 if have_unicode:
903 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
904 self.assertRaises(TypeError, ord, 42)
905 self.assertRaises(TypeError, ord, unicode("12"))
906
907 def test_pow(self):
908 self.assertEqual(pow(0,0), 1)
909 self.assertEqual(pow(0,1), 0)
910 self.assertEqual(pow(1,0), 1)
911 self.assertEqual(pow(1,1), 1)
912
913 self.assertEqual(pow(2,0), 1)
914 self.assertEqual(pow(2,10), 1024)
915 self.assertEqual(pow(2,20), 1024*1024)
916 self.assertEqual(pow(2,30), 1024*1024*1024)
917
918 self.assertEqual(pow(-2,0), 1)
919 self.assertEqual(pow(-2,1), -2)
920 self.assertEqual(pow(-2,2), 4)
921 self.assertEqual(pow(-2,3), -8)
922
923 self.assertEqual(pow(0L,0), 1)
924 self.assertEqual(pow(0L,1), 0)
925 self.assertEqual(pow(1L,0), 1)
926 self.assertEqual(pow(1L,1), 1)
927
928 self.assertEqual(pow(2L,0), 1)
929 self.assertEqual(pow(2L,10), 1024)
930 self.assertEqual(pow(2L,20), 1024*1024)
931 self.assertEqual(pow(2L,30), 1024*1024*1024)
932
933 self.assertEqual(pow(-2L,0), 1)
934 self.assertEqual(pow(-2L,1), -2)
935 self.assertEqual(pow(-2L,2), 4)
936 self.assertEqual(pow(-2L,3), -8)
937
938 self.assertAlmostEqual(pow(0.,0), 1.)
939 self.assertAlmostEqual(pow(0.,1), 0.)
940 self.assertAlmostEqual(pow(1.,0), 1.)
941 self.assertAlmostEqual(pow(1.,1), 1.)
942
943 self.assertAlmostEqual(pow(2.,0), 1.)
944 self.assertAlmostEqual(pow(2.,10), 1024.)
945 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
946 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
947
948 self.assertAlmostEqual(pow(-2.,0), 1.)
949 self.assertAlmostEqual(pow(-2.,1), -2.)
950 self.assertAlmostEqual(pow(-2.,2), 4.)
951 self.assertAlmostEqual(pow(-2.,3), -8.)
952
953 for x in 2, 2L, 2.0:
954 for y in 10, 10L, 10.0:
955 for z in 1000, 1000L, 1000.0:
956 if isinstance(x, float) or \
957 isinstance(y, float) or \
958 isinstance(z, float):
959 self.assertRaises(TypeError, pow, x, y, z)
960 else:
961 self.assertAlmostEqual(pow(x, y, z), 24.0)
962
963 self.assertRaises(TypeError, pow, -1, -2, 3)
964 self.assertRaises(ValueError, pow, 1, 2, 0)
965 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
966 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
967 self.assertRaises(ValueError, pow, -342.43, 0.234)
968
969 self.assertRaises(TypeError, pow)
970
971 def test_range(self):
972 self.assertEqual(range(3), [0, 1, 2])
973 self.assertEqual(range(1, 5), [1, 2, 3, 4])
974 self.assertEqual(range(0), [])
975 self.assertEqual(range(-3), [])
976 self.assertEqual(range(1, 10, 3), [1, 4, 7])
977 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
978
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000979 # Now test range() with longs
980 self.assertEqual(range(-2**100), [])
981 self.assertEqual(range(0, -2**100), [])
982 self.assertEqual(range(0, 2**100, -1), [])
983 self.assertEqual(range(0, 2**100, -1), [])
984
985 a = long(10 * sys.maxint)
986 b = long(100 * sys.maxint)
987 c = long(50 * sys.maxint)
988
989 self.assertEqual(range(a, a+2), [a, a+1])
990 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
991 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
992
993 seq = range(a, b, c)
994 self.assert_(a in seq)
995 self.assert_(b not in seq)
996 self.assertEqual(len(seq), 2)
997
998 seq = range(b, a, -c)
999 self.assert_(b in seq)
1000 self.assert_(a not in seq)
1001 self.assertEqual(len(seq), 2)
1002
1003 seq = range(-a, -b, -c)
1004 self.assert_(-a in seq)
1005 self.assert_(-b not in seq)
1006 self.assertEqual(len(seq), 2)
1007
Walter Dörwald919497e2003-01-19 16:23:59 +00001008 self.assertRaises(TypeError, range)
1009 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1010 self.assertRaises(ValueError, range, 1, 2, 0)
1011
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001012 # Reject floats when it would require PyLongs to represent.
1013 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001014 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001015
Walter Dörwald357981e2003-04-15 18:59:28 +00001016 self.assertRaises(TypeError, range, 0, "spam")
1017 self.assertRaises(TypeError, range, 0, 42, "spam")
1018
1019 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1020 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1021
Walter Dörwald919497e2003-01-19 16:23:59 +00001022 def test_input_and_raw_input(self):
1023 self.write_testfile()
1024 fp = open(TESTFN, 'r')
1025 savestdin = sys.stdin
1026 savestdout = sys.stdout # Eats the echo
1027 try:
1028 sys.stdin = fp
1029 sys.stdout = BitBucket()
1030 self.assertEqual(input(), 2)
1031 self.assertEqual(input('testing\n'), 2)
1032 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1033 self.assertEqual(raw_input('testing\n'), 'Dear John')
1034 sys.stdin = cStringIO.StringIO("NULL\0")
1035 self.assertRaises(TypeError, input, 42, 42)
1036 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1037 self.assertEqual(input(), 'whitespace')
1038 sys.stdin = cStringIO.StringIO()
1039 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001040
1041 # SF 876178: make sure input() respect future options.
1042 sys.stdin = cStringIO.StringIO('1/2')
1043 sys.stdout = cStringIO.StringIO()
1044 exec compile('print input()', 'test_builtin_tmp', 'exec')
1045 sys.stdin.seek(0, 0)
1046 exec compile('from __future__ import division;print input()',
1047 'test_builtin_tmp', 'exec')
1048 sys.stdin.seek(0, 0)
1049 exec compile('print input()', 'test_builtin_tmp', 'exec')
1050 self.assertEqual(sys.stdout.getvalue().splitlines(),
1051 ['0', '0.5', '0'])
1052
Walter Dörwald919497e2003-01-19 16:23:59 +00001053 del sys.stdout
1054 self.assertRaises(RuntimeError, input, 'prompt')
1055 del sys.stdin
1056 self.assertRaises(RuntimeError, input, 'prompt')
1057 finally:
1058 sys.stdin = savestdin
1059 sys.stdout = savestdout
1060 fp.close()
1061 unlink(TESTFN)
1062
1063 def test_reduce(self):
1064 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1065 self.assertEqual(
1066 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1067 ['a','c','d','w']
1068 )
1069 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1070 self.assertEqual(
1071 reduce(lambda x, y: x*y, range(2,21), 1L),
1072 2432902008176640000L
1073 )
1074 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1075 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1076 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1077 self.assertRaises(TypeError, reduce)
1078 self.assertRaises(TypeError, reduce, 42, 42)
1079 self.assertRaises(TypeError, reduce, 42, 42, 42)
1080 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1081 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1082 self.assertRaises(TypeError, reduce, 42, (42, 42))
1083
1084 class BadSeq:
1085 def __getitem__(self, index):
1086 raise ValueError
1087 self.assertRaises(ValueError, reduce, 42, BadSeq())
1088
1089 def test_reload(self):
1090 import marshal
1091 reload(marshal)
1092 import string
1093 reload(string)
1094 ## import sys
1095 ## self.assertRaises(ImportError, reload, sys)
1096
1097 def test_repr(self):
1098 self.assertEqual(repr(''), '\'\'')
1099 self.assertEqual(repr(0), '0')
1100 self.assertEqual(repr(0L), '0L')
1101 self.assertEqual(repr(()), '()')
1102 self.assertEqual(repr([]), '[]')
1103 self.assertEqual(repr({}), '{}')
1104 a = []
1105 a.append(a)
1106 self.assertEqual(repr(a), '[[...]]')
1107 a = {}
1108 a[0] = a
1109 self.assertEqual(repr(a), '{0: {...}}')
1110
1111 def test_round(self):
1112 self.assertEqual(round(0.0), 0.0)
1113 self.assertEqual(round(1.0), 1.0)
1114 self.assertEqual(round(10.0), 10.0)
1115 self.assertEqual(round(1000000000.0), 1000000000.0)
1116 self.assertEqual(round(1e20), 1e20)
1117
1118 self.assertEqual(round(-1.0), -1.0)
1119 self.assertEqual(round(-10.0), -10.0)
1120 self.assertEqual(round(-1000000000.0), -1000000000.0)
1121 self.assertEqual(round(-1e20), -1e20)
1122
1123 self.assertEqual(round(0.1), 0.0)
1124 self.assertEqual(round(1.1), 1.0)
1125 self.assertEqual(round(10.1), 10.0)
1126 self.assertEqual(round(1000000000.1), 1000000000.0)
1127
1128 self.assertEqual(round(-1.1), -1.0)
1129 self.assertEqual(round(-10.1), -10.0)
1130 self.assertEqual(round(-1000000000.1), -1000000000.0)
1131
1132 self.assertEqual(round(0.9), 1.0)
1133 self.assertEqual(round(9.9), 10.0)
1134 self.assertEqual(round(999999999.9), 1000000000.0)
1135
1136 self.assertEqual(round(-0.9), -1.0)
1137 self.assertEqual(round(-9.9), -10.0)
1138 self.assertEqual(round(-999999999.9), -1000000000.0)
1139
1140 self.assertEqual(round(-8.0, -1), -10.0)
1141
1142 self.assertRaises(TypeError, round)
1143
1144 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001145 setattr(sys, 'spam', 1)
1146 self.assertEqual(sys.spam, 1)
1147 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1148 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001149
1150 def test_str(self):
1151 self.assertEqual(str(''), '')
1152 self.assertEqual(str(0), '0')
1153 self.assertEqual(str(0L), '0')
1154 self.assertEqual(str(()), '()')
1155 self.assertEqual(str([]), '[]')
1156 self.assertEqual(str({}), '{}')
1157 a = []
1158 a.append(a)
1159 self.assertEqual(str(a), '[[...]]')
1160 a = {}
1161 a[0] = a
1162 self.assertEqual(str(a), '{0: {...}}')
1163
Alex Martellia70b1912003-04-22 08:12:33 +00001164 def test_sum(self):
1165 self.assertEqual(sum([]), 0)
1166 self.assertEqual(sum(range(2,8)), 27)
1167 self.assertEqual(sum(iter(range(2,8))), 27)
1168 self.assertEqual(sum(Squares(10)), 285)
1169 self.assertEqual(sum(iter(Squares(10))), 285)
1170 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1171
1172 self.assertRaises(TypeError, sum)
1173 self.assertRaises(TypeError, sum, 42)
1174 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1175 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1176 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1177 self.assertRaises(TypeError, sum, [{2:3}])
1178 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1179
1180 class BadSeq:
1181 def __getitem__(self, index):
1182 raise ValueError
1183 self.assertRaises(ValueError, sum, BadSeq())
1184
Walter Dörwald919497e2003-01-19 16:23:59 +00001185 def test_tuple(self):
1186 self.assertEqual(tuple(()), ())
1187 t0_3 = (0, 1, 2, 3)
1188 t0_3_bis = tuple(t0_3)
1189 self.assert_(t0_3 is t0_3_bis)
1190 self.assertEqual(tuple([]), ())
1191 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1192 self.assertEqual(tuple(''), ())
1193 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1194
1195 def test_type(self):
1196 self.assertEqual(type(''), type('123'))
1197 self.assertNotEqual(type(''), type(()))
1198
1199 def test_unichr(self):
1200 if have_unicode:
1201 self.assertEqual(unichr(32), unicode(' '))
1202 self.assertEqual(unichr(65), unicode('A'))
1203 self.assertEqual(unichr(97), unicode('a'))
1204 self.assertEqual(
1205 unichr(sys.maxunicode),
1206 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1207 )
1208 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1209 self.assertRaises(TypeError, unichr)
1210
1211 def get_vars_f0():
1212 return vars()
1213 # we don't want self in vars(), so use staticmethod
1214 get_vars_f0 = staticmethod(get_vars_f0)
1215
1216 def get_vars_f2():
1217 BuiltinTest.get_vars_f0()
1218 a = 1
1219 b = 2
1220 return vars()
1221 get_vars_f2 = staticmethod(get_vars_f2)
1222
1223 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001224 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001225 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001226 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001227 self.assertEqual(self.get_vars_f0(), {})
1228 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1229 self.assertRaises(TypeError, vars, 42, 42)
1230 self.assertRaises(TypeError, vars, 42)
1231
1232 def test_zip(self):
1233 a = (1, 2, 3)
1234 b = (4, 5, 6)
1235 t = [(1, 4), (2, 5), (3, 6)]
1236 self.assertEqual(zip(a, b), t)
1237 b = [4, 5, 6]
1238 self.assertEqual(zip(a, b), t)
1239 b = (4, 5, 6, 7)
1240 self.assertEqual(zip(a, b), t)
1241 class I:
1242 def __getitem__(self, i):
1243 if i < 0 or i > 2: raise IndexError
1244 return i + 4
1245 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001246 self.assertEqual(zip(), [])
1247 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001248 self.assertRaises(TypeError, zip, None)
1249 class G:
1250 pass
1251 self.assertRaises(TypeError, zip, a, G())
1252
1253 # Make sure zip doesn't try to allocate a billion elements for the
1254 # result list when one of its arguments doesn't say how long it is.
1255 # A MemoryError is the most likely failure mode.
1256 class SequenceWithoutALength:
1257 def __getitem__(self, i):
1258 if i == 5:
1259 raise IndexError
1260 else:
1261 return i
1262 self.assertEqual(
1263 zip(SequenceWithoutALength(), xrange(2**30)),
1264 list(enumerate(range(5)))
1265 )
1266
1267 class BadSeq:
1268 def __getitem__(self, i):
1269 if i == 5:
1270 raise ValueError
1271 else:
1272 return i
1273 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1274
Raymond Hettinger64958a12003-12-17 20:43:33 +00001275class TestSorted(unittest.TestCase):
1276
1277 def test_basic(self):
1278 data = range(100)
1279 copy = data[:]
1280 random.shuffle(copy)
1281 self.assertEqual(data, sorted(copy))
1282 self.assertNotEqual(data, copy)
1283
1284 data.reverse()
1285 random.shuffle(copy)
1286 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1287 self.assertNotEqual(data, copy)
1288 random.shuffle(copy)
1289 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1290 self.assertNotEqual(data, copy)
1291 random.shuffle(copy)
1292 self.assertEqual(data, sorted(copy, reverse=1))
1293 self.assertNotEqual(data, copy)
1294
1295 def test_inputtypes(self):
1296 s = 'abracadabra'
1297 for T in [unicode, list, tuple]:
1298 self.assertEqual(sorted(s), sorted(T(s)))
1299
1300 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
1301 for T in [unicode, set, frozenset, list, tuple, dict.fromkeys]:
1302 self.assertEqual(sorted(s), sorted(T(s)))
1303
1304 def test_baddecorator(self):
1305 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1306 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1307
Walter Dörwald919497e2003-01-19 16:23:59 +00001308def test_main():
Raymond Hettinger64958a12003-12-17 20:43:33 +00001309 test.test_support.run_unittest(BuiltinTest, TestSorted)
Walter Dörwald919497e2003-01-19 16:23:59 +00001310
1311if __name__ == "__main__":
1312 test_main()