blob: 9f909250e861b6a5f3f1577a1a058c7fe0332273 [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
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000715 # This code used to segfault in Py2.4a3
716 x = []
717 x.extend(-y for y in x)
718 self.assertEqual(x, [])
719
Walter Dörwald919497e2003-01-19 16:23:59 +0000720 def test_long(self):
721 self.assertEqual(long(314), 314L)
722 self.assertEqual(long(3.14), 3L)
723 self.assertEqual(long(314L), 314L)
724 # Check that conversion from float truncates towards zero
725 self.assertEqual(long(-3.14), -3L)
726 self.assertEqual(long(3.9), 3L)
727 self.assertEqual(long(-3.9), -3L)
728 self.assertEqual(long(3.5), 3L)
729 self.assertEqual(long(-3.5), -3L)
730 self.assertEqual(long("-3"), -3L)
731 if have_unicode:
732 self.assertEqual(long(unicode("-3")), -3L)
733 # Different base:
734 self.assertEqual(long("10",16), 16L)
735 if have_unicode:
736 self.assertEqual(long(unicode("10"),16), 16L)
737 # Check conversions from string (same test set as for int(), and then some)
738 LL = [
739 ('1' + '0'*20, 10L**20),
740 ('1' + '0'*100, 10L**100)
741 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000742 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000743 if have_unicode:
744 L2 += [
745 (unicode('1') + unicode('0')*20, 10L**20),
746 (unicode('1') + unicode('0')*100, 10L**100),
747 ]
748 for s, v in L2 + LL:
749 for sign in "", "+", "-":
750 for prefix in "", " ", "\t", " \t\t ":
751 ss = prefix + sign + s
752 vv = v
753 if sign == "-" and v is not ValueError:
754 vv = -v
755 try:
756 self.assertEqual(long(ss), long(vv))
757 except v:
758 pass
759
760 self.assertRaises(ValueError, long, '123\0')
761 self.assertRaises(ValueError, long, '53', 40)
762 self.assertRaises(TypeError, long, 1, 12)
763
764 def test_map(self):
765 self.assertEqual(
766 map(None, 'hello world'),
767 ['h','e','l','l','o',' ','w','o','r','l','d']
768 )
769 self.assertEqual(
770 map(None, 'abcd', 'efg'),
771 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
772 )
773 self.assertEqual(
774 map(None, range(10)),
775 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
776 )
777 self.assertEqual(
778 map(lambda x: x*x, range(1,4)),
779 [1, 4, 9]
780 )
781 try:
782 from math import sqrt
783 except ImportError:
784 def sqrt(x):
785 return pow(x, 0.5)
786 self.assertEqual(
787 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
788 [[4.0, 2.0], [9.0, 3.0]]
789 )
790 self.assertEqual(
791 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
792 [10, 4, 6]
793 )
794
795 def plus(*v):
796 accu = 0
797 for i in v: accu = accu + i
798 return accu
799 self.assertEqual(
800 map(plus, [1, 3, 7]),
801 [1, 3, 7]
802 )
803 self.assertEqual(
804 map(plus, [1, 3, 7], [4, 9, 2]),
805 [1+4, 3+9, 7+2]
806 )
807 self.assertEqual(
808 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
809 [1+4+1, 3+9+1, 7+2+0]
810 )
811 self.assertEqual(
812 map(None, Squares(10)),
813 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
814 )
815 self.assertEqual(
816 map(int, Squares(10)),
817 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
818 )
819 self.assertEqual(
820 map(None, Squares(3), Squares(2)),
821 [(0,0), (1,1), (4,None)]
822 )
823 self.assertEqual(
824 map(max, Squares(3), Squares(2)),
825 [0, 1, 4]
826 )
827 self.assertRaises(TypeError, map)
828 self.assertRaises(TypeError, map, lambda x: x, 42)
829 self.assertEqual(map(None, [42]), [42])
830 class BadSeq:
831 def __getitem__(self, index):
832 raise ValueError
833 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
834
835 def test_max(self):
836 self.assertEqual(max('123123'), '3')
837 self.assertEqual(max(1, 2, 3), 3)
838 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
839 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
840
841 self.assertEqual(max(1, 2L, 3.0), 3.0)
842 self.assertEqual(max(1L, 2.0, 3), 3)
843 self.assertEqual(max(1.0, 2, 3L), 3L)
844
845 def test_min(self):
846 self.assertEqual(min('123123'), '1')
847 self.assertEqual(min(1, 2, 3), 1)
848 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
849 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
850
851 self.assertEqual(min(1, 2L, 3.0), 1)
852 self.assertEqual(min(1L, 2.0, 3), 1L)
853 self.assertEqual(min(1.0, 2, 3L), 1.0)
854
855 self.assertRaises(TypeError, min)
856 self.assertRaises(TypeError, min, 42)
857 self.assertRaises(ValueError, min, ())
858 class BadSeq:
859 def __getitem__(self, index):
860 raise ValueError
861 self.assertRaises(ValueError, min, BadSeq())
862 class BadNumber:
863 def __cmp__(self, other):
864 raise ValueError
865 self.assertRaises(ValueError, min, (42, BadNumber()))
866
867 def test_oct(self):
868 self.assertEqual(oct(100), '0144')
869 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000870 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000871 self.assertEqual(oct(-100L), '-0144L')
872 self.assertRaises(TypeError, oct, ())
873
874 def write_testfile(self):
875 # NB the first 4 lines are also used to test input and raw_input, below
876 fp = open(TESTFN, 'w')
877 try:
878 fp.write('1+1\n')
879 fp.write('1+1\n')
880 fp.write('The quick brown fox jumps over the lazy dog')
881 fp.write('.\n')
882 fp.write('Dear John\n')
883 fp.write('XXX'*100)
884 fp.write('YYY'*100)
885 finally:
886 fp.close()
887
888 def test_open(self):
889 self.write_testfile()
890 fp = open(TESTFN, 'r')
891 try:
892 self.assertEqual(fp.readline(4), '1+1\n')
893 self.assertEqual(fp.readline(4), '1+1\n')
894 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
895 self.assertEqual(fp.readline(4), 'Dear')
896 self.assertEqual(fp.readline(100), ' John\n')
897 self.assertEqual(fp.read(300), 'XXX'*100)
898 self.assertEqual(fp.read(1000), 'YYY'*100)
899 finally:
900 fp.close()
901 unlink(TESTFN)
902
903 def test_ord(self):
904 self.assertEqual(ord(' '), 32)
905 self.assertEqual(ord('A'), 65)
906 self.assertEqual(ord('a'), 97)
907 if have_unicode:
908 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
909 self.assertRaises(TypeError, ord, 42)
910 self.assertRaises(TypeError, ord, unicode("12"))
911
912 def test_pow(self):
913 self.assertEqual(pow(0,0), 1)
914 self.assertEqual(pow(0,1), 0)
915 self.assertEqual(pow(1,0), 1)
916 self.assertEqual(pow(1,1), 1)
917
918 self.assertEqual(pow(2,0), 1)
919 self.assertEqual(pow(2,10), 1024)
920 self.assertEqual(pow(2,20), 1024*1024)
921 self.assertEqual(pow(2,30), 1024*1024*1024)
922
923 self.assertEqual(pow(-2,0), 1)
924 self.assertEqual(pow(-2,1), -2)
925 self.assertEqual(pow(-2,2), 4)
926 self.assertEqual(pow(-2,3), -8)
927
928 self.assertEqual(pow(0L,0), 1)
929 self.assertEqual(pow(0L,1), 0)
930 self.assertEqual(pow(1L,0), 1)
931 self.assertEqual(pow(1L,1), 1)
932
933 self.assertEqual(pow(2L,0), 1)
934 self.assertEqual(pow(2L,10), 1024)
935 self.assertEqual(pow(2L,20), 1024*1024)
936 self.assertEqual(pow(2L,30), 1024*1024*1024)
937
938 self.assertEqual(pow(-2L,0), 1)
939 self.assertEqual(pow(-2L,1), -2)
940 self.assertEqual(pow(-2L,2), 4)
941 self.assertEqual(pow(-2L,3), -8)
942
943 self.assertAlmostEqual(pow(0.,0), 1.)
944 self.assertAlmostEqual(pow(0.,1), 0.)
945 self.assertAlmostEqual(pow(1.,0), 1.)
946 self.assertAlmostEqual(pow(1.,1), 1.)
947
948 self.assertAlmostEqual(pow(2.,0), 1.)
949 self.assertAlmostEqual(pow(2.,10), 1024.)
950 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
951 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
952
953 self.assertAlmostEqual(pow(-2.,0), 1.)
954 self.assertAlmostEqual(pow(-2.,1), -2.)
955 self.assertAlmostEqual(pow(-2.,2), 4.)
956 self.assertAlmostEqual(pow(-2.,3), -8.)
957
958 for x in 2, 2L, 2.0:
959 for y in 10, 10L, 10.0:
960 for z in 1000, 1000L, 1000.0:
961 if isinstance(x, float) or \
962 isinstance(y, float) or \
963 isinstance(z, float):
964 self.assertRaises(TypeError, pow, x, y, z)
965 else:
966 self.assertAlmostEqual(pow(x, y, z), 24.0)
967
968 self.assertRaises(TypeError, pow, -1, -2, 3)
969 self.assertRaises(ValueError, pow, 1, 2, 0)
970 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
971 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
972 self.assertRaises(ValueError, pow, -342.43, 0.234)
973
974 self.assertRaises(TypeError, pow)
975
976 def test_range(self):
977 self.assertEqual(range(3), [0, 1, 2])
978 self.assertEqual(range(1, 5), [1, 2, 3, 4])
979 self.assertEqual(range(0), [])
980 self.assertEqual(range(-3), [])
981 self.assertEqual(range(1, 10, 3), [1, 4, 7])
982 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
983
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000984 # Now test range() with longs
985 self.assertEqual(range(-2**100), [])
986 self.assertEqual(range(0, -2**100), [])
987 self.assertEqual(range(0, 2**100, -1), [])
988 self.assertEqual(range(0, 2**100, -1), [])
989
990 a = long(10 * sys.maxint)
991 b = long(100 * sys.maxint)
992 c = long(50 * sys.maxint)
993
994 self.assertEqual(range(a, a+2), [a, a+1])
995 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
996 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
997
998 seq = range(a, b, c)
999 self.assert_(a in seq)
1000 self.assert_(b not in seq)
1001 self.assertEqual(len(seq), 2)
1002
1003 seq = range(b, a, -c)
1004 self.assert_(b in seq)
1005 self.assert_(a not in seq)
1006 self.assertEqual(len(seq), 2)
1007
1008 seq = range(-a, -b, -c)
1009 self.assert_(-a in seq)
1010 self.assert_(-b not in seq)
1011 self.assertEqual(len(seq), 2)
1012
Walter Dörwald919497e2003-01-19 16:23:59 +00001013 self.assertRaises(TypeError, range)
1014 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1015 self.assertRaises(ValueError, range, 1, 2, 0)
1016
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001017 # Reject floats when it would require PyLongs to represent.
1018 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001019 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001020
Walter Dörwald357981e2003-04-15 18:59:28 +00001021 self.assertRaises(TypeError, range, 0, "spam")
1022 self.assertRaises(TypeError, range, 0, 42, "spam")
1023
1024 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1025 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1026
Walter Dörwald919497e2003-01-19 16:23:59 +00001027 def test_input_and_raw_input(self):
1028 self.write_testfile()
1029 fp = open(TESTFN, 'r')
1030 savestdin = sys.stdin
1031 savestdout = sys.stdout # Eats the echo
1032 try:
1033 sys.stdin = fp
1034 sys.stdout = BitBucket()
1035 self.assertEqual(input(), 2)
1036 self.assertEqual(input('testing\n'), 2)
1037 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1038 self.assertEqual(raw_input('testing\n'), 'Dear John')
1039 sys.stdin = cStringIO.StringIO("NULL\0")
1040 self.assertRaises(TypeError, input, 42, 42)
1041 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1042 self.assertEqual(input(), 'whitespace')
1043 sys.stdin = cStringIO.StringIO()
1044 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001045
1046 # SF 876178: make sure input() respect future options.
1047 sys.stdin = cStringIO.StringIO('1/2')
1048 sys.stdout = cStringIO.StringIO()
1049 exec compile('print input()', 'test_builtin_tmp', 'exec')
1050 sys.stdin.seek(0, 0)
1051 exec compile('from __future__ import division;print input()',
1052 'test_builtin_tmp', 'exec')
1053 sys.stdin.seek(0, 0)
1054 exec compile('print input()', 'test_builtin_tmp', 'exec')
1055 self.assertEqual(sys.stdout.getvalue().splitlines(),
1056 ['0', '0.5', '0'])
1057
Walter Dörwald919497e2003-01-19 16:23:59 +00001058 del sys.stdout
1059 self.assertRaises(RuntimeError, input, 'prompt')
1060 del sys.stdin
1061 self.assertRaises(RuntimeError, input, 'prompt')
1062 finally:
1063 sys.stdin = savestdin
1064 sys.stdout = savestdout
1065 fp.close()
1066 unlink(TESTFN)
1067
1068 def test_reduce(self):
1069 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1070 self.assertEqual(
1071 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1072 ['a','c','d','w']
1073 )
1074 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1075 self.assertEqual(
1076 reduce(lambda x, y: x*y, range(2,21), 1L),
1077 2432902008176640000L
1078 )
1079 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1080 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1081 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1082 self.assertRaises(TypeError, reduce)
1083 self.assertRaises(TypeError, reduce, 42, 42)
1084 self.assertRaises(TypeError, reduce, 42, 42, 42)
1085 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1086 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1087 self.assertRaises(TypeError, reduce, 42, (42, 42))
1088
1089 class BadSeq:
1090 def __getitem__(self, index):
1091 raise ValueError
1092 self.assertRaises(ValueError, reduce, 42, BadSeq())
1093
1094 def test_reload(self):
1095 import marshal
1096 reload(marshal)
1097 import string
1098 reload(string)
1099 ## import sys
1100 ## self.assertRaises(ImportError, reload, sys)
1101
1102 def test_repr(self):
1103 self.assertEqual(repr(''), '\'\'')
1104 self.assertEqual(repr(0), '0')
1105 self.assertEqual(repr(0L), '0L')
1106 self.assertEqual(repr(()), '()')
1107 self.assertEqual(repr([]), '[]')
1108 self.assertEqual(repr({}), '{}')
1109 a = []
1110 a.append(a)
1111 self.assertEqual(repr(a), '[[...]]')
1112 a = {}
1113 a[0] = a
1114 self.assertEqual(repr(a), '{0: {...}}')
1115
1116 def test_round(self):
1117 self.assertEqual(round(0.0), 0.0)
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(-1.0), -1.0)
1124 self.assertEqual(round(-10.0), -10.0)
1125 self.assertEqual(round(-1000000000.0), -1000000000.0)
1126 self.assertEqual(round(-1e20), -1e20)
1127
1128 self.assertEqual(round(0.1), 0.0)
1129 self.assertEqual(round(1.1), 1.0)
1130 self.assertEqual(round(10.1), 10.0)
1131 self.assertEqual(round(1000000000.1), 1000000000.0)
1132
1133 self.assertEqual(round(-1.1), -1.0)
1134 self.assertEqual(round(-10.1), -10.0)
1135 self.assertEqual(round(-1000000000.1), -1000000000.0)
1136
1137 self.assertEqual(round(0.9), 1.0)
1138 self.assertEqual(round(9.9), 10.0)
1139 self.assertEqual(round(999999999.9), 1000000000.0)
1140
1141 self.assertEqual(round(-0.9), -1.0)
1142 self.assertEqual(round(-9.9), -10.0)
1143 self.assertEqual(round(-999999999.9), -1000000000.0)
1144
1145 self.assertEqual(round(-8.0, -1), -10.0)
1146
1147 self.assertRaises(TypeError, round)
1148
1149 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001150 setattr(sys, 'spam', 1)
1151 self.assertEqual(sys.spam, 1)
1152 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1153 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001154
1155 def test_str(self):
1156 self.assertEqual(str(''), '')
1157 self.assertEqual(str(0), '0')
1158 self.assertEqual(str(0L), '0')
1159 self.assertEqual(str(()), '()')
1160 self.assertEqual(str([]), '[]')
1161 self.assertEqual(str({}), '{}')
1162 a = []
1163 a.append(a)
1164 self.assertEqual(str(a), '[[...]]')
1165 a = {}
1166 a[0] = a
1167 self.assertEqual(str(a), '{0: {...}}')
1168
Alex Martellia70b1912003-04-22 08:12:33 +00001169 def test_sum(self):
1170 self.assertEqual(sum([]), 0)
1171 self.assertEqual(sum(range(2,8)), 27)
1172 self.assertEqual(sum(iter(range(2,8))), 27)
1173 self.assertEqual(sum(Squares(10)), 285)
1174 self.assertEqual(sum(iter(Squares(10))), 285)
1175 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1176
1177 self.assertRaises(TypeError, sum)
1178 self.assertRaises(TypeError, sum, 42)
1179 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1180 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1181 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1182 self.assertRaises(TypeError, sum, [{2:3}])
1183 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1184
1185 class BadSeq:
1186 def __getitem__(self, index):
1187 raise ValueError
1188 self.assertRaises(ValueError, sum, BadSeq())
1189
Walter Dörwald919497e2003-01-19 16:23:59 +00001190 def test_tuple(self):
1191 self.assertEqual(tuple(()), ())
1192 t0_3 = (0, 1, 2, 3)
1193 t0_3_bis = tuple(t0_3)
1194 self.assert_(t0_3 is t0_3_bis)
1195 self.assertEqual(tuple([]), ())
1196 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1197 self.assertEqual(tuple(''), ())
1198 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1199
1200 def test_type(self):
1201 self.assertEqual(type(''), type('123'))
1202 self.assertNotEqual(type(''), type(()))
1203
1204 def test_unichr(self):
1205 if have_unicode:
1206 self.assertEqual(unichr(32), unicode(' '))
1207 self.assertEqual(unichr(65), unicode('A'))
1208 self.assertEqual(unichr(97), unicode('a'))
1209 self.assertEqual(
1210 unichr(sys.maxunicode),
1211 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1212 )
1213 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1214 self.assertRaises(TypeError, unichr)
1215
1216 def get_vars_f0():
1217 return vars()
1218 # we don't want self in vars(), so use staticmethod
1219 get_vars_f0 = staticmethod(get_vars_f0)
1220
1221 def get_vars_f2():
1222 BuiltinTest.get_vars_f0()
1223 a = 1
1224 b = 2
1225 return vars()
1226 get_vars_f2 = staticmethod(get_vars_f2)
1227
1228 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001229 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001230 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001231 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001232 self.assertEqual(self.get_vars_f0(), {})
1233 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1234 self.assertRaises(TypeError, vars, 42, 42)
1235 self.assertRaises(TypeError, vars, 42)
1236
1237 def test_zip(self):
1238 a = (1, 2, 3)
1239 b = (4, 5, 6)
1240 t = [(1, 4), (2, 5), (3, 6)]
1241 self.assertEqual(zip(a, b), t)
1242 b = [4, 5, 6]
1243 self.assertEqual(zip(a, b), t)
1244 b = (4, 5, 6, 7)
1245 self.assertEqual(zip(a, b), t)
1246 class I:
1247 def __getitem__(self, i):
1248 if i < 0 or i > 2: raise IndexError
1249 return i + 4
1250 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001251 self.assertEqual(zip(), [])
1252 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001253 self.assertRaises(TypeError, zip, None)
1254 class G:
1255 pass
1256 self.assertRaises(TypeError, zip, a, G())
1257
1258 # Make sure zip doesn't try to allocate a billion elements for the
1259 # result list when one of its arguments doesn't say how long it is.
1260 # A MemoryError is the most likely failure mode.
1261 class SequenceWithoutALength:
1262 def __getitem__(self, i):
1263 if i == 5:
1264 raise IndexError
1265 else:
1266 return i
1267 self.assertEqual(
1268 zip(SequenceWithoutALength(), xrange(2**30)),
1269 list(enumerate(range(5)))
1270 )
1271
1272 class BadSeq:
1273 def __getitem__(self, i):
1274 if i == 5:
1275 raise ValueError
1276 else:
1277 return i
1278 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1279
Raymond Hettinger64958a12003-12-17 20:43:33 +00001280class TestSorted(unittest.TestCase):
1281
1282 def test_basic(self):
1283 data = range(100)
1284 copy = data[:]
1285 random.shuffle(copy)
1286 self.assertEqual(data, sorted(copy))
1287 self.assertNotEqual(data, copy)
1288
1289 data.reverse()
1290 random.shuffle(copy)
1291 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1292 self.assertNotEqual(data, copy)
1293 random.shuffle(copy)
1294 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1295 self.assertNotEqual(data, copy)
1296 random.shuffle(copy)
1297 self.assertEqual(data, sorted(copy, reverse=1))
1298 self.assertNotEqual(data, copy)
1299
1300 def test_inputtypes(self):
1301 s = 'abracadabra'
1302 for T in [unicode, list, tuple]:
1303 self.assertEqual(sorted(s), sorted(T(s)))
1304
1305 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
1306 for T in [unicode, set, frozenset, list, tuple, dict.fromkeys]:
1307 self.assertEqual(sorted(s), sorted(T(s)))
1308
1309 def test_baddecorator(self):
1310 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1311 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1312
Walter Dörwald919497e2003-01-19 16:23:59 +00001313def test_main():
Raymond Hettinger64958a12003-12-17 20:43:33 +00001314 test.test_support.run_unittest(BuiltinTest, TestSorted)
Walter Dörwald919497e2003-01-19 16:23:59 +00001315
1316if __name__ == "__main__":
1317 test_main()