blob: 013731ceacddf31ac31211c0ac8ceb07d4d8a137 [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
Eric Smithd44b2fc2010-04-02 12:30:56 +00007import warnings
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00008from operator import neg
Guido van Rossum3bead091992-01-27 17:00:37 +00009
Florent Xicluna07627882010-03-21 01:14:24 +000010import sys, cStringIO, random, UserDict
Guido van Rossum3bead091992-01-27 17:00:37 +000011
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +000012# count the number of test runs.
13# used to skip running test_execfile() multiple times
Georg Brandl4e1be942009-10-27 22:56:09 +000014# and to create unique strings to intern in test_intern()
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +000015numruns = 0
16
Walter Dörwald919497e2003-01-19 16:23:59 +000017class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000018
Walter Dörwald919497e2003-01-19 16:23:59 +000019 def __init__(self, max):
20 self.max = max
21 self.sofar = []
22
23 def __len__(self): return len(self.sofar)
24
25 def __getitem__(self, i):
26 if not 0 <= i < self.max: raise IndexError
27 n = len(self.sofar)
28 while n <= i:
29 self.sofar.append(n*n)
30 n += 1
31 return self.sofar[i]
32
33class StrSquares:
34
35 def __init__(self, max):
36 self.max = max
37 self.sofar = []
38
39 def __len__(self):
40 return len(self.sofar)
41
42 def __getitem__(self, i):
43 if not 0 <= i < self.max:
44 raise IndexError
45 n = len(self.sofar)
46 while n <= i:
47 self.sofar.append(str(n*n))
48 n += 1
49 return self.sofar[i]
50
51class BitBucket:
52 def write(self, line):
53 pass
54
Walter Dörwald919497e2003-01-19 16:23:59 +000055
Raymond Hettinger96229b12005-03-11 06:49:40 +000056class TestFailingBool:
57 def __nonzero__(self):
58 raise RuntimeError
59
60class TestFailingIter:
61 def __iter__(self):
62 raise RuntimeError
63
Walter Dörwald919497e2003-01-19 16:23:59 +000064class BuiltinTest(unittest.TestCase):
65
66 def test_import(self):
67 __import__('sys')
68 __import__('time')
69 __import__('string')
Georg Brandl5240d742007-03-13 20:46:32 +000070 __import__(name='sys')
71 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +000072 self.assertRaises(ImportError, __import__, 'spamspam')
73 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters8ddab272006-04-04 16:17:02 +000074 self.assertRaises(ValueError, __import__, '')
Georg Brandl5240d742007-03-13 20:46:32 +000075 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +000076
77 def test_abs(self):
78 # int
79 self.assertEqual(abs(0), 0)
80 self.assertEqual(abs(1234), 1234)
81 self.assertEqual(abs(-1234), 1234)
Martin v. Löwis820d6ac2006-10-04 05:47:34 +000082 self.assertTrue(abs(-sys.maxint-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +000083 # float
84 self.assertEqual(abs(0.0), 0.0)
85 self.assertEqual(abs(3.14), 3.14)
86 self.assertEqual(abs(-3.14), 3.14)
87 # long
88 self.assertEqual(abs(0L), 0L)
89 self.assertEqual(abs(1234L), 1234L)
90 self.assertEqual(abs(-1234L), 1234L)
91 # str
92 self.assertRaises(TypeError, abs, 'a')
93
Raymond Hettinger96229b12005-03-11 06:49:40 +000094 def test_all(self):
95 self.assertEqual(all([2, 4, 6]), True)
96 self.assertEqual(all([2, None, 6]), False)
97 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
98 self.assertRaises(RuntimeError, all, TestFailingIter())
99 self.assertRaises(TypeError, all, 10) # Non-iterable
100 self.assertRaises(TypeError, all) # No args
101 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
102 self.assertEqual(all([]), True) # Empty iterator
103 S = [50, 60]
104 self.assertEqual(all(x > 42 for x in S), True)
105 S = [50, 40, 60]
106 self.assertEqual(all(x > 42 for x in S), False)
107
108 def test_any(self):
109 self.assertEqual(any([None, None, None]), False)
110 self.assertEqual(any([None, 4, None]), True)
111 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
112 self.assertRaises(RuntimeError, all, TestFailingIter())
113 self.assertRaises(TypeError, any, 10) # Non-iterable
114 self.assertRaises(TypeError, any) # No args
115 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
116 self.assertEqual(any([]), False) # Empty iterator
117 S = [40, 60, 30]
118 self.assertEqual(any(x > 42 for x in S), True)
119 S = [10, 20, 30]
120 self.assertEqual(any(x > 42 for x in S), False)
121
Armin Rigo7ccbca92006-10-04 12:17:45 +0000122 def test_neg(self):
123 x = -sys.maxint-1
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000124 self.assertTrue(isinstance(x, int))
Armin Rigo7ccbca92006-10-04 12:17:45 +0000125 self.assertEqual(-x, sys.maxint+1)
126
Walter Dörwald919497e2003-01-19 16:23:59 +0000127 def test_apply(self):
128 def f0(*args):
129 self.assertEqual(args, ())
130 def f1(a1):
131 self.assertEqual(a1, 1)
132 def f2(a1, a2):
133 self.assertEqual(a1, 1)
134 self.assertEqual(a2, 2)
135 def f3(a1, a2, a3):
136 self.assertEqual(a1, 1)
137 self.assertEqual(a2, 2)
138 self.assertEqual(a3, 3)
139 apply(f0, ())
140 apply(f1, (1,))
141 apply(f2, (1, 2))
142 apply(f3, (1, 2, 3))
143
144 # A PyCFunction that takes only positional parameters should allow an
145 # empty keyword dictionary to pass without a complaint, but raise a
146 # TypeError if the dictionary is non-empty.
147 apply(id, (1,), {})
148 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
149 self.assertRaises(TypeError, apply)
150 self.assertRaises(TypeError, apply, id, 42)
151 self.assertRaises(TypeError, apply, id, (42,), 42)
152
153 def test_callable(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000154 self.assertTrue(callable(len))
Walter Dörwald919497e2003-01-19 16:23:59 +0000155 def f(): pass
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000156 self.assertTrue(callable(f))
Walter Dörwald919497e2003-01-19 16:23:59 +0000157 class C:
158 def meth(self): pass
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000159 self.assertTrue(callable(C))
Walter Dörwald919497e2003-01-19 16:23:59 +0000160 x = C()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000161 self.assertTrue(callable(x.meth))
162 self.assertTrue(not callable(x))
Walter Dörwald919497e2003-01-19 16:23:59 +0000163 class D(C):
164 def __call__(self): pass
165 y = D()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000166 self.assertTrue(callable(y))
Walter Dörwald919497e2003-01-19 16:23:59 +0000167 y()
168
169 def test_chr(self):
170 self.assertEqual(chr(32), ' ')
171 self.assertEqual(chr(65), 'A')
172 self.assertEqual(chr(97), 'a')
173 self.assertEqual(chr(0xff), '\xff')
174 self.assertRaises(ValueError, chr, 256)
175 self.assertRaises(TypeError, chr)
176
177 def test_cmp(self):
178 self.assertEqual(cmp(-1, 1), -1)
179 self.assertEqual(cmp(1, -1), 1)
180 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000181 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000182 a = []; a.append(a)
183 b = []; b.append(b)
184 from UserList import UserList
185 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000186 self.assertRaises(RuntimeError, cmp, a, b)
187 self.assertRaises(RuntimeError, cmp, b, c)
188 self.assertRaises(RuntimeError, cmp, c, a)
189 self.assertRaises(RuntimeError, cmp, a, c)
190 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000191 a.pop(); b.pop(); c.pop()
192 self.assertRaises(TypeError, cmp)
193
194 def test_coerce(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000195 self.assertTrue(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000196 self.assertEqual(coerce(1, 1L), (1L, 1L))
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000197 self.assertTrue(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000198 self.assertRaises(TypeError, coerce)
199 class BadNumber:
200 def __coerce__(self, other):
201 raise ValueError
202 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000203 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000204
205 def test_compile(self):
206 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000207 bom = '\xef\xbb\xbf'
208 compile(bom + 'print 1\n', '', 'exec')
Georg Brandl5240d742007-03-13 20:46:32 +0000209 compile(source='pass', filename='?', mode='exec')
210 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
211 compile('pass', '?', dont_inherit=1, mode='exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000212 self.assertRaises(TypeError, compile)
213 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
214 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000215 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Georg Brandl5240d742007-03-13 20:46:32 +0000216 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
217 mode='eval', source='0', filename='tmp')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000218 if have_unicode:
219 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000220 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
221 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000222
Georg Brandl5240d742007-03-13 20:46:32 +0000223
Walter Dörwald919497e2003-01-19 16:23:59 +0000224 def test_delattr(self):
225 import sys
226 sys.spam = 1
227 delattr(sys, 'spam')
228 self.assertRaises(TypeError, delattr)
229
230 def test_dir(self):
Georg Brandl871f1bc2007-03-12 13:17:36 +0000231 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000232 self.assertRaises(TypeError, dir, 42, 42)
233
Georg Brandl871f1bc2007-03-12 13:17:36 +0000234 # dir() - local scope
235 local_var = 1
Ezio Melottiaa980582010-01-23 23:04:36 +0000236 self.assertIn('local_var', dir())
Georg Brandl871f1bc2007-03-12 13:17:36 +0000237
238 # dir(module)
239 import sys
Ezio Melottiaa980582010-01-23 23:04:36 +0000240 self.assertIn('exit', dir(sys))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000241
242 # dir(module_with_invalid__dict__)
243 import types
244 class Foo(types.ModuleType):
245 __dict__ = 8
246 f = Foo("foo")
247 self.assertRaises(TypeError, dir, f)
248
249 # dir(type)
Ezio Melottiaa980582010-01-23 23:04:36 +0000250 self.assertIn("strip", dir(str))
251 self.assertNotIn("__mro__", dir(str))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000252
253 # dir(obj)
254 class Foo(object):
255 def __init__(self):
256 self.x = 7
257 self.y = 8
258 self.z = 9
259 f = Foo()
Ezio Melottiaa980582010-01-23 23:04:36 +0000260 self.assertIn("y", dir(f))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000261
262 # dir(obj_no__dict__)
263 class Foo(object):
264 __slots__ = []
265 f = Foo()
Ezio Melottiaa980582010-01-23 23:04:36 +0000266 self.assertIn("__repr__", dir(f))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000267
268 # dir(obj_no__class__with__dict__)
269 # (an ugly trick to cause getattr(f, "__class__") to fail)
270 class Foo(object):
271 __slots__ = ["__class__", "__dict__"]
272 def __init__(self):
273 self.bar = "wow"
274 f = Foo()
Ezio Melottiaa980582010-01-23 23:04:36 +0000275 self.assertNotIn("__repr__", dir(f))
276 self.assertIn("bar", dir(f))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000277
278 # dir(obj_using __dir__)
279 class Foo(object):
280 def __dir__(self):
281 return ["kan", "ga", "roo"]
282 f = Foo()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000283 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandl871f1bc2007-03-12 13:17:36 +0000284
285 # dir(obj__dir__not_list)
286 class Foo(object):
287 def __dir__(self):
288 return 7
289 f = Foo()
290 self.assertRaises(TypeError, dir, f)
291
Walter Dörwald919497e2003-01-19 16:23:59 +0000292 def test_divmod(self):
293 self.assertEqual(divmod(12, 7), (1, 5))
294 self.assertEqual(divmod(-12, 7), (-2, 2))
295 self.assertEqual(divmod(12, -7), (-2, -2))
296 self.assertEqual(divmod(-12, -7), (1, -5))
297
298 self.assertEqual(divmod(12L, 7L), (1L, 5L))
299 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
300 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
301 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
302
303 self.assertEqual(divmod(12, 7L), (1, 5L))
304 self.assertEqual(divmod(-12, 7L), (-2, 2L))
305 self.assertEqual(divmod(12L, -7), (-2L, -2))
306 self.assertEqual(divmod(-12L, -7), (1L, -5))
307
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000308 self.assertEqual(divmod(-sys.maxint-1, -1),
309 (sys.maxint+1, 0))
310
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000311 self.assertTrue(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
312 self.assertTrue(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
313 self.assertTrue(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
314 self.assertTrue(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000315
316 self.assertRaises(TypeError, divmod)
317
318 def test_eval(self):
319 self.assertEqual(eval('1+1'), 2)
320 self.assertEqual(eval(' 1+1\n'), 2)
321 globals = {'a': 1, 'b': 2}
322 locals = {'b': 200, 'c': 300}
323 self.assertEqual(eval('a', globals) , 1)
324 self.assertEqual(eval('a', globals, locals), 1)
325 self.assertEqual(eval('b', globals, locals), 200)
326 self.assertEqual(eval('c', globals, locals), 300)
327 if have_unicode:
328 self.assertEqual(eval(unicode('1+1')), 2)
329 self.assertEqual(eval(unicode(' 1+1\n')), 2)
330 globals = {'a': 1, 'b': 2}
331 locals = {'b': 200, 'c': 300}
332 if have_unicode:
333 self.assertEqual(eval(unicode('a'), globals), 1)
334 self.assertEqual(eval(unicode('a'), globals, locals), 1)
335 self.assertEqual(eval(unicode('b'), globals, locals), 200)
336 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000337 bom = '\xef\xbb\xbf'
338 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000339 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
340 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000341 self.assertRaises(TypeError, eval)
342 self.assertRaises(TypeError, eval, ())
343
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000344 def test_general_eval(self):
345 # Tests that general mappings can be used for the locals argument
346
347 class M:
348 "Test mapping interface versus possible calls from eval()."
349 def __getitem__(self, key):
350 if key == 'a':
351 return 12
352 raise KeyError
353 def keys(self):
354 return list('xyz')
355
356 m = M()
357 g = globals()
358 self.assertEqual(eval('a', g, m), 12)
359 self.assertRaises(NameError, eval, 'b', g, m)
360 self.assertEqual(eval('dir()', g, m), list('xyz'))
361 self.assertEqual(eval('globals()', g, m), g)
362 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000363 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000364 class A:
365 "Non-mapping"
366 pass
367 m = A()
368 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000369
370 # Verify that dict subclasses work as well
371 class D(dict):
372 def __getitem__(self, key):
373 if key == 'a':
374 return 12
375 return dict.__getitem__(self, key)
376 def keys(self):
377 return list('xyz')
378
379 d = D()
380 self.assertEqual(eval('a', g, d), 12)
381 self.assertRaises(NameError, eval, 'b', g, d)
382 self.assertEqual(eval('dir()', g, d), list('xyz'))
383 self.assertEqual(eval('globals()', g, d), g)
384 self.assertEqual(eval('locals()', g, d), d)
385
386 # Verify locals stores (used by list comps)
387 eval('[locals() for i in (2,3)]', g, d)
388 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
389
390 class SpreadSheet:
391 "Sample application showing nested, calculated lookups."
392 _cells = {}
393 def __setitem__(self, key, formula):
394 self._cells[key] = formula
Martin Blais215f13d2006-06-06 12:46:55 +0000395 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000396 return eval(self._cells[key], globals(), self)
397
398 ss = SpreadSheet()
399 ss['a1'] = '5'
400 ss['a2'] = 'a1*6'
401 ss['a3'] = 'a2*7'
402 self.assertEqual(ss['a3'], 210)
403
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000404 # Verify that dir() catches a non-list returned by eval
405 # SF bug #1004669
406 class C:
407 def __getitem__(self, item):
408 raise KeyError(item)
409 def keys(self):
410 return 'a'
411 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
412
Walter Dörwald919497e2003-01-19 16:23:59 +0000413 # Done outside of the method test_z to get the correct scope
414 z = 0
415 f = open(TESTFN, 'w')
416 f.write('z = z+1\n')
417 f.write('z = z*2\n')
418 f.close()
Florent Xicluna07627882010-03-21 01:14:24 +0000419 with check_py3k_warnings(("execfile.. not supported in 3.x",
420 DeprecationWarning)):
421 execfile(TESTFN)
Walter Dörwald919497e2003-01-19 16:23:59 +0000422
423 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000424 global numruns
425 if numruns:
426 return
427 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000428
Walter Dörwald919497e2003-01-19 16:23:59 +0000429 globals = {'a': 1, 'b': 2}
430 locals = {'b': 200, 'c': 300}
431
432 self.assertEqual(self.__class__.z, 2)
433 globals['z'] = 0
434 execfile(TESTFN, globals)
435 self.assertEqual(globals['z'], 2)
436 locals['z'] = 0
437 execfile(TESTFN, globals, locals)
438 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000439
440 class M:
441 "Test mapping interface versus possible calls from execfile()."
442 def __init__(self):
443 self.z = 10
444 def __getitem__(self, key):
445 if key == 'z':
446 return self.z
447 raise KeyError
448 def __setitem__(self, key, value):
449 if key == 'z':
450 self.z = value
451 return
452 raise KeyError
453
454 locals = M()
455 locals['z'] = 0
456 execfile(TESTFN, globals, locals)
457 self.assertEqual(locals['z'], 2)
458
Walter Dörwald919497e2003-01-19 16:23:59 +0000459 unlink(TESTFN)
460 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000461 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000462 import os
463 self.assertRaises(IOError, execfile, os.curdir)
464 self.assertRaises(IOError, execfile, "I_dont_exist")
465
466 def test_filter(self):
467 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
468 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
469 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
470 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
471 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
472 def identity(item):
473 return 1
474 filter(identity, Squares(5))
475 self.assertRaises(TypeError, filter)
476 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000477 def __getitem__(self, index):
478 if index<4:
479 return 42
480 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000481 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
482 def badfunc():
483 pass
484 self.assertRaises(TypeError, filter, badfunc, range(5))
485
Walter Dörwaldbf517072003-01-27 15:57:14 +0000486 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000487 self.assertEqual(filter(None, (1, 2)), (1, 2))
488 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
489 self.assertRaises(TypeError, filter, 42, (1, 2))
490
Walter Dörwaldbf517072003-01-27 15:57:14 +0000491 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000492 self.assertEqual(filter(None, "12"), "12")
493 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
494 self.assertRaises(TypeError, filter, 42, "12")
495 class badstr(str):
496 def __getitem__(self, index):
497 raise ValueError
498 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000499
Walter Dörwald903f1e02003-02-04 16:28:00 +0000500 class badstr2(str):
501 def __getitem__(self, index):
502 return 42
503 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
504
505 class weirdstr(str):
506 def __getitem__(self, index):
507 return weirdstr(2*str.__getitem__(self, index))
508 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
509
Walter Dörwald5e61e242003-02-04 17:04:01 +0000510 class shiftstr(str):
511 def __getitem__(self, index):
512 return chr(ord(str.__getitem__(self, index))+1)
513 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
514
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000515 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000516 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000517 self.assertEqual(filter(None, unicode("12")), unicode("12"))
518 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
519 self.assertRaises(TypeError, filter, 42, unicode("12"))
520 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000521
Walter Dörwald903f1e02003-02-04 16:28:00 +0000522 class badunicode(unicode):
523 def __getitem__(self, index):
524 return 42
525 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
526
527 class weirdunicode(unicode):
528 def __getitem__(self, index):
529 return weirdunicode(2*unicode.__getitem__(self, index))
530 self.assertEqual(
531 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
532
Walter Dörwald5e61e242003-02-04 17:04:01 +0000533 class shiftunicode(unicode):
534 def __getitem__(self, index):
535 return unichr(ord(unicode.__getitem__(self, index))+1)
536 self.assertEqual(
537 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
538 unicode("345")
539 )
540
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000541 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000542 # test that filter() never returns tuple, str or unicode subclasses
543 # and that the result always goes through __getitem__
544 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000545 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000546 def __getitem__(self, index):
547 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000548 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000549 def __getitem__(self, index):
550 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000551 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000552 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000553 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000554 }
555 if have_unicode:
556 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000557 def __getitem__(self, index):
558 return 2*unicode.__getitem__(self, index)
559 inputs[unicode2] = {
560 unicode(): unicode(),
561 unicode("123"): unicode("112233")
562 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000563
Walter Dörwald1918f772003-02-10 13:19:13 +0000564 for (cls, inps) in inputs.iteritems():
565 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000566 # make sure the output goes through __getitem__
567 # even if func is None
568 self.assertEqual(
569 filter(funcs[0], cls(inp)),
570 filter(funcs[1], cls(inp))
571 )
572 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000573 outp = filter(func, cls(inp))
574 self.assertEqual(outp, exp)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000575 self.assertTrue(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000576
Walter Dörwald919497e2003-01-19 16:23:59 +0000577 def test_getattr(self):
578 import sys
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000579 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000580 self.assertRaises(TypeError, getattr, sys, 1)
581 self.assertRaises(TypeError, getattr, sys, 1, "foo")
582 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000583 if have_unicode:
584 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000585
586 def test_hasattr(self):
587 import sys
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000588 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000589 self.assertRaises(TypeError, hasattr, sys, 1)
590 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000591 if have_unicode:
592 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000593
Benjamin Petersonb9030f42008-05-12 00:41:23 +0000594 # Check that hasattr allows SystemExit and KeyboardInterrupts by
595 class A:
596 def __getattr__(self, what):
597 raise KeyboardInterrupt
598 self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
599 class B:
600 def __getattr__(self, what):
601 raise SystemExit
602 self.assertRaises(SystemExit, hasattr, B(), "b")
603
Walter Dörwald919497e2003-01-19 16:23:59 +0000604 def test_hash(self):
605 hash(None)
606 self.assertEqual(hash(1), hash(1L))
607 self.assertEqual(hash(1), hash(1.0))
608 hash('spam')
609 if have_unicode:
610 self.assertEqual(hash('spam'), hash(unicode('spam')))
611 hash((0,1,2,3))
612 def f(): pass
613 self.assertRaises(TypeError, hash, [])
614 self.assertRaises(TypeError, hash, {})
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000615 # Bug 1536021: Allow hash to return long objects
616 class X:
617 def __hash__(self):
618 return 2**100
619 self.assertEquals(type(hash(X())), int)
620 class Y(object):
621 def __hash__(self):
622 return 2**100
623 self.assertEquals(type(hash(Y())), int)
Armin Rigo51fc8c42006-08-09 14:55:26 +0000624 class Z(long):
625 def __hash__(self):
626 return self
627 self.assertEquals(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000628
629 def test_hex(self):
630 self.assertEqual(hex(16), '0x10')
631 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000632 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000633 self.assertEqual(hex(-16L), '-0x10L')
634 self.assertRaises(TypeError, hex, {})
635
636 def test_id(self):
637 id(None)
638 id(1)
639 id(1L)
640 id(1.0)
641 id('spam')
642 id((0,1,2,3))
643 id([0,1,2,3])
644 id({'spam': 1, 'eggs': 2, 'ham': 3})
645
646 # Test input() later, together with raw_input
647
Walter Dörwald919497e2003-01-19 16:23:59 +0000648 def test_intern(self):
649 self.assertRaises(TypeError, intern)
Georg Brandl4e1be942009-10-27 22:56:09 +0000650 # This fails if the test is run twice with a constant string,
651 # therefore append the run counter
652 s = "never interned before " + str(numruns)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000653 self.assertTrue(intern(s) is s)
Walter Dörwald919497e2003-01-19 16:23:59 +0000654 s2 = s.swapcase().swapcase()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000655 self.assertTrue(intern(s2) is s)
Walter Dörwald919497e2003-01-19 16:23:59 +0000656
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000657 # Subclasses of string can't be interned, because they
658 # provide too much opportunity for insane things to happen.
659 # We don't want them in the interned dict and if they aren't
660 # actually interned, we don't want to create the appearance
661 # that they are by allowing intern() to succeeed.
662 class S(str):
663 def __hash__(self):
664 return 123
665
666 self.assertRaises(TypeError, intern, S("abc"))
667
668 # It's still safe to pass these strings to routines that
669 # call intern internally, e.g. PyObject_SetAttr().
670 s = S("abc")
671 setattr(s, s, s)
672 self.assertEqual(getattr(s, s), s)
673
Walter Dörwald919497e2003-01-19 16:23:59 +0000674 def test_iter(self):
675 self.assertRaises(TypeError, iter)
676 self.assertRaises(TypeError, iter, 42, 42)
677 lists = [("1", "2"), ["1", "2"], "12"]
678 if have_unicode:
679 lists.append(unicode("12"))
680 for l in lists:
681 i = iter(l)
682 self.assertEqual(i.next(), '1')
683 self.assertEqual(i.next(), '2')
684 self.assertRaises(StopIteration, i.next)
685
686 def test_isinstance(self):
687 class C:
688 pass
689 class D(C):
690 pass
691 class E:
692 pass
693 c = C()
694 d = D()
695 e = E()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000696 self.assertTrue(isinstance(c, C))
697 self.assertTrue(isinstance(d, C))
698 self.assertTrue(not isinstance(e, C))
699 self.assertTrue(not isinstance(c, D))
700 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000701 self.assertRaises(TypeError, isinstance, E, 'foo')
702 self.assertRaises(TypeError, isinstance)
703
704 def test_issubclass(self):
705 class C:
706 pass
707 class D(C):
708 pass
709 class E:
710 pass
711 c = C()
712 d = D()
713 e = E()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000714 self.assertTrue(issubclass(D, C))
715 self.assertTrue(issubclass(C, C))
716 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000717 self.assertRaises(TypeError, issubclass, 'foo', E)
718 self.assertRaises(TypeError, issubclass, E, 'foo')
719 self.assertRaises(TypeError, issubclass)
720
721 def test_len(self):
722 self.assertEqual(len('123'), 3)
723 self.assertEqual(len(()), 0)
724 self.assertEqual(len((1, 2, 3, 4)), 4)
725 self.assertEqual(len([1, 2, 3, 4]), 4)
726 self.assertEqual(len({}), 0)
727 self.assertEqual(len({'a':1, 'b': 2}), 2)
728 class BadSeq:
729 def __len__(self):
730 raise ValueError
731 self.assertRaises(ValueError, len, BadSeq())
732
Walter Dörwald919497e2003-01-19 16:23:59 +0000733 def test_map(self):
734 self.assertEqual(
735 map(None, 'hello world'),
736 ['h','e','l','l','o',' ','w','o','r','l','d']
737 )
738 self.assertEqual(
739 map(None, 'abcd', 'efg'),
740 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
741 )
742 self.assertEqual(
743 map(None, range(10)),
744 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
745 )
746 self.assertEqual(
747 map(lambda x: x*x, range(1,4)),
748 [1, 4, 9]
749 )
750 try:
751 from math import sqrt
752 except ImportError:
753 def sqrt(x):
754 return pow(x, 0.5)
755 self.assertEqual(
756 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
757 [[4.0, 2.0], [9.0, 3.0]]
758 )
759 self.assertEqual(
760 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
761 [10, 4, 6]
762 )
763
764 def plus(*v):
765 accu = 0
766 for i in v: accu = accu + i
767 return accu
768 self.assertEqual(
769 map(plus, [1, 3, 7]),
770 [1, 3, 7]
771 )
772 self.assertEqual(
773 map(plus, [1, 3, 7], [4, 9, 2]),
774 [1+4, 3+9, 7+2]
775 )
776 self.assertEqual(
777 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
778 [1+4+1, 3+9+1, 7+2+0]
779 )
780 self.assertEqual(
781 map(None, Squares(10)),
782 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
783 )
784 self.assertEqual(
785 map(int, Squares(10)),
786 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
787 )
788 self.assertEqual(
789 map(None, Squares(3), Squares(2)),
790 [(0,0), (1,1), (4,None)]
791 )
792 self.assertEqual(
793 map(max, Squares(3), Squares(2)),
794 [0, 1, 4]
795 )
796 self.assertRaises(TypeError, map)
797 self.assertRaises(TypeError, map, lambda x: x, 42)
798 self.assertEqual(map(None, [42]), [42])
799 class BadSeq:
800 def __getitem__(self, index):
801 raise ValueError
802 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +0000803 def badfunc(x):
804 raise RuntimeError
805 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000806
807 def test_max(self):
808 self.assertEqual(max('123123'), '3')
809 self.assertEqual(max(1, 2, 3), 3)
810 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
811 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
812
813 self.assertEqual(max(1, 2L, 3.0), 3.0)
814 self.assertEqual(max(1L, 2.0, 3), 3)
815 self.assertEqual(max(1.0, 2, 3L), 3L)
816
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000817 for stmt in (
818 "max(key=int)", # no args
819 "max(1, key=int)", # single arg not iterable
820 "max(1, 2, keystone=int)", # wrong keyword
821 "max(1, 2, key=int, abc=int)", # two many keywords
822 "max(1, 2, key=1)", # keyfunc is not callable
823 ):
Tim Peters7f061872004-12-07 21:17:46 +0000824 try:
825 exec(stmt) in globals()
826 except TypeError:
827 pass
828 else:
829 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000830
831 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
832 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
833 self.assertEqual(max(1, 2, key=neg), 1) # two elems
834
835 data = [random.randrange(200) for i in range(100)]
836 keys = dict((elem, random.randrange(50)) for elem in data)
837 f = keys.__getitem__
838 self.assertEqual(max(data, key=f),
839 sorted(reversed(data), key=f)[-1])
840
Walter Dörwald919497e2003-01-19 16:23:59 +0000841 def test_min(self):
842 self.assertEqual(min('123123'), '1')
843 self.assertEqual(min(1, 2, 3), 1)
844 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
845 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
846
847 self.assertEqual(min(1, 2L, 3.0), 1)
848 self.assertEqual(min(1L, 2.0, 3), 1L)
849 self.assertEqual(min(1.0, 2, 3L), 1.0)
850
851 self.assertRaises(TypeError, min)
852 self.assertRaises(TypeError, min, 42)
853 self.assertRaises(ValueError, min, ())
854 class BadSeq:
855 def __getitem__(self, index):
856 raise ValueError
857 self.assertRaises(ValueError, min, BadSeq())
858 class BadNumber:
859 def __cmp__(self, other):
860 raise ValueError
861 self.assertRaises(ValueError, min, (42, BadNumber()))
862
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000863 for stmt in (
864 "min(key=int)", # no args
865 "min(1, key=int)", # single arg not iterable
866 "min(1, 2, keystone=int)", # wrong keyword
867 "min(1, 2, key=int, abc=int)", # two many keywords
868 "min(1, 2, key=1)", # keyfunc is not callable
869 ):
Tim Peters7f061872004-12-07 21:17:46 +0000870 try:
871 exec(stmt) in globals()
872 except TypeError:
873 pass
874 else:
875 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000876
877 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
878 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
879 self.assertEqual(min(1, 2, key=neg), 2) # two elems
880
881 data = [random.randrange(200) for i in range(100)]
882 keys = dict((elem, random.randrange(50)) for elem in data)
883 f = keys.__getitem__
884 self.assertEqual(min(data, key=f),
885 sorted(data, key=f)[0])
886
Georg Brandl28e08732008-04-30 19:47:09 +0000887 def test_next(self):
888 it = iter(range(2))
889 self.assertEqual(next(it), 0)
890 self.assertEqual(next(it), 1)
891 self.assertRaises(StopIteration, next, it)
892 self.assertRaises(StopIteration, next, it)
893 self.assertEquals(next(it, 42), 42)
894
895 class Iter(object):
896 def __iter__(self):
897 return self
898 def next(self):
899 raise StopIteration
900
901 it = iter(Iter())
902 self.assertEquals(next(it, 42), 42)
903 self.assertRaises(StopIteration, next, it)
904
905 def gen():
906 yield 1
907 return
908
909 it = gen()
910 self.assertEquals(next(it), 1)
911 self.assertRaises(StopIteration, next, it)
912 self.assertEquals(next(it, 42), 42)
913
Walter Dörwald919497e2003-01-19 16:23:59 +0000914 def test_oct(self):
915 self.assertEqual(oct(100), '0144')
916 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000917 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000918 self.assertEqual(oct(-100L), '-0144L')
919 self.assertRaises(TypeError, oct, ())
920
921 def write_testfile(self):
922 # NB the first 4 lines are also used to test input and raw_input, below
923 fp = open(TESTFN, 'w')
924 try:
925 fp.write('1+1\n')
926 fp.write('1+1\n')
927 fp.write('The quick brown fox jumps over the lazy dog')
928 fp.write('.\n')
929 fp.write('Dear John\n')
930 fp.write('XXX'*100)
931 fp.write('YYY'*100)
932 finally:
933 fp.close()
934
935 def test_open(self):
936 self.write_testfile()
937 fp = open(TESTFN, 'r')
938 try:
939 self.assertEqual(fp.readline(4), '1+1\n')
940 self.assertEqual(fp.readline(4), '1+1\n')
941 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
942 self.assertEqual(fp.readline(4), 'Dear')
943 self.assertEqual(fp.readline(100), ' John\n')
944 self.assertEqual(fp.read(300), 'XXX'*100)
945 self.assertEqual(fp.read(1000), 'YYY'*100)
946 finally:
947 fp.close()
948 unlink(TESTFN)
949
950 def test_ord(self):
951 self.assertEqual(ord(' '), 32)
952 self.assertEqual(ord('A'), 65)
953 self.assertEqual(ord('a'), 97)
954 if have_unicode:
955 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
956 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000957 if have_unicode:
958 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000959
960 def test_pow(self):
961 self.assertEqual(pow(0,0), 1)
962 self.assertEqual(pow(0,1), 0)
963 self.assertEqual(pow(1,0), 1)
964 self.assertEqual(pow(1,1), 1)
965
966 self.assertEqual(pow(2,0), 1)
967 self.assertEqual(pow(2,10), 1024)
968 self.assertEqual(pow(2,20), 1024*1024)
969 self.assertEqual(pow(2,30), 1024*1024*1024)
970
971 self.assertEqual(pow(-2,0), 1)
972 self.assertEqual(pow(-2,1), -2)
973 self.assertEqual(pow(-2,2), 4)
974 self.assertEqual(pow(-2,3), -8)
975
976 self.assertEqual(pow(0L,0), 1)
977 self.assertEqual(pow(0L,1), 0)
978 self.assertEqual(pow(1L,0), 1)
979 self.assertEqual(pow(1L,1), 1)
980
981 self.assertEqual(pow(2L,0), 1)
982 self.assertEqual(pow(2L,10), 1024)
983 self.assertEqual(pow(2L,20), 1024*1024)
984 self.assertEqual(pow(2L,30), 1024*1024*1024)
985
986 self.assertEqual(pow(-2L,0), 1)
987 self.assertEqual(pow(-2L,1), -2)
988 self.assertEqual(pow(-2L,2), 4)
989 self.assertEqual(pow(-2L,3), -8)
990
991 self.assertAlmostEqual(pow(0.,0), 1.)
992 self.assertAlmostEqual(pow(0.,1), 0.)
993 self.assertAlmostEqual(pow(1.,0), 1.)
994 self.assertAlmostEqual(pow(1.,1), 1.)
995
996 self.assertAlmostEqual(pow(2.,0), 1.)
997 self.assertAlmostEqual(pow(2.,10), 1024.)
998 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
999 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1000
1001 self.assertAlmostEqual(pow(-2.,0), 1.)
1002 self.assertAlmostEqual(pow(-2.,1), -2.)
1003 self.assertAlmostEqual(pow(-2.,2), 4.)
1004 self.assertAlmostEqual(pow(-2.,3), -8.)
1005
1006 for x in 2, 2L, 2.0:
1007 for y in 10, 10L, 10.0:
1008 for z in 1000, 1000L, 1000.0:
1009 if isinstance(x, float) or \
1010 isinstance(y, float) or \
1011 isinstance(z, float):
1012 self.assertRaises(TypeError, pow, x, y, z)
1013 else:
1014 self.assertAlmostEqual(pow(x, y, z), 24.0)
1015
1016 self.assertRaises(TypeError, pow, -1, -2, 3)
1017 self.assertRaises(ValueError, pow, 1, 2, 0)
1018 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1019 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001020 # Will return complex in 3.0:
1021 self.assertRaises(ValueError, pow, -342.43, 0.234)
Walter Dörwald919497e2003-01-19 16:23:59 +00001022
1023 self.assertRaises(TypeError, pow)
1024
1025 def test_range(self):
1026 self.assertEqual(range(3), [0, 1, 2])
1027 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1028 self.assertEqual(range(0), [])
1029 self.assertEqual(range(-3), [])
1030 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1031 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1032
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001033 # Now test range() with longs
1034 self.assertEqual(range(-2**100), [])
1035 self.assertEqual(range(0, -2**100), [])
1036 self.assertEqual(range(0, 2**100, -1), [])
1037 self.assertEqual(range(0, 2**100, -1), [])
1038
1039 a = long(10 * sys.maxint)
1040 b = long(100 * sys.maxint)
1041 c = long(50 * sys.maxint)
1042
1043 self.assertEqual(range(a, a+2), [a, a+1])
1044 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1045 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1046
1047 seq = range(a, b, c)
Ezio Melottiaa980582010-01-23 23:04:36 +00001048 self.assertIn(a, seq)
1049 self.assertNotIn(b, seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001050 self.assertEqual(len(seq), 2)
1051
1052 seq = range(b, a, -c)
Ezio Melottiaa980582010-01-23 23:04:36 +00001053 self.assertIn(b, seq)
1054 self.assertNotIn(a, seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001055 self.assertEqual(len(seq), 2)
1056
1057 seq = range(-a, -b, -c)
Ezio Melottiaa980582010-01-23 23:04:36 +00001058 self.assertIn(-a, seq)
1059 self.assertNotIn(-b, seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001060 self.assertEqual(len(seq), 2)
1061
Walter Dörwald919497e2003-01-19 16:23:59 +00001062 self.assertRaises(TypeError, range)
1063 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1064 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001065 self.assertRaises(ValueError, range, a, a + 1, long(0))
1066
1067 class badzero(int):
1068 def __cmp__(self, other):
1069 raise RuntimeError
Nick Coghlan48361f52008-08-11 15:45:58 +00001070 __hash__ = None # Invalid cmp makes this unhashable
Neal Norwitzfcf44352005-11-27 20:37:43 +00001071 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001072
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001073 # Reject floats when it would require PyLongs to represent.
1074 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001075 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001076
Walter Dörwald357981e2003-04-15 18:59:28 +00001077 self.assertRaises(TypeError, range, 0, "spam")
1078 self.assertRaises(TypeError, range, 0, 42, "spam")
1079
1080 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1081 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1082
Walter Dörwald919497e2003-01-19 16:23:59 +00001083 def test_input_and_raw_input(self):
1084 self.write_testfile()
1085 fp = open(TESTFN, 'r')
1086 savestdin = sys.stdin
1087 savestdout = sys.stdout # Eats the echo
1088 try:
1089 sys.stdin = fp
1090 sys.stdout = BitBucket()
1091 self.assertEqual(input(), 2)
1092 self.assertEqual(input('testing\n'), 2)
1093 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1094 self.assertEqual(raw_input('testing\n'), 'Dear John')
Tim Peters8e24a962006-08-09 00:52:26 +00001095
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001096 # SF 1535165: don't segfault on closed stdin
1097 # sys.stdout must be a regular file for triggering
1098 sys.stdout = savestdout
1099 sys.stdin.close()
Georg Brandld336e982006-08-06 09:17:16 +00001100 self.assertRaises(ValueError, input)
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001101
1102 sys.stdout = BitBucket()
Walter Dörwald919497e2003-01-19 16:23:59 +00001103 sys.stdin = cStringIO.StringIO("NULL\0")
1104 self.assertRaises(TypeError, input, 42, 42)
1105 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1106 self.assertEqual(input(), 'whitespace')
1107 sys.stdin = cStringIO.StringIO()
1108 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001109
1110 # SF 876178: make sure input() respect future options.
1111 sys.stdin = cStringIO.StringIO('1/2')
1112 sys.stdout = cStringIO.StringIO()
1113 exec compile('print input()', 'test_builtin_tmp', 'exec')
1114 sys.stdin.seek(0, 0)
1115 exec compile('from __future__ import division;print input()',
1116 'test_builtin_tmp', 'exec')
1117 sys.stdin.seek(0, 0)
1118 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001119 # The result we expect depends on whether new division semantics
1120 # are already in effect.
1121 if 1/2 == 0:
1122 # This test was compiled with old semantics.
1123 expected = ['0', '0.5', '0']
1124 else:
1125 # This test was compiled with new semantics (e.g., -Qnew
1126 # was given on the command line.
1127 expected = ['0.5', '0.5', '0.5']
1128 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001129
Walter Dörwald919497e2003-01-19 16:23:59 +00001130 del sys.stdout
1131 self.assertRaises(RuntimeError, input, 'prompt')
1132 del sys.stdin
1133 self.assertRaises(RuntimeError, input, 'prompt')
1134 finally:
1135 sys.stdin = savestdin
1136 sys.stdout = savestdout
1137 fp.close()
1138 unlink(TESTFN)
1139
1140 def test_reduce(self):
1141 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1142 self.assertEqual(
1143 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1144 ['a','c','d','w']
1145 )
1146 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1147 self.assertEqual(
1148 reduce(lambda x, y: x*y, range(2,21), 1L),
1149 2432902008176640000L
1150 )
1151 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1152 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1153 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1154 self.assertRaises(TypeError, reduce)
1155 self.assertRaises(TypeError, reduce, 42, 42)
1156 self.assertRaises(TypeError, reduce, 42, 42, 42)
1157 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1158 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1159 self.assertRaises(TypeError, reduce, 42, (42, 42))
1160
1161 class BadSeq:
1162 def __getitem__(self, index):
1163 raise ValueError
1164 self.assertRaises(ValueError, reduce, 42, BadSeq())
1165
1166 def test_reload(self):
1167 import marshal
1168 reload(marshal)
1169 import string
1170 reload(string)
1171 ## import sys
1172 ## self.assertRaises(ImportError, reload, sys)
1173
1174 def test_repr(self):
1175 self.assertEqual(repr(''), '\'\'')
1176 self.assertEqual(repr(0), '0')
1177 self.assertEqual(repr(0L), '0L')
1178 self.assertEqual(repr(()), '()')
1179 self.assertEqual(repr([]), '[]')
1180 self.assertEqual(repr({}), '{}')
1181 a = []
1182 a.append(a)
1183 self.assertEqual(repr(a), '[[...]]')
1184 a = {}
1185 a[0] = a
1186 self.assertEqual(repr(a), '{0: {...}}')
1187
1188 def test_round(self):
1189 self.assertEqual(round(0.0), 0.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001190 self.assertEqual(type(round(0.0)), float) # Will be int in 3.0.
Walter Dörwald919497e2003-01-19 16:23:59 +00001191 self.assertEqual(round(1.0), 1.0)
1192 self.assertEqual(round(10.0), 10.0)
1193 self.assertEqual(round(1000000000.0), 1000000000.0)
1194 self.assertEqual(round(1e20), 1e20)
1195
1196 self.assertEqual(round(-1.0), -1.0)
1197 self.assertEqual(round(-10.0), -10.0)
1198 self.assertEqual(round(-1000000000.0), -1000000000.0)
1199 self.assertEqual(round(-1e20), -1e20)
1200
1201 self.assertEqual(round(0.1), 0.0)
1202 self.assertEqual(round(1.1), 1.0)
1203 self.assertEqual(round(10.1), 10.0)
1204 self.assertEqual(round(1000000000.1), 1000000000.0)
1205
1206 self.assertEqual(round(-1.1), -1.0)
1207 self.assertEqual(round(-10.1), -10.0)
1208 self.assertEqual(round(-1000000000.1), -1000000000.0)
1209
1210 self.assertEqual(round(0.9), 1.0)
1211 self.assertEqual(round(9.9), 10.0)
1212 self.assertEqual(round(999999999.9), 1000000000.0)
1213
1214 self.assertEqual(round(-0.9), -1.0)
1215 self.assertEqual(round(-9.9), -10.0)
1216 self.assertEqual(round(-999999999.9), -1000000000.0)
1217
1218 self.assertEqual(round(-8.0, -1), -10.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001219 self.assertEqual(type(round(-8.0, -1)), float)
1220
1221 self.assertEqual(type(round(-8.0, 0)), float)
1222 self.assertEqual(type(round(-8.0, 1)), float)
1223
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001224 # Check half rounding behaviour.
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001225 self.assertEqual(round(5.5), 6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001226 self.assertEqual(round(6.5), 7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001227 self.assertEqual(round(-5.5), -6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001228 self.assertEqual(round(-6.5), -7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001229
1230 # Check behavior on ints
1231 self.assertEqual(round(0), 0)
1232 self.assertEqual(round(8), 8)
1233 self.assertEqual(round(-8), -8)
1234 self.assertEqual(type(round(0)), float) # Will be int in 3.0.
1235 self.assertEqual(type(round(-8, -1)), float)
1236 self.assertEqual(type(round(-8, 0)), float)
1237 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001238
Georg Brandlccadf842006-03-31 18:54:53 +00001239 # test new kwargs
1240 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1241
Walter Dörwald919497e2003-01-19 16:23:59 +00001242 self.assertRaises(TypeError, round)
1243
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001244 # test generic rounding delegation for reals
1245 class TestRound(object):
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001246 def __float__(self):
1247 return 23.0
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001248
1249 class TestNoRound(object):
1250 pass
1251
1252 self.assertEqual(round(TestRound()), 23)
1253
1254 self.assertRaises(TypeError, round, 1, 2, 3)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001255 self.assertRaises(TypeError, round, TestNoRound())
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001256
1257 t = TestNoRound()
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001258 t.__float__ = lambda *args: args
1259 self.assertRaises(TypeError, round, t)
1260 self.assertRaises(TypeError, round, t, 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001261
Mark Dickinsona8fd66d2009-11-09 17:03:34 +00001262 # Some versions of glibc for alpha have a bug that affects
1263 # float -> integer rounding (floor, ceil, rint, round) for
1264 # values in the range [2**52, 2**53). See:
1265 #
1266 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1267 #
1268 # We skip this test on Linux/alpha if it would fail.
1269 linux_alpha = (platform.system().startswith('Linux') and
1270 platform.machine().startswith('alpha'))
1271 system_round_bug = round(5e15+1) != 5e15+1
1272 @unittest.skipIf(linux_alpha and system_round_bug,
1273 "test will fail; failure is probably due to a "
1274 "buggy system round function")
1275 def test_round_large(self):
1276 # Issue #1869: integral floats should remain unchanged
1277 self.assertEqual(round(5e15-1), 5e15-1)
1278 self.assertEqual(round(5e15), 5e15)
1279 self.assertEqual(round(5e15+1), 5e15+1)
1280 self.assertEqual(round(5e15+2), 5e15+2)
1281 self.assertEqual(round(5e15+3), 5e15+3)
1282
Walter Dörwald919497e2003-01-19 16:23:59 +00001283 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001284 setattr(sys, 'spam', 1)
1285 self.assertEqual(sys.spam, 1)
1286 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1287 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001288
Alex Martellia70b1912003-04-22 08:12:33 +00001289 def test_sum(self):
1290 self.assertEqual(sum([]), 0)
1291 self.assertEqual(sum(range(2,8)), 27)
1292 self.assertEqual(sum(iter(range(2,8))), 27)
1293 self.assertEqual(sum(Squares(10)), 285)
1294 self.assertEqual(sum(iter(Squares(10))), 285)
1295 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1296
1297 self.assertRaises(TypeError, sum)
1298 self.assertRaises(TypeError, sum, 42)
1299 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1300 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1301 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1302 self.assertRaises(TypeError, sum, [{2:3}])
1303 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1304
1305 class BadSeq:
1306 def __getitem__(self, index):
1307 raise ValueError
1308 self.assertRaises(ValueError, sum, BadSeq())
1309
Mark Dickinsonbfd2dc72009-10-17 21:46:32 +00001310 empty = []
1311 sum(([x] for x in range(10)), empty)
1312 self.assertEqual(empty, [])
1313
Walter Dörwald919497e2003-01-19 16:23:59 +00001314 def test_type(self):
1315 self.assertEqual(type(''), type('123'))
1316 self.assertNotEqual(type(''), type(()))
1317
1318 def test_unichr(self):
1319 if have_unicode:
1320 self.assertEqual(unichr(32), unicode(' '))
1321 self.assertEqual(unichr(65), unicode('A'))
1322 self.assertEqual(unichr(97), unicode('a'))
1323 self.assertEqual(
1324 unichr(sys.maxunicode),
1325 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1326 )
1327 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1328 self.assertRaises(TypeError, unichr)
Amaury Forgeot d'Arc39fd6722008-07-31 21:28:03 +00001329 self.assertRaises((OverflowError, ValueError), unichr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +00001330
Guido van Rossumfee7b932005-01-16 00:21:28 +00001331 # We don't want self in vars(), so these are static methods
1332
1333 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001334 def get_vars_f0():
1335 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001336
Guido van Rossumfee7b932005-01-16 00:21:28 +00001337 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001338 def get_vars_f2():
1339 BuiltinTest.get_vars_f0()
1340 a = 1
1341 b = 2
1342 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001343
1344 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001345 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001346 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001347 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001348 self.assertEqual(self.get_vars_f0(), {})
1349 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1350 self.assertRaises(TypeError, vars, 42, 42)
1351 self.assertRaises(TypeError, vars, 42)
1352
1353 def test_zip(self):
1354 a = (1, 2, 3)
1355 b = (4, 5, 6)
1356 t = [(1, 4), (2, 5), (3, 6)]
1357 self.assertEqual(zip(a, b), t)
1358 b = [4, 5, 6]
1359 self.assertEqual(zip(a, b), t)
1360 b = (4, 5, 6, 7)
1361 self.assertEqual(zip(a, b), t)
1362 class I:
1363 def __getitem__(self, i):
1364 if i < 0 or i > 2: raise IndexError
1365 return i + 4
1366 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001367 self.assertEqual(zip(), [])
1368 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001369 self.assertRaises(TypeError, zip, None)
1370 class G:
1371 pass
1372 self.assertRaises(TypeError, zip, a, G())
1373
1374 # Make sure zip doesn't try to allocate a billion elements for the
1375 # result list when one of its arguments doesn't say how long it is.
1376 # A MemoryError is the most likely failure mode.
1377 class SequenceWithoutALength:
1378 def __getitem__(self, i):
1379 if i == 5:
1380 raise IndexError
1381 else:
1382 return i
1383 self.assertEqual(
1384 zip(SequenceWithoutALength(), xrange(2**30)),
1385 list(enumerate(range(5)))
1386 )
1387
1388 class BadSeq:
1389 def __getitem__(self, i):
1390 if i == 5:
1391 raise ValueError
1392 else:
1393 return i
1394 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1395
Eric Smitha9f7d622008-02-17 19:46:49 +00001396 def test_format(self):
1397 # Test the basic machinery of the format() builtin. Don't test
1398 # the specifics of the various formatters
1399 self.assertEqual(format(3, ''), '3')
1400
1401 # Returns some classes to use for various tests. There's
1402 # an old-style version, and a new-style version
1403 def classes_new():
1404 class A(object):
1405 def __init__(self, x):
1406 self.x = x
1407 def __format__(self, format_spec):
1408 return str(self.x) + format_spec
1409 class DerivedFromA(A):
1410 pass
1411
1412 class Simple(object): pass
1413 class DerivedFromSimple(Simple):
1414 def __init__(self, x):
1415 self.x = x
1416 def __format__(self, format_spec):
1417 return str(self.x) + format_spec
1418 class DerivedFromSimple2(DerivedFromSimple): pass
1419 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1420
1421 # In 3.0, classes_classic has the same meaning as classes_new
1422 def classes_classic():
1423 class A:
1424 def __init__(self, x):
1425 self.x = x
1426 def __format__(self, format_spec):
1427 return str(self.x) + format_spec
1428 class DerivedFromA(A):
1429 pass
1430
1431 class Simple: pass
1432 class DerivedFromSimple(Simple):
1433 def __init__(self, x):
1434 self.x = x
1435 def __format__(self, format_spec):
1436 return str(self.x) + format_spec
1437 class DerivedFromSimple2(DerivedFromSimple): pass
1438 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1439
1440 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1441 self.assertEqual(format(A(3), 'spec'), '3spec')
1442 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1443 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1444 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1445 '10abcdef')
1446
1447 class_test(*classes_new())
1448 class_test(*classes_classic())
1449
1450 def empty_format_spec(value):
1451 # test that:
1452 # format(x, '') == str(x)
1453 # format(x) == str(x)
1454 self.assertEqual(format(value, ""), str(value))
1455 self.assertEqual(format(value), str(value))
1456
1457 # for builtin types, format(x, "") == str(x)
1458 empty_format_spec(17**13)
1459 empty_format_spec(1.0)
1460 empty_format_spec(3.1415e104)
1461 empty_format_spec(-3.1415e104)
1462 empty_format_spec(3.1415e-104)
1463 empty_format_spec(-3.1415e-104)
1464 empty_format_spec(object)
1465 empty_format_spec(None)
1466
1467 # TypeError because self.__format__ returns the wrong type
1468 class BadFormatResult:
1469 def __format__(self, format_spec):
1470 return 1.0
1471 self.assertRaises(TypeError, format, BadFormatResult(), "")
1472
1473 # TypeError because format_spec is not unicode or str
1474 self.assertRaises(TypeError, format, object(), 4)
1475 self.assertRaises(TypeError, format, object(), object())
1476
1477 # tests for object.__format__ really belong elsewhere, but
1478 # there's no good place to put them
1479 x = object().__format__('')
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001480 self.assertTrue(x.startswith('<object object at'))
Eric Smitha9f7d622008-02-17 19:46:49 +00001481
1482 # first argument to object.__format__ must be string
1483 self.assertRaises(TypeError, object().__format__, 3)
1484 self.assertRaises(TypeError, object().__format__, object())
1485 self.assertRaises(TypeError, object().__format__, None)
1486
Eric Smithd44b2fc2010-04-02 12:30:56 +00001487 # --------------------------------------------------------------------
1488 # Issue #7994: object.__format__ with a non-empty format string is
1489 # pending deprecated
1490 def test_deprecated_format_string(obj, fmt_str, should_raise_warning):
1491 with warnings.catch_warnings(record=True) as w:
1492 warnings.simplefilter("always", PendingDeprecationWarning)
1493 format(obj, fmt_str)
1494 if should_raise_warning:
1495 self.assertEqual(len(w), 1)
1496 self.assertIsInstance(w[0].message, PendingDeprecationWarning)
1497 self.assertIn('object.__format__ with a non-empty format '
1498 'string', str(w[0].message))
1499 else:
1500 self.assertEqual(len(w), 0)
1501
1502 fmt_strs = ['', 's', u'', u's']
1503
1504 class A:
1505 def __format__(self, fmt_str):
1506 return format('', fmt_str)
1507
1508 for fmt_str in fmt_strs:
1509 test_deprecated_format_string(A(), fmt_str, False)
1510
1511 class B:
1512 pass
1513
1514 class C(object):
1515 pass
1516
1517 for cls in [object, B, C]:
1518 for fmt_str in fmt_strs:
1519 test_deprecated_format_string(cls(), fmt_str, len(fmt_str) != 0)
1520 # --------------------------------------------------------------------
1521
Eric Smitha9f7d622008-02-17 19:46:49 +00001522 # make sure we can take a subclass of str as a format spec
1523 class DerivedFromStr(str): pass
1524 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1525
Eric Smithfb0742f2008-02-22 17:43:17 +00001526 def test_bin(self):
1527 self.assertEqual(bin(0), '0b0')
1528 self.assertEqual(bin(1), '0b1')
1529 self.assertEqual(bin(-1), '-0b1')
1530 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1531 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1532 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1533 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1534
Georg Brandlec812ca2009-07-22 11:57:15 +00001535 def test_bytearray_translate(self):
1536 x = bytearray("abc")
1537 self.assertRaises(ValueError, x.translate, "1", 1)
1538 self.assertRaises(TypeError, x.translate, "1"*256, 1)
1539
Eric Smithce584d42008-02-21 20:17:08 +00001540class TestSorted(unittest.TestCase):
1541
1542 def test_basic(self):
1543 data = range(100)
1544 copy = data[:]
1545 random.shuffle(copy)
1546 self.assertEqual(data, sorted(copy))
1547 self.assertNotEqual(data, copy)
1548
1549 data.reverse()
1550 random.shuffle(copy)
1551 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1552 self.assertNotEqual(data, copy)
1553 random.shuffle(copy)
1554 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1555 self.assertNotEqual(data, copy)
1556 random.shuffle(copy)
1557 self.assertEqual(data, sorted(copy, reverse=1))
1558 self.assertNotEqual(data, copy)
1559
1560 def test_inputtypes(self):
1561 s = 'abracadabra'
1562 types = [list, tuple]
1563 if have_unicode:
1564 types.insert(0, unicode)
1565 for T in types:
1566 self.assertEqual(sorted(s), sorted(T(s)))
1567
1568 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
1569 types = [set, frozenset, list, tuple, dict.fromkeys]
1570 if have_unicode:
1571 types.insert(0, unicode)
1572 for T in types:
1573 self.assertEqual(sorted(s), sorted(T(s)))
1574
1575 def test_baddecorator(self):
1576 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1577 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1578
Florent Xicluna07627882010-03-21 01:14:24 +00001579def _run_unittest(*args):
1580 with check_py3k_warnings(
1581 (".+ not supported in 3.x", DeprecationWarning),
1582 (".+ is renamed to imp.reload", DeprecationWarning),
1583 ("classic int division", DeprecationWarning)):
1584 run_unittest(*args)
1585
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001586def test_main(verbose=None):
1587 test_classes = (BuiltinTest, TestSorted)
1588
Florent Xicluna07627882010-03-21 01:14:24 +00001589 _run_unittest(*test_classes)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001590
1591 # verify reference counting
1592 if verbose and hasattr(sys, "gettotalrefcount"):
1593 import gc
1594 counts = [None] * 5
1595 for i in xrange(len(counts)):
Florent Xicluna07627882010-03-21 01:14:24 +00001596 _run_unittest(*test_classes)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001597 gc.collect()
1598 counts[i] = sys.gettotalrefcount()
1599 print counts
1600
Walter Dörwald919497e2003-01-19 16:23:59 +00001601
1602if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001603 test_main(verbose=True)