blob: 05686b91198ab3829d348bd2667f8c663f1a0880 [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
Mark Dickinsona8fd66d2009-11-09 17:03:34 +00003import platform
Georg Brandla4f46e12010-02-07 17:03:15 +00004import unittest
Georg Brandlde9b6242006-04-30 11:13:56 +00005from test.test_support import fcmp, have_unicode, TESTFN, unlink, \
Florent Xicluna07627882010-03-21 01:14:24 +00006 run_unittest, check_py3k_warnings
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00007from operator import neg
Guido van Rossum3bead091992-01-27 17:00:37 +00008
Florent Xicluna07627882010-03-21 01:14:24 +00009import sys, cStringIO, random, UserDict
Guido van Rossum3bead091992-01-27 17:00:37 +000010
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +000011# count the number of test runs.
12# used to skip running test_execfile() multiple times
Georg Brandl4e1be942009-10-27 22:56:09 +000013# and to create unique strings to intern in test_intern()
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +000014numruns = 0
15
Walter Dörwald919497e2003-01-19 16:23:59 +000016class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000017
Walter Dörwald919497e2003-01-19 16:23:59 +000018 def __init__(self, max):
19 self.max = max
20 self.sofar = []
21
22 def __len__(self): return len(self.sofar)
23
24 def __getitem__(self, i):
25 if not 0 <= i < self.max: raise IndexError
26 n = len(self.sofar)
27 while n <= i:
28 self.sofar.append(n*n)
29 n += 1
30 return self.sofar[i]
31
32class StrSquares:
33
34 def __init__(self, max):
35 self.max = max
36 self.sofar = []
37
38 def __len__(self):
39 return len(self.sofar)
40
41 def __getitem__(self, i):
42 if not 0 <= i < self.max:
43 raise IndexError
44 n = len(self.sofar)
45 while n <= i:
46 self.sofar.append(str(n*n))
47 n += 1
48 return self.sofar[i]
49
50class BitBucket:
51 def write(self, line):
52 pass
53
Walter Dörwald919497e2003-01-19 16:23:59 +000054
Raymond Hettinger96229b12005-03-11 06:49:40 +000055class TestFailingBool:
56 def __nonzero__(self):
57 raise RuntimeError
58
59class TestFailingIter:
60 def __iter__(self):
61 raise RuntimeError
62
Walter Dörwald919497e2003-01-19 16:23:59 +000063class BuiltinTest(unittest.TestCase):
64
65 def test_import(self):
66 __import__('sys')
67 __import__('time')
68 __import__('string')
Georg Brandl5240d742007-03-13 20:46:32 +000069 __import__(name='sys')
70 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +000071 self.assertRaises(ImportError, __import__, 'spamspam')
72 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters8ddab272006-04-04 16:17:02 +000073 self.assertRaises(ValueError, __import__, '')
Georg Brandl5240d742007-03-13 20:46:32 +000074 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +000075
76 def test_abs(self):
77 # int
78 self.assertEqual(abs(0), 0)
79 self.assertEqual(abs(1234), 1234)
80 self.assertEqual(abs(-1234), 1234)
Martin v. Löwis820d6ac2006-10-04 05:47:34 +000081 self.assertTrue(abs(-sys.maxint-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +000082 # float
83 self.assertEqual(abs(0.0), 0.0)
84 self.assertEqual(abs(3.14), 3.14)
85 self.assertEqual(abs(-3.14), 3.14)
86 # long
87 self.assertEqual(abs(0L), 0L)
88 self.assertEqual(abs(1234L), 1234L)
89 self.assertEqual(abs(-1234L), 1234L)
90 # str
91 self.assertRaises(TypeError, abs, 'a')
92
Raymond Hettinger96229b12005-03-11 06:49:40 +000093 def test_all(self):
94 self.assertEqual(all([2, 4, 6]), True)
95 self.assertEqual(all([2, None, 6]), False)
96 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
97 self.assertRaises(RuntimeError, all, TestFailingIter())
98 self.assertRaises(TypeError, all, 10) # Non-iterable
99 self.assertRaises(TypeError, all) # No args
100 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
101 self.assertEqual(all([]), True) # Empty iterator
102 S = [50, 60]
103 self.assertEqual(all(x > 42 for x in S), True)
104 S = [50, 40, 60]
105 self.assertEqual(all(x > 42 for x in S), False)
106
107 def test_any(self):
108 self.assertEqual(any([None, None, None]), False)
109 self.assertEqual(any([None, 4, None]), True)
110 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
111 self.assertRaises(RuntimeError, all, TestFailingIter())
112 self.assertRaises(TypeError, any, 10) # Non-iterable
113 self.assertRaises(TypeError, any) # No args
114 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
115 self.assertEqual(any([]), False) # Empty iterator
116 S = [40, 60, 30]
117 self.assertEqual(any(x > 42 for x in S), True)
118 S = [10, 20, 30]
119 self.assertEqual(any(x > 42 for x in S), False)
120
Armin Rigo7ccbca92006-10-04 12:17:45 +0000121 def test_neg(self):
122 x = -sys.maxint-1
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000123 self.assertTrue(isinstance(x, int))
Armin Rigo7ccbca92006-10-04 12:17:45 +0000124 self.assertEqual(-x, sys.maxint+1)
125
Walter Dörwald919497e2003-01-19 16:23:59 +0000126 def test_apply(self):
127 def f0(*args):
128 self.assertEqual(args, ())
129 def f1(a1):
130 self.assertEqual(a1, 1)
131 def f2(a1, a2):
132 self.assertEqual(a1, 1)
133 self.assertEqual(a2, 2)
134 def f3(a1, a2, a3):
135 self.assertEqual(a1, 1)
136 self.assertEqual(a2, 2)
137 self.assertEqual(a3, 3)
138 apply(f0, ())
139 apply(f1, (1,))
140 apply(f2, (1, 2))
141 apply(f3, (1, 2, 3))
142
143 # A PyCFunction that takes only positional parameters should allow an
144 # empty keyword dictionary to pass without a complaint, but raise a
145 # TypeError if the dictionary is non-empty.
146 apply(id, (1,), {})
147 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
148 self.assertRaises(TypeError, apply)
149 self.assertRaises(TypeError, apply, id, 42)
150 self.assertRaises(TypeError, apply, id, (42,), 42)
151
152 def test_callable(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000153 self.assertTrue(callable(len))
Walter Dörwald919497e2003-01-19 16:23:59 +0000154 def f(): pass
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000155 self.assertTrue(callable(f))
Walter Dörwald919497e2003-01-19 16:23:59 +0000156 class C:
157 def meth(self): pass
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000158 self.assertTrue(callable(C))
Walter Dörwald919497e2003-01-19 16:23:59 +0000159 x = C()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000160 self.assertTrue(callable(x.meth))
161 self.assertTrue(not callable(x))
Walter Dörwald919497e2003-01-19 16:23:59 +0000162 class D(C):
163 def __call__(self): pass
164 y = D()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000165 self.assertTrue(callable(y))
Walter Dörwald919497e2003-01-19 16:23:59 +0000166 y()
167
168 def test_chr(self):
169 self.assertEqual(chr(32), ' ')
170 self.assertEqual(chr(65), 'A')
171 self.assertEqual(chr(97), 'a')
172 self.assertEqual(chr(0xff), '\xff')
173 self.assertRaises(ValueError, chr, 256)
174 self.assertRaises(TypeError, chr)
175
176 def test_cmp(self):
177 self.assertEqual(cmp(-1, 1), -1)
178 self.assertEqual(cmp(1, -1), 1)
179 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000180 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000181 a = []; a.append(a)
182 b = []; b.append(b)
183 from UserList import UserList
184 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000185 self.assertRaises(RuntimeError, cmp, a, b)
186 self.assertRaises(RuntimeError, cmp, b, c)
187 self.assertRaises(RuntimeError, cmp, c, a)
188 self.assertRaises(RuntimeError, cmp, a, c)
189 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000190 a.pop(); b.pop(); c.pop()
191 self.assertRaises(TypeError, cmp)
192
193 def test_coerce(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000194 self.assertTrue(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000195 self.assertEqual(coerce(1, 1L), (1L, 1L))
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000196 self.assertTrue(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000197 self.assertRaises(TypeError, coerce)
198 class BadNumber:
199 def __coerce__(self, other):
200 raise ValueError
201 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000202 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000203
204 def test_compile(self):
205 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000206 bom = '\xef\xbb\xbf'
207 compile(bom + 'print 1\n', '', 'exec')
Georg Brandl5240d742007-03-13 20:46:32 +0000208 compile(source='pass', filename='?', mode='exec')
209 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
210 compile('pass', '?', dont_inherit=1, mode='exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000211 self.assertRaises(TypeError, compile)
212 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
213 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000214 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Georg Brandl5240d742007-03-13 20:46:32 +0000215 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
216 mode='eval', source='0', filename='tmp')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000217 if have_unicode:
218 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000219 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
220 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000221
Georg Brandl5240d742007-03-13 20:46:32 +0000222
Walter Dörwald919497e2003-01-19 16:23:59 +0000223 def test_delattr(self):
224 import sys
225 sys.spam = 1
226 delattr(sys, 'spam')
227 self.assertRaises(TypeError, delattr)
228
229 def test_dir(self):
Georg Brandl871f1bc2007-03-12 13:17:36 +0000230 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000231 self.assertRaises(TypeError, dir, 42, 42)
232
Georg Brandl871f1bc2007-03-12 13:17:36 +0000233 # dir() - local scope
234 local_var = 1
Ezio Melottiaa980582010-01-23 23:04:36 +0000235 self.assertIn('local_var', dir())
Georg Brandl871f1bc2007-03-12 13:17:36 +0000236
237 # dir(module)
238 import sys
Ezio Melottiaa980582010-01-23 23:04:36 +0000239 self.assertIn('exit', dir(sys))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000240
241 # dir(module_with_invalid__dict__)
242 import types
243 class Foo(types.ModuleType):
244 __dict__ = 8
245 f = Foo("foo")
246 self.assertRaises(TypeError, dir, f)
247
248 # dir(type)
Ezio Melottiaa980582010-01-23 23:04:36 +0000249 self.assertIn("strip", dir(str))
250 self.assertNotIn("__mro__", dir(str))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000251
252 # dir(obj)
253 class Foo(object):
254 def __init__(self):
255 self.x = 7
256 self.y = 8
257 self.z = 9
258 f = Foo()
Ezio Melottiaa980582010-01-23 23:04:36 +0000259 self.assertIn("y", dir(f))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000260
261 # dir(obj_no__dict__)
262 class Foo(object):
263 __slots__ = []
264 f = Foo()
Ezio Melottiaa980582010-01-23 23:04:36 +0000265 self.assertIn("__repr__", dir(f))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000266
267 # dir(obj_no__class__with__dict__)
268 # (an ugly trick to cause getattr(f, "__class__") to fail)
269 class Foo(object):
270 __slots__ = ["__class__", "__dict__"]
271 def __init__(self):
272 self.bar = "wow"
273 f = Foo()
Ezio Melottiaa980582010-01-23 23:04:36 +0000274 self.assertNotIn("__repr__", dir(f))
275 self.assertIn("bar", dir(f))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000276
277 # dir(obj_using __dir__)
278 class Foo(object):
279 def __dir__(self):
280 return ["kan", "ga", "roo"]
281 f = Foo()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000282 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandl871f1bc2007-03-12 13:17:36 +0000283
284 # dir(obj__dir__not_list)
285 class Foo(object):
286 def __dir__(self):
287 return 7
288 f = Foo()
289 self.assertRaises(TypeError, dir, f)
290
Walter Dörwald919497e2003-01-19 16:23:59 +0000291 def test_divmod(self):
292 self.assertEqual(divmod(12, 7), (1, 5))
293 self.assertEqual(divmod(-12, 7), (-2, 2))
294 self.assertEqual(divmod(12, -7), (-2, -2))
295 self.assertEqual(divmod(-12, -7), (1, -5))
296
297 self.assertEqual(divmod(12L, 7L), (1L, 5L))
298 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
299 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
300 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
301
302 self.assertEqual(divmod(12, 7L), (1, 5L))
303 self.assertEqual(divmod(-12, 7L), (-2, 2L))
304 self.assertEqual(divmod(12L, -7), (-2L, -2))
305 self.assertEqual(divmod(-12L, -7), (1L, -5))
306
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000307 self.assertEqual(divmod(-sys.maxint-1, -1),
308 (sys.maxint+1, 0))
309
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000310 self.assertTrue(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
311 self.assertTrue(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
312 self.assertTrue(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
313 self.assertTrue(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000314
315 self.assertRaises(TypeError, divmod)
316
317 def test_eval(self):
318 self.assertEqual(eval('1+1'), 2)
319 self.assertEqual(eval(' 1+1\n'), 2)
320 globals = {'a': 1, 'b': 2}
321 locals = {'b': 200, 'c': 300}
322 self.assertEqual(eval('a', globals) , 1)
323 self.assertEqual(eval('a', globals, locals), 1)
324 self.assertEqual(eval('b', globals, locals), 200)
325 self.assertEqual(eval('c', globals, locals), 300)
326 if have_unicode:
327 self.assertEqual(eval(unicode('1+1')), 2)
328 self.assertEqual(eval(unicode(' 1+1\n')), 2)
329 globals = {'a': 1, 'b': 2}
330 locals = {'b': 200, 'c': 300}
331 if have_unicode:
332 self.assertEqual(eval(unicode('a'), globals), 1)
333 self.assertEqual(eval(unicode('a'), globals, locals), 1)
334 self.assertEqual(eval(unicode('b'), globals, locals), 200)
335 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000336 bom = '\xef\xbb\xbf'
337 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000338 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
339 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000340 self.assertRaises(TypeError, eval)
341 self.assertRaises(TypeError, eval, ())
342
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000343 def test_general_eval(self):
344 # Tests that general mappings can be used for the locals argument
345
346 class M:
347 "Test mapping interface versus possible calls from eval()."
348 def __getitem__(self, key):
349 if key == 'a':
350 return 12
351 raise KeyError
352 def keys(self):
353 return list('xyz')
354
355 m = M()
356 g = globals()
357 self.assertEqual(eval('a', g, m), 12)
358 self.assertRaises(NameError, eval, 'b', g, m)
359 self.assertEqual(eval('dir()', g, m), list('xyz'))
360 self.assertEqual(eval('globals()', g, m), g)
361 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000362 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000363 class A:
364 "Non-mapping"
365 pass
366 m = A()
367 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000368
369 # Verify that dict subclasses work as well
370 class D(dict):
371 def __getitem__(self, key):
372 if key == 'a':
373 return 12
374 return dict.__getitem__(self, key)
375 def keys(self):
376 return list('xyz')
377
378 d = D()
379 self.assertEqual(eval('a', g, d), 12)
380 self.assertRaises(NameError, eval, 'b', g, d)
381 self.assertEqual(eval('dir()', g, d), list('xyz'))
382 self.assertEqual(eval('globals()', g, d), g)
383 self.assertEqual(eval('locals()', g, d), d)
384
385 # Verify locals stores (used by list comps)
386 eval('[locals() for i in (2,3)]', g, d)
387 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
388
389 class SpreadSheet:
390 "Sample application showing nested, calculated lookups."
391 _cells = {}
392 def __setitem__(self, key, formula):
393 self._cells[key] = formula
Martin Blais215f13d2006-06-06 12:46:55 +0000394 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000395 return eval(self._cells[key], globals(), self)
396
397 ss = SpreadSheet()
398 ss['a1'] = '5'
399 ss['a2'] = 'a1*6'
400 ss['a3'] = 'a2*7'
401 self.assertEqual(ss['a3'], 210)
402
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000403 # Verify that dir() catches a non-list returned by eval
404 # SF bug #1004669
405 class C:
406 def __getitem__(self, item):
407 raise KeyError(item)
408 def keys(self):
409 return 'a'
410 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
411
Walter Dörwald919497e2003-01-19 16:23:59 +0000412 # Done outside of the method test_z to get the correct scope
413 z = 0
414 f = open(TESTFN, 'w')
415 f.write('z = z+1\n')
416 f.write('z = z*2\n')
417 f.close()
Florent Xicluna07627882010-03-21 01:14:24 +0000418 with check_py3k_warnings(("execfile.. not supported in 3.x",
419 DeprecationWarning)):
420 execfile(TESTFN)
Walter Dörwald919497e2003-01-19 16:23:59 +0000421
422 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000423 global numruns
424 if numruns:
425 return
426 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000427
Walter Dörwald919497e2003-01-19 16:23:59 +0000428 globals = {'a': 1, 'b': 2}
429 locals = {'b': 200, 'c': 300}
430
431 self.assertEqual(self.__class__.z, 2)
432 globals['z'] = 0
433 execfile(TESTFN, globals)
434 self.assertEqual(globals['z'], 2)
435 locals['z'] = 0
436 execfile(TESTFN, globals, locals)
437 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000438
439 class M:
440 "Test mapping interface versus possible calls from execfile()."
441 def __init__(self):
442 self.z = 10
443 def __getitem__(self, key):
444 if key == 'z':
445 return self.z
446 raise KeyError
447 def __setitem__(self, key, value):
448 if key == 'z':
449 self.z = value
450 return
451 raise KeyError
452
453 locals = M()
454 locals['z'] = 0
455 execfile(TESTFN, globals, locals)
456 self.assertEqual(locals['z'], 2)
457
Walter Dörwald919497e2003-01-19 16:23:59 +0000458 unlink(TESTFN)
459 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000460 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000461 import os
462 self.assertRaises(IOError, execfile, os.curdir)
463 self.assertRaises(IOError, execfile, "I_dont_exist")
464
465 def test_filter(self):
466 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
467 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
468 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
469 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
470 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
471 def identity(item):
472 return 1
473 filter(identity, Squares(5))
474 self.assertRaises(TypeError, filter)
475 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000476 def __getitem__(self, index):
477 if index<4:
478 return 42
479 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000480 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
481 def badfunc():
482 pass
483 self.assertRaises(TypeError, filter, badfunc, range(5))
484
Walter Dörwaldbf517072003-01-27 15:57:14 +0000485 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000486 self.assertEqual(filter(None, (1, 2)), (1, 2))
487 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
488 self.assertRaises(TypeError, filter, 42, (1, 2))
489
Walter Dörwaldbf517072003-01-27 15:57:14 +0000490 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000491 self.assertEqual(filter(None, "12"), "12")
492 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
493 self.assertRaises(TypeError, filter, 42, "12")
494 class badstr(str):
495 def __getitem__(self, index):
496 raise ValueError
497 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000498
Walter Dörwald903f1e02003-02-04 16:28:00 +0000499 class badstr2(str):
500 def __getitem__(self, index):
501 return 42
502 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
503
504 class weirdstr(str):
505 def __getitem__(self, index):
506 return weirdstr(2*str.__getitem__(self, index))
507 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
508
Walter Dörwald5e61e242003-02-04 17:04:01 +0000509 class shiftstr(str):
510 def __getitem__(self, index):
511 return chr(ord(str.__getitem__(self, index))+1)
512 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
513
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000514 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000515 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000516 self.assertEqual(filter(None, unicode("12")), unicode("12"))
517 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
518 self.assertRaises(TypeError, filter, 42, unicode("12"))
519 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000520
Walter Dörwald903f1e02003-02-04 16:28:00 +0000521 class badunicode(unicode):
522 def __getitem__(self, index):
523 return 42
524 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
525
526 class weirdunicode(unicode):
527 def __getitem__(self, index):
528 return weirdunicode(2*unicode.__getitem__(self, index))
529 self.assertEqual(
530 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
531
Walter Dörwald5e61e242003-02-04 17:04:01 +0000532 class shiftunicode(unicode):
533 def __getitem__(self, index):
534 return unichr(ord(unicode.__getitem__(self, index))+1)
535 self.assertEqual(
536 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
537 unicode("345")
538 )
539
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000540 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000541 # test that filter() never returns tuple, str or unicode subclasses
542 # and that the result always goes through __getitem__
543 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000544 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000545 def __getitem__(self, index):
546 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000547 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000548 def __getitem__(self, index):
549 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000550 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000551 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000552 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000553 }
554 if have_unicode:
555 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000556 def __getitem__(self, index):
557 return 2*unicode.__getitem__(self, index)
558 inputs[unicode2] = {
559 unicode(): unicode(),
560 unicode("123"): unicode("112233")
561 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000562
Walter Dörwald1918f772003-02-10 13:19:13 +0000563 for (cls, inps) in inputs.iteritems():
564 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000565 # make sure the output goes through __getitem__
566 # even if func is None
567 self.assertEqual(
568 filter(funcs[0], cls(inp)),
569 filter(funcs[1], cls(inp))
570 )
571 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000572 outp = filter(func, cls(inp))
573 self.assertEqual(outp, exp)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000574 self.assertTrue(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000575
Walter Dörwald919497e2003-01-19 16:23:59 +0000576 def test_getattr(self):
577 import sys
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000578 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000579 self.assertRaises(TypeError, getattr, sys, 1)
580 self.assertRaises(TypeError, getattr, sys, 1, "foo")
581 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000582 if have_unicode:
583 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000584
585 def test_hasattr(self):
586 import sys
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000587 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000588 self.assertRaises(TypeError, hasattr, sys, 1)
589 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000590 if have_unicode:
591 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000592
Benjamin Petersonb9030f42008-05-12 00:41:23 +0000593 # Check that hasattr allows SystemExit and KeyboardInterrupts by
594 class A:
595 def __getattr__(self, what):
596 raise KeyboardInterrupt
597 self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
598 class B:
599 def __getattr__(self, what):
600 raise SystemExit
601 self.assertRaises(SystemExit, hasattr, B(), "b")
602
Walter Dörwald919497e2003-01-19 16:23:59 +0000603 def test_hash(self):
604 hash(None)
605 self.assertEqual(hash(1), hash(1L))
606 self.assertEqual(hash(1), hash(1.0))
607 hash('spam')
608 if have_unicode:
609 self.assertEqual(hash('spam'), hash(unicode('spam')))
610 hash((0,1,2,3))
611 def f(): pass
612 self.assertRaises(TypeError, hash, [])
613 self.assertRaises(TypeError, hash, {})
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000614 # Bug 1536021: Allow hash to return long objects
615 class X:
616 def __hash__(self):
617 return 2**100
618 self.assertEquals(type(hash(X())), int)
619 class Y(object):
620 def __hash__(self):
621 return 2**100
622 self.assertEquals(type(hash(Y())), int)
Armin Rigo51fc8c42006-08-09 14:55:26 +0000623 class Z(long):
624 def __hash__(self):
625 return self
626 self.assertEquals(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000627
628 def test_hex(self):
629 self.assertEqual(hex(16), '0x10')
630 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000631 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000632 self.assertEqual(hex(-16L), '-0x10L')
633 self.assertRaises(TypeError, hex, {})
634
635 def test_id(self):
636 id(None)
637 id(1)
638 id(1L)
639 id(1.0)
640 id('spam')
641 id((0,1,2,3))
642 id([0,1,2,3])
643 id({'spam': 1, 'eggs': 2, 'ham': 3})
644
645 # Test input() later, together with raw_input
646
Walter Dörwald919497e2003-01-19 16:23:59 +0000647 def test_intern(self):
648 self.assertRaises(TypeError, intern)
Georg Brandl4e1be942009-10-27 22:56:09 +0000649 # This fails if the test is run twice with a constant string,
650 # therefore append the run counter
651 s = "never interned before " + str(numruns)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000652 self.assertTrue(intern(s) is s)
Walter Dörwald919497e2003-01-19 16:23:59 +0000653 s2 = s.swapcase().swapcase()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000654 self.assertTrue(intern(s2) is s)
Walter Dörwald919497e2003-01-19 16:23:59 +0000655
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000656 # Subclasses of string can't be interned, because they
657 # provide too much opportunity for insane things to happen.
658 # We don't want them in the interned dict and if they aren't
659 # actually interned, we don't want to create the appearance
660 # that they are by allowing intern() to succeeed.
661 class S(str):
662 def __hash__(self):
663 return 123
664
665 self.assertRaises(TypeError, intern, S("abc"))
666
667 # It's still safe to pass these strings to routines that
668 # call intern internally, e.g. PyObject_SetAttr().
669 s = S("abc")
670 setattr(s, s, s)
671 self.assertEqual(getattr(s, s), s)
672
Walter Dörwald919497e2003-01-19 16:23:59 +0000673 def test_iter(self):
674 self.assertRaises(TypeError, iter)
675 self.assertRaises(TypeError, iter, 42, 42)
676 lists = [("1", "2"), ["1", "2"], "12"]
677 if have_unicode:
678 lists.append(unicode("12"))
679 for l in lists:
680 i = iter(l)
681 self.assertEqual(i.next(), '1')
682 self.assertEqual(i.next(), '2')
683 self.assertRaises(StopIteration, i.next)
684
685 def test_isinstance(self):
686 class C:
687 pass
688 class D(C):
689 pass
690 class E:
691 pass
692 c = C()
693 d = D()
694 e = E()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000695 self.assertTrue(isinstance(c, C))
696 self.assertTrue(isinstance(d, C))
697 self.assertTrue(not isinstance(e, C))
698 self.assertTrue(not isinstance(c, D))
699 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000700 self.assertRaises(TypeError, isinstance, E, 'foo')
701 self.assertRaises(TypeError, isinstance)
702
703 def test_issubclass(self):
704 class C:
705 pass
706 class D(C):
707 pass
708 class E:
709 pass
710 c = C()
711 d = D()
712 e = E()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000713 self.assertTrue(issubclass(D, C))
714 self.assertTrue(issubclass(C, C))
715 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000716 self.assertRaises(TypeError, issubclass, 'foo', E)
717 self.assertRaises(TypeError, issubclass, E, 'foo')
718 self.assertRaises(TypeError, issubclass)
719
720 def test_len(self):
721 self.assertEqual(len('123'), 3)
722 self.assertEqual(len(()), 0)
723 self.assertEqual(len((1, 2, 3, 4)), 4)
724 self.assertEqual(len([1, 2, 3, 4]), 4)
725 self.assertEqual(len({}), 0)
726 self.assertEqual(len({'a':1, 'b': 2}), 2)
727 class BadSeq:
728 def __len__(self):
729 raise ValueError
730 self.assertRaises(ValueError, len, BadSeq())
731
Walter Dörwald919497e2003-01-19 16:23:59 +0000732 def test_map(self):
733 self.assertEqual(
734 map(None, 'hello world'),
735 ['h','e','l','l','o',' ','w','o','r','l','d']
736 )
737 self.assertEqual(
738 map(None, 'abcd', 'efg'),
739 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
740 )
741 self.assertEqual(
742 map(None, range(10)),
743 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
744 )
745 self.assertEqual(
746 map(lambda x: x*x, range(1,4)),
747 [1, 4, 9]
748 )
749 try:
750 from math import sqrt
751 except ImportError:
752 def sqrt(x):
753 return pow(x, 0.5)
754 self.assertEqual(
755 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
756 [[4.0, 2.0], [9.0, 3.0]]
757 )
758 self.assertEqual(
759 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
760 [10, 4, 6]
761 )
762
763 def plus(*v):
764 accu = 0
765 for i in v: accu = accu + i
766 return accu
767 self.assertEqual(
768 map(plus, [1, 3, 7]),
769 [1, 3, 7]
770 )
771 self.assertEqual(
772 map(plus, [1, 3, 7], [4, 9, 2]),
773 [1+4, 3+9, 7+2]
774 )
775 self.assertEqual(
776 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
777 [1+4+1, 3+9+1, 7+2+0]
778 )
779 self.assertEqual(
780 map(None, Squares(10)),
781 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
782 )
783 self.assertEqual(
784 map(int, Squares(10)),
785 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
786 )
787 self.assertEqual(
788 map(None, Squares(3), Squares(2)),
789 [(0,0), (1,1), (4,None)]
790 )
791 self.assertEqual(
792 map(max, Squares(3), Squares(2)),
793 [0, 1, 4]
794 )
795 self.assertRaises(TypeError, map)
796 self.assertRaises(TypeError, map, lambda x: x, 42)
797 self.assertEqual(map(None, [42]), [42])
798 class BadSeq:
799 def __getitem__(self, index):
800 raise ValueError
801 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +0000802 def badfunc(x):
803 raise RuntimeError
804 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000805
806 def test_max(self):
807 self.assertEqual(max('123123'), '3')
808 self.assertEqual(max(1, 2, 3), 3)
809 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
810 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
811
812 self.assertEqual(max(1, 2L, 3.0), 3.0)
813 self.assertEqual(max(1L, 2.0, 3), 3)
814 self.assertEqual(max(1.0, 2, 3L), 3L)
815
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000816 for stmt in (
817 "max(key=int)", # no args
818 "max(1, key=int)", # single arg not iterable
819 "max(1, 2, keystone=int)", # wrong keyword
820 "max(1, 2, key=int, abc=int)", # two many keywords
821 "max(1, 2, key=1)", # keyfunc is not callable
822 ):
Tim Peters7f061872004-12-07 21:17:46 +0000823 try:
824 exec(stmt) in globals()
825 except TypeError:
826 pass
827 else:
828 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000829
830 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
831 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
832 self.assertEqual(max(1, 2, key=neg), 1) # two elems
833
834 data = [random.randrange(200) for i in range(100)]
835 keys = dict((elem, random.randrange(50)) for elem in data)
836 f = keys.__getitem__
837 self.assertEqual(max(data, key=f),
838 sorted(reversed(data), key=f)[-1])
839
Walter Dörwald919497e2003-01-19 16:23:59 +0000840 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
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000862 for stmt in (
863 "min(key=int)", # no args
864 "min(1, key=int)", # single arg not iterable
865 "min(1, 2, keystone=int)", # wrong keyword
866 "min(1, 2, key=int, abc=int)", # two many keywords
867 "min(1, 2, key=1)", # keyfunc is not callable
868 ):
Tim Peters7f061872004-12-07 21:17:46 +0000869 try:
870 exec(stmt) in globals()
871 except TypeError:
872 pass
873 else:
874 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000875
876 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
877 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
878 self.assertEqual(min(1, 2, key=neg), 2) # two elems
879
880 data = [random.randrange(200) for i in range(100)]
881 keys = dict((elem, random.randrange(50)) for elem in data)
882 f = keys.__getitem__
883 self.assertEqual(min(data, key=f),
884 sorted(data, key=f)[0])
885
Georg Brandl28e08732008-04-30 19:47:09 +0000886 def test_next(self):
887 it = iter(range(2))
888 self.assertEqual(next(it), 0)
889 self.assertEqual(next(it), 1)
890 self.assertRaises(StopIteration, next, it)
891 self.assertRaises(StopIteration, next, it)
892 self.assertEquals(next(it, 42), 42)
893
894 class Iter(object):
895 def __iter__(self):
896 return self
897 def next(self):
898 raise StopIteration
899
900 it = iter(Iter())
901 self.assertEquals(next(it, 42), 42)
902 self.assertRaises(StopIteration, next, it)
903
904 def gen():
905 yield 1
906 return
907
908 it = gen()
909 self.assertEquals(next(it), 1)
910 self.assertRaises(StopIteration, next, it)
911 self.assertEquals(next(it, 42), 42)
912
Walter Dörwald919497e2003-01-19 16:23:59 +0000913 def test_oct(self):
914 self.assertEqual(oct(100), '0144')
915 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000916 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000917 self.assertEqual(oct(-100L), '-0144L')
918 self.assertRaises(TypeError, oct, ())
919
920 def write_testfile(self):
921 # NB the first 4 lines are also used to test input and raw_input, below
922 fp = open(TESTFN, 'w')
923 try:
924 fp.write('1+1\n')
925 fp.write('1+1\n')
926 fp.write('The quick brown fox jumps over the lazy dog')
927 fp.write('.\n')
928 fp.write('Dear John\n')
929 fp.write('XXX'*100)
930 fp.write('YYY'*100)
931 finally:
932 fp.close()
933
934 def test_open(self):
935 self.write_testfile()
936 fp = open(TESTFN, 'r')
937 try:
938 self.assertEqual(fp.readline(4), '1+1\n')
939 self.assertEqual(fp.readline(4), '1+1\n')
940 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
941 self.assertEqual(fp.readline(4), 'Dear')
942 self.assertEqual(fp.readline(100), ' John\n')
943 self.assertEqual(fp.read(300), 'XXX'*100)
944 self.assertEqual(fp.read(1000), 'YYY'*100)
945 finally:
946 fp.close()
947 unlink(TESTFN)
948
949 def test_ord(self):
950 self.assertEqual(ord(' '), 32)
951 self.assertEqual(ord('A'), 65)
952 self.assertEqual(ord('a'), 97)
953 if have_unicode:
954 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
955 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000956 if have_unicode:
957 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000958
959 def test_pow(self):
960 self.assertEqual(pow(0,0), 1)
961 self.assertEqual(pow(0,1), 0)
962 self.assertEqual(pow(1,0), 1)
963 self.assertEqual(pow(1,1), 1)
964
965 self.assertEqual(pow(2,0), 1)
966 self.assertEqual(pow(2,10), 1024)
967 self.assertEqual(pow(2,20), 1024*1024)
968 self.assertEqual(pow(2,30), 1024*1024*1024)
969
970 self.assertEqual(pow(-2,0), 1)
971 self.assertEqual(pow(-2,1), -2)
972 self.assertEqual(pow(-2,2), 4)
973 self.assertEqual(pow(-2,3), -8)
974
975 self.assertEqual(pow(0L,0), 1)
976 self.assertEqual(pow(0L,1), 0)
977 self.assertEqual(pow(1L,0), 1)
978 self.assertEqual(pow(1L,1), 1)
979
980 self.assertEqual(pow(2L,0), 1)
981 self.assertEqual(pow(2L,10), 1024)
982 self.assertEqual(pow(2L,20), 1024*1024)
983 self.assertEqual(pow(2L,30), 1024*1024*1024)
984
985 self.assertEqual(pow(-2L,0), 1)
986 self.assertEqual(pow(-2L,1), -2)
987 self.assertEqual(pow(-2L,2), 4)
988 self.assertEqual(pow(-2L,3), -8)
989
990 self.assertAlmostEqual(pow(0.,0), 1.)
991 self.assertAlmostEqual(pow(0.,1), 0.)
992 self.assertAlmostEqual(pow(1.,0), 1.)
993 self.assertAlmostEqual(pow(1.,1), 1.)
994
995 self.assertAlmostEqual(pow(2.,0), 1.)
996 self.assertAlmostEqual(pow(2.,10), 1024.)
997 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
998 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
999
1000 self.assertAlmostEqual(pow(-2.,0), 1.)
1001 self.assertAlmostEqual(pow(-2.,1), -2.)
1002 self.assertAlmostEqual(pow(-2.,2), 4.)
1003 self.assertAlmostEqual(pow(-2.,3), -8.)
1004
1005 for x in 2, 2L, 2.0:
1006 for y in 10, 10L, 10.0:
1007 for z in 1000, 1000L, 1000.0:
1008 if isinstance(x, float) or \
1009 isinstance(y, float) or \
1010 isinstance(z, float):
1011 self.assertRaises(TypeError, pow, x, y, z)
1012 else:
1013 self.assertAlmostEqual(pow(x, y, z), 24.0)
1014
1015 self.assertRaises(TypeError, pow, -1, -2, 3)
1016 self.assertRaises(ValueError, pow, 1, 2, 0)
1017 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1018 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001019 # Will return complex in 3.0:
1020 self.assertRaises(ValueError, pow, -342.43, 0.234)
Walter Dörwald919497e2003-01-19 16:23:59 +00001021
1022 self.assertRaises(TypeError, pow)
1023
1024 def test_range(self):
1025 self.assertEqual(range(3), [0, 1, 2])
1026 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1027 self.assertEqual(range(0), [])
1028 self.assertEqual(range(-3), [])
1029 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1030 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1031
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001032 # Now test range() with longs
1033 self.assertEqual(range(-2**100), [])
1034 self.assertEqual(range(0, -2**100), [])
1035 self.assertEqual(range(0, 2**100, -1), [])
1036 self.assertEqual(range(0, 2**100, -1), [])
1037
1038 a = long(10 * sys.maxint)
1039 b = long(100 * sys.maxint)
1040 c = long(50 * sys.maxint)
1041
1042 self.assertEqual(range(a, a+2), [a, a+1])
1043 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1044 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1045
1046 seq = range(a, b, c)
Ezio Melottiaa980582010-01-23 23:04:36 +00001047 self.assertIn(a, seq)
1048 self.assertNotIn(b, seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001049 self.assertEqual(len(seq), 2)
1050
1051 seq = range(b, a, -c)
Ezio Melottiaa980582010-01-23 23:04:36 +00001052 self.assertIn(b, seq)
1053 self.assertNotIn(a, seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001054 self.assertEqual(len(seq), 2)
1055
1056 seq = range(-a, -b, -c)
Ezio Melottiaa980582010-01-23 23:04:36 +00001057 self.assertIn(-a, seq)
1058 self.assertNotIn(-b, seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001059 self.assertEqual(len(seq), 2)
1060
Walter Dörwald919497e2003-01-19 16:23:59 +00001061 self.assertRaises(TypeError, range)
1062 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1063 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001064 self.assertRaises(ValueError, range, a, a + 1, long(0))
1065
1066 class badzero(int):
1067 def __cmp__(self, other):
1068 raise RuntimeError
Nick Coghlan48361f52008-08-11 15:45:58 +00001069 __hash__ = None # Invalid cmp makes this unhashable
Neal Norwitzfcf44352005-11-27 20:37:43 +00001070 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001071
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001072 # Reject floats when it would require PyLongs to represent.
1073 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001074 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001075
Walter Dörwald357981e2003-04-15 18:59:28 +00001076 self.assertRaises(TypeError, range, 0, "spam")
1077 self.assertRaises(TypeError, range, 0, 42, "spam")
1078
1079 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1080 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1081
Walter Dörwald919497e2003-01-19 16:23:59 +00001082 def test_input_and_raw_input(self):
1083 self.write_testfile()
1084 fp = open(TESTFN, 'r')
1085 savestdin = sys.stdin
1086 savestdout = sys.stdout # Eats the echo
1087 try:
1088 sys.stdin = fp
1089 sys.stdout = BitBucket()
1090 self.assertEqual(input(), 2)
1091 self.assertEqual(input('testing\n'), 2)
1092 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1093 self.assertEqual(raw_input('testing\n'), 'Dear John')
Tim Peters8e24a962006-08-09 00:52:26 +00001094
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001095 # SF 1535165: don't segfault on closed stdin
1096 # sys.stdout must be a regular file for triggering
1097 sys.stdout = savestdout
1098 sys.stdin.close()
Georg Brandld336e982006-08-06 09:17:16 +00001099 self.assertRaises(ValueError, input)
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001100
1101 sys.stdout = BitBucket()
Walter Dörwald919497e2003-01-19 16:23:59 +00001102 sys.stdin = cStringIO.StringIO("NULL\0")
1103 self.assertRaises(TypeError, input, 42, 42)
1104 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1105 self.assertEqual(input(), 'whitespace')
1106 sys.stdin = cStringIO.StringIO()
1107 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001108
1109 # SF 876178: make sure input() respect future options.
1110 sys.stdin = cStringIO.StringIO('1/2')
1111 sys.stdout = cStringIO.StringIO()
1112 exec compile('print input()', 'test_builtin_tmp', 'exec')
1113 sys.stdin.seek(0, 0)
1114 exec compile('from __future__ import division;print input()',
1115 'test_builtin_tmp', 'exec')
1116 sys.stdin.seek(0, 0)
1117 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001118 # The result we expect depends on whether new division semantics
1119 # are already in effect.
1120 if 1/2 == 0:
1121 # This test was compiled with old semantics.
1122 expected = ['0', '0.5', '0']
1123 else:
1124 # This test was compiled with new semantics (e.g., -Qnew
1125 # was given on the command line.
1126 expected = ['0.5', '0.5', '0.5']
1127 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001128
Walter Dörwald919497e2003-01-19 16:23:59 +00001129 del sys.stdout
1130 self.assertRaises(RuntimeError, input, 'prompt')
1131 del sys.stdin
1132 self.assertRaises(RuntimeError, input, 'prompt')
1133 finally:
1134 sys.stdin = savestdin
1135 sys.stdout = savestdout
1136 fp.close()
1137 unlink(TESTFN)
1138
1139 def test_reduce(self):
1140 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1141 self.assertEqual(
1142 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1143 ['a','c','d','w']
1144 )
1145 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1146 self.assertEqual(
1147 reduce(lambda x, y: x*y, range(2,21), 1L),
1148 2432902008176640000L
1149 )
1150 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1151 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1152 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1153 self.assertRaises(TypeError, reduce)
1154 self.assertRaises(TypeError, reduce, 42, 42)
1155 self.assertRaises(TypeError, reduce, 42, 42, 42)
1156 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1157 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1158 self.assertRaises(TypeError, reduce, 42, (42, 42))
1159
1160 class BadSeq:
1161 def __getitem__(self, index):
1162 raise ValueError
1163 self.assertRaises(ValueError, reduce, 42, BadSeq())
1164
1165 def test_reload(self):
1166 import marshal
1167 reload(marshal)
1168 import string
1169 reload(string)
1170 ## import sys
1171 ## self.assertRaises(ImportError, reload, sys)
1172
1173 def test_repr(self):
1174 self.assertEqual(repr(''), '\'\'')
1175 self.assertEqual(repr(0), '0')
1176 self.assertEqual(repr(0L), '0L')
1177 self.assertEqual(repr(()), '()')
1178 self.assertEqual(repr([]), '[]')
1179 self.assertEqual(repr({}), '{}')
1180 a = []
1181 a.append(a)
1182 self.assertEqual(repr(a), '[[...]]')
1183 a = {}
1184 a[0] = a
1185 self.assertEqual(repr(a), '{0: {...}}')
1186
1187 def test_round(self):
1188 self.assertEqual(round(0.0), 0.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001189 self.assertEqual(type(round(0.0)), float) # Will be int in 3.0.
Walter Dörwald919497e2003-01-19 16:23:59 +00001190 self.assertEqual(round(1.0), 1.0)
1191 self.assertEqual(round(10.0), 10.0)
1192 self.assertEqual(round(1000000000.0), 1000000000.0)
1193 self.assertEqual(round(1e20), 1e20)
1194
1195 self.assertEqual(round(-1.0), -1.0)
1196 self.assertEqual(round(-10.0), -10.0)
1197 self.assertEqual(round(-1000000000.0), -1000000000.0)
1198 self.assertEqual(round(-1e20), -1e20)
1199
1200 self.assertEqual(round(0.1), 0.0)
1201 self.assertEqual(round(1.1), 1.0)
1202 self.assertEqual(round(10.1), 10.0)
1203 self.assertEqual(round(1000000000.1), 1000000000.0)
1204
1205 self.assertEqual(round(-1.1), -1.0)
1206 self.assertEqual(round(-10.1), -10.0)
1207 self.assertEqual(round(-1000000000.1), -1000000000.0)
1208
1209 self.assertEqual(round(0.9), 1.0)
1210 self.assertEqual(round(9.9), 10.0)
1211 self.assertEqual(round(999999999.9), 1000000000.0)
1212
1213 self.assertEqual(round(-0.9), -1.0)
1214 self.assertEqual(round(-9.9), -10.0)
1215 self.assertEqual(round(-999999999.9), -1000000000.0)
1216
1217 self.assertEqual(round(-8.0, -1), -10.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001218 self.assertEqual(type(round(-8.0, -1)), float)
1219
1220 self.assertEqual(type(round(-8.0, 0)), float)
1221 self.assertEqual(type(round(-8.0, 1)), float)
1222
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001223 # Check half rounding behaviour.
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001224 self.assertEqual(round(5.5), 6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001225 self.assertEqual(round(6.5), 7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001226 self.assertEqual(round(-5.5), -6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001227 self.assertEqual(round(-6.5), -7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001228
1229 # Check behavior on ints
1230 self.assertEqual(round(0), 0)
1231 self.assertEqual(round(8), 8)
1232 self.assertEqual(round(-8), -8)
1233 self.assertEqual(type(round(0)), float) # Will be int in 3.0.
1234 self.assertEqual(type(round(-8, -1)), float)
1235 self.assertEqual(type(round(-8, 0)), float)
1236 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001237
Georg Brandlccadf842006-03-31 18:54:53 +00001238 # test new kwargs
1239 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1240
Walter Dörwald919497e2003-01-19 16:23:59 +00001241 self.assertRaises(TypeError, round)
1242
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001243 # test generic rounding delegation for reals
1244 class TestRound(object):
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001245 def __float__(self):
1246 return 23.0
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001247
1248 class TestNoRound(object):
1249 pass
1250
1251 self.assertEqual(round(TestRound()), 23)
1252
1253 self.assertRaises(TypeError, round, 1, 2, 3)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001254 self.assertRaises(TypeError, round, TestNoRound())
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001255
1256 t = TestNoRound()
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001257 t.__float__ = lambda *args: args
1258 self.assertRaises(TypeError, round, t)
1259 self.assertRaises(TypeError, round, t, 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001260
Mark Dickinsona8fd66d2009-11-09 17:03:34 +00001261 # Some versions of glibc for alpha have a bug that affects
1262 # float -> integer rounding (floor, ceil, rint, round) for
1263 # values in the range [2**52, 2**53). See:
1264 #
1265 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1266 #
1267 # We skip this test on Linux/alpha if it would fail.
1268 linux_alpha = (platform.system().startswith('Linux') and
1269 platform.machine().startswith('alpha'))
1270 system_round_bug = round(5e15+1) != 5e15+1
1271 @unittest.skipIf(linux_alpha and system_round_bug,
1272 "test will fail; failure is probably due to a "
1273 "buggy system round function")
1274 def test_round_large(self):
1275 # Issue #1869: integral floats should remain unchanged
1276 self.assertEqual(round(5e15-1), 5e15-1)
1277 self.assertEqual(round(5e15), 5e15)
1278 self.assertEqual(round(5e15+1), 5e15+1)
1279 self.assertEqual(round(5e15+2), 5e15+2)
1280 self.assertEqual(round(5e15+3), 5e15+3)
1281
Walter Dörwald919497e2003-01-19 16:23:59 +00001282 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001283 setattr(sys, 'spam', 1)
1284 self.assertEqual(sys.spam, 1)
1285 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1286 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001287
Alex Martellia70b1912003-04-22 08:12:33 +00001288 def test_sum(self):
1289 self.assertEqual(sum([]), 0)
1290 self.assertEqual(sum(range(2,8)), 27)
1291 self.assertEqual(sum(iter(range(2,8))), 27)
1292 self.assertEqual(sum(Squares(10)), 285)
1293 self.assertEqual(sum(iter(Squares(10))), 285)
1294 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1295
1296 self.assertRaises(TypeError, sum)
1297 self.assertRaises(TypeError, sum, 42)
1298 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1299 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1300 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1301 self.assertRaises(TypeError, sum, [{2:3}])
1302 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1303
1304 class BadSeq:
1305 def __getitem__(self, index):
1306 raise ValueError
1307 self.assertRaises(ValueError, sum, BadSeq())
1308
Mark Dickinsonbfd2dc72009-10-17 21:46:32 +00001309 empty = []
1310 sum(([x] for x in range(10)), empty)
1311 self.assertEqual(empty, [])
1312
Walter Dörwald919497e2003-01-19 16:23:59 +00001313 def test_type(self):
1314 self.assertEqual(type(''), type('123'))
1315 self.assertNotEqual(type(''), type(()))
1316
1317 def test_unichr(self):
1318 if have_unicode:
1319 self.assertEqual(unichr(32), unicode(' '))
1320 self.assertEqual(unichr(65), unicode('A'))
1321 self.assertEqual(unichr(97), unicode('a'))
1322 self.assertEqual(
1323 unichr(sys.maxunicode),
1324 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1325 )
1326 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1327 self.assertRaises(TypeError, unichr)
Amaury Forgeot d'Arc39fd6722008-07-31 21:28:03 +00001328 self.assertRaises((OverflowError, ValueError), unichr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +00001329
Guido van Rossumfee7b932005-01-16 00:21:28 +00001330 # We don't want self in vars(), so these are static methods
1331
1332 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001333 def get_vars_f0():
1334 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001335
Guido van Rossumfee7b932005-01-16 00:21:28 +00001336 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001337 def get_vars_f2():
1338 BuiltinTest.get_vars_f0()
1339 a = 1
1340 b = 2
1341 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001342
1343 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001344 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001345 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001346 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001347 self.assertEqual(self.get_vars_f0(), {})
1348 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1349 self.assertRaises(TypeError, vars, 42, 42)
1350 self.assertRaises(TypeError, vars, 42)
1351
1352 def test_zip(self):
1353 a = (1, 2, 3)
1354 b = (4, 5, 6)
1355 t = [(1, 4), (2, 5), (3, 6)]
1356 self.assertEqual(zip(a, b), t)
1357 b = [4, 5, 6]
1358 self.assertEqual(zip(a, b), t)
1359 b = (4, 5, 6, 7)
1360 self.assertEqual(zip(a, b), t)
1361 class I:
1362 def __getitem__(self, i):
1363 if i < 0 or i > 2: raise IndexError
1364 return i + 4
1365 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001366 self.assertEqual(zip(), [])
1367 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001368 self.assertRaises(TypeError, zip, None)
1369 class G:
1370 pass
1371 self.assertRaises(TypeError, zip, a, G())
1372
1373 # Make sure zip doesn't try to allocate a billion elements for the
1374 # result list when one of its arguments doesn't say how long it is.
1375 # A MemoryError is the most likely failure mode.
1376 class SequenceWithoutALength:
1377 def __getitem__(self, i):
1378 if i == 5:
1379 raise IndexError
1380 else:
1381 return i
1382 self.assertEqual(
1383 zip(SequenceWithoutALength(), xrange(2**30)),
1384 list(enumerate(range(5)))
1385 )
1386
1387 class BadSeq:
1388 def __getitem__(self, i):
1389 if i == 5:
1390 raise ValueError
1391 else:
1392 return i
1393 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1394
Eric Smitha9f7d622008-02-17 19:46:49 +00001395 def test_format(self):
1396 # Test the basic machinery of the format() builtin. Don't test
1397 # the specifics of the various formatters
1398 self.assertEqual(format(3, ''), '3')
1399
1400 # Returns some classes to use for various tests. There's
1401 # an old-style version, and a new-style version
1402 def classes_new():
1403 class A(object):
1404 def __init__(self, x):
1405 self.x = x
1406 def __format__(self, format_spec):
1407 return str(self.x) + format_spec
1408 class DerivedFromA(A):
1409 pass
1410
1411 class Simple(object): pass
1412 class DerivedFromSimple(Simple):
1413 def __init__(self, x):
1414 self.x = x
1415 def __format__(self, format_spec):
1416 return str(self.x) + format_spec
1417 class DerivedFromSimple2(DerivedFromSimple): pass
1418 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1419
1420 # In 3.0, classes_classic has the same meaning as classes_new
1421 def classes_classic():
1422 class A:
1423 def __init__(self, x):
1424 self.x = x
1425 def __format__(self, format_spec):
1426 return str(self.x) + format_spec
1427 class DerivedFromA(A):
1428 pass
1429
1430 class Simple: pass
1431 class DerivedFromSimple(Simple):
1432 def __init__(self, x):
1433 self.x = x
1434 def __format__(self, format_spec):
1435 return str(self.x) + format_spec
1436 class DerivedFromSimple2(DerivedFromSimple): pass
1437 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1438
1439 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1440 self.assertEqual(format(A(3), 'spec'), '3spec')
1441 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1442 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1443 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1444 '10abcdef')
1445
1446 class_test(*classes_new())
1447 class_test(*classes_classic())
1448
1449 def empty_format_spec(value):
1450 # test that:
1451 # format(x, '') == str(x)
1452 # format(x) == str(x)
1453 self.assertEqual(format(value, ""), str(value))
1454 self.assertEqual(format(value), str(value))
1455
1456 # for builtin types, format(x, "") == str(x)
1457 empty_format_spec(17**13)
1458 empty_format_spec(1.0)
1459 empty_format_spec(3.1415e104)
1460 empty_format_spec(-3.1415e104)
1461 empty_format_spec(3.1415e-104)
1462 empty_format_spec(-3.1415e-104)
1463 empty_format_spec(object)
1464 empty_format_spec(None)
1465
1466 # TypeError because self.__format__ returns the wrong type
1467 class BadFormatResult:
1468 def __format__(self, format_spec):
1469 return 1.0
1470 self.assertRaises(TypeError, format, BadFormatResult(), "")
1471
1472 # TypeError because format_spec is not unicode or str
1473 self.assertRaises(TypeError, format, object(), 4)
1474 self.assertRaises(TypeError, format, object(), object())
1475
1476 # tests for object.__format__ really belong elsewhere, but
1477 # there's no good place to put them
1478 x = object().__format__('')
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001479 self.assertTrue(x.startswith('<object object at'))
Eric Smitha9f7d622008-02-17 19:46:49 +00001480
1481 # first argument to object.__format__ must be string
1482 self.assertRaises(TypeError, object().__format__, 3)
1483 self.assertRaises(TypeError, object().__format__, object())
1484 self.assertRaises(TypeError, object().__format__, None)
1485
1486 # make sure we can take a subclass of str as a format spec
1487 class DerivedFromStr(str): pass
1488 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1489
Eric Smithfb0742f2008-02-22 17:43:17 +00001490 def test_bin(self):
1491 self.assertEqual(bin(0), '0b0')
1492 self.assertEqual(bin(1), '0b1')
1493 self.assertEqual(bin(-1), '-0b1')
1494 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1495 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1496 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1497 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1498
Georg Brandlec812ca2009-07-22 11:57:15 +00001499 def test_bytearray_translate(self):
1500 x = bytearray("abc")
1501 self.assertRaises(ValueError, x.translate, "1", 1)
1502 self.assertRaises(TypeError, x.translate, "1"*256, 1)
1503
Eric Smithce584d42008-02-21 20:17:08 +00001504class TestSorted(unittest.TestCase):
1505
1506 def test_basic(self):
1507 data = range(100)
1508 copy = data[:]
1509 random.shuffle(copy)
1510 self.assertEqual(data, sorted(copy))
1511 self.assertNotEqual(data, copy)
1512
1513 data.reverse()
1514 random.shuffle(copy)
1515 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1516 self.assertNotEqual(data, copy)
1517 random.shuffle(copy)
1518 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1519 self.assertNotEqual(data, copy)
1520 random.shuffle(copy)
1521 self.assertEqual(data, sorted(copy, reverse=1))
1522 self.assertNotEqual(data, copy)
1523
1524 def test_inputtypes(self):
1525 s = 'abracadabra'
1526 types = [list, tuple]
1527 if have_unicode:
1528 types.insert(0, unicode)
1529 for T in types:
1530 self.assertEqual(sorted(s), sorted(T(s)))
1531
1532 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
1533 types = [set, frozenset, list, tuple, dict.fromkeys]
1534 if have_unicode:
1535 types.insert(0, unicode)
1536 for T in types:
1537 self.assertEqual(sorted(s), sorted(T(s)))
1538
1539 def test_baddecorator(self):
1540 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1541 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1542
Florent Xicluna07627882010-03-21 01:14:24 +00001543def _run_unittest(*args):
1544 with check_py3k_warnings(
1545 (".+ not supported in 3.x", DeprecationWarning),
1546 (".+ is renamed to imp.reload", DeprecationWarning),
1547 ("classic int division", DeprecationWarning)):
1548 run_unittest(*args)
1549
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001550def test_main(verbose=None):
1551 test_classes = (BuiltinTest, TestSorted)
1552
Florent Xicluna07627882010-03-21 01:14:24 +00001553 _run_unittest(*test_classes)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001554
1555 # verify reference counting
1556 if verbose and hasattr(sys, "gettotalrefcount"):
1557 import gc
1558 counts = [None] * 5
1559 for i in xrange(len(counts)):
Florent Xicluna07627882010-03-21 01:14:24 +00001560 _run_unittest(*test_classes)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001561 gc.collect()
1562 counts[i] = sys.gettotalrefcount()
1563 print counts
1564
Walter Dörwald919497e2003-01-19 16:23:59 +00001565
1566if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001567 test_main(verbose=True)