blob: 465c5f8470cadfa866bcf18efe8d4ffb24d01522 [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
Mark Dickinson481ab892010-05-05 22:42:51 +00001073 # Reject floats.
1074 self.assertRaises(TypeError, range, 1., 1., 1.)
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
Mark Dickinsona8d26682010-05-04 16:18:25 +00001083 bignum = 2*sys.maxint
1084 smallnum = 42
1085 # Old-style user-defined class with __int__ method
1086 class I0:
1087 def __init__(self, n):
1088 self.n = int(n)
1089 def __int__(self):
1090 return self.n
1091 self.assertEqual(range(I0(bignum), I0(bignum + 1)), [bignum])
1092 self.assertEqual(range(I0(smallnum), I0(smallnum + 1)), [smallnum])
1093
1094 # New-style user-defined class with __int__ method
1095 class I1(object):
1096 def __init__(self, n):
1097 self.n = int(n)
1098 def __int__(self):
1099 return self.n
1100 self.assertEqual(range(I1(bignum), I1(bignum + 1)), [bignum])
1101 self.assertEqual(range(I1(smallnum), I1(smallnum + 1)), [smallnum])
1102
1103 # New-style user-defined class with failing __int__ method
1104 class IX(object):
1105 def __int__(self):
1106 raise RuntimeError
1107 self.assertRaises(RuntimeError, range, IX())
1108
1109 # New-style user-defined class with invalid __int__ method
1110 class IN(object):
1111 def __int__(self):
1112 return "not a number"
1113 self.assertRaises(TypeError, range, IN())
1114
1115 # Exercise various combinations of bad arguments, to check
1116 # refcounting logic
1117 self.assertRaises(TypeError, range, 0.0)
1118
1119 self.assertRaises(TypeError, range, 0, 0.0)
1120 self.assertRaises(TypeError, range, 0.0, 0)
1121 self.assertRaises(TypeError, range, 0.0, 0.0)
1122
1123 self.assertRaises(TypeError, range, 0, 0, 1.0)
1124 self.assertRaises(TypeError, range, 0, 0.0, 1)
1125 self.assertRaises(TypeError, range, 0, 0.0, 1.0)
1126 self.assertRaises(TypeError, range, 0.0, 0, 1)
1127 self.assertRaises(TypeError, range, 0.0, 0, 1.0)
1128 self.assertRaises(TypeError, range, 0.0, 0.0, 1)
1129 self.assertRaises(TypeError, range, 0.0, 0.0, 1.0)
1130
1131
1132
Walter Dörwald919497e2003-01-19 16:23:59 +00001133 def test_input_and_raw_input(self):
1134 self.write_testfile()
1135 fp = open(TESTFN, 'r')
1136 savestdin = sys.stdin
1137 savestdout = sys.stdout # Eats the echo
1138 try:
1139 sys.stdin = fp
1140 sys.stdout = BitBucket()
1141 self.assertEqual(input(), 2)
1142 self.assertEqual(input('testing\n'), 2)
1143 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1144 self.assertEqual(raw_input('testing\n'), 'Dear John')
Tim Peters8e24a962006-08-09 00:52:26 +00001145
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001146 # SF 1535165: don't segfault on closed stdin
1147 # sys.stdout must be a regular file for triggering
1148 sys.stdout = savestdout
1149 sys.stdin.close()
Georg Brandld336e982006-08-06 09:17:16 +00001150 self.assertRaises(ValueError, input)
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001151
1152 sys.stdout = BitBucket()
Walter Dörwald919497e2003-01-19 16:23:59 +00001153 sys.stdin = cStringIO.StringIO("NULL\0")
1154 self.assertRaises(TypeError, input, 42, 42)
1155 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1156 self.assertEqual(input(), 'whitespace')
1157 sys.stdin = cStringIO.StringIO()
1158 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001159
1160 # SF 876178: make sure input() respect future options.
1161 sys.stdin = cStringIO.StringIO('1/2')
1162 sys.stdout = cStringIO.StringIO()
1163 exec compile('print input()', 'test_builtin_tmp', 'exec')
1164 sys.stdin.seek(0, 0)
1165 exec compile('from __future__ import division;print input()',
1166 'test_builtin_tmp', 'exec')
1167 sys.stdin.seek(0, 0)
1168 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001169 # The result we expect depends on whether new division semantics
1170 # are already in effect.
1171 if 1/2 == 0:
1172 # This test was compiled with old semantics.
1173 expected = ['0', '0.5', '0']
1174 else:
1175 # This test was compiled with new semantics (e.g., -Qnew
1176 # was given on the command line.
1177 expected = ['0.5', '0.5', '0.5']
1178 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001179
Walter Dörwald919497e2003-01-19 16:23:59 +00001180 del sys.stdout
1181 self.assertRaises(RuntimeError, input, 'prompt')
1182 del sys.stdin
1183 self.assertRaises(RuntimeError, input, 'prompt')
1184 finally:
1185 sys.stdin = savestdin
1186 sys.stdout = savestdout
1187 fp.close()
1188 unlink(TESTFN)
1189
1190 def test_reduce(self):
1191 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1192 self.assertEqual(
1193 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1194 ['a','c','d','w']
1195 )
1196 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1197 self.assertEqual(
1198 reduce(lambda x, y: x*y, range(2,21), 1L),
1199 2432902008176640000L
1200 )
1201 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1202 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1203 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1204 self.assertRaises(TypeError, reduce)
1205 self.assertRaises(TypeError, reduce, 42, 42)
1206 self.assertRaises(TypeError, reduce, 42, 42, 42)
1207 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1208 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1209 self.assertRaises(TypeError, reduce, 42, (42, 42))
1210
1211 class BadSeq:
1212 def __getitem__(self, index):
1213 raise ValueError
1214 self.assertRaises(ValueError, reduce, 42, BadSeq())
1215
1216 def test_reload(self):
1217 import marshal
1218 reload(marshal)
1219 import string
1220 reload(string)
1221 ## import sys
1222 ## self.assertRaises(ImportError, reload, sys)
1223
1224 def test_repr(self):
1225 self.assertEqual(repr(''), '\'\'')
1226 self.assertEqual(repr(0), '0')
1227 self.assertEqual(repr(0L), '0L')
1228 self.assertEqual(repr(()), '()')
1229 self.assertEqual(repr([]), '[]')
1230 self.assertEqual(repr({}), '{}')
1231 a = []
1232 a.append(a)
1233 self.assertEqual(repr(a), '[[...]]')
1234 a = {}
1235 a[0] = a
1236 self.assertEqual(repr(a), '{0: {...}}')
1237
1238 def test_round(self):
1239 self.assertEqual(round(0.0), 0.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001240 self.assertEqual(type(round(0.0)), float) # Will be int in 3.0.
Walter Dörwald919497e2003-01-19 16:23:59 +00001241 self.assertEqual(round(1.0), 1.0)
1242 self.assertEqual(round(10.0), 10.0)
1243 self.assertEqual(round(1000000000.0), 1000000000.0)
1244 self.assertEqual(round(1e20), 1e20)
1245
1246 self.assertEqual(round(-1.0), -1.0)
1247 self.assertEqual(round(-10.0), -10.0)
1248 self.assertEqual(round(-1000000000.0), -1000000000.0)
1249 self.assertEqual(round(-1e20), -1e20)
1250
1251 self.assertEqual(round(0.1), 0.0)
1252 self.assertEqual(round(1.1), 1.0)
1253 self.assertEqual(round(10.1), 10.0)
1254 self.assertEqual(round(1000000000.1), 1000000000.0)
1255
1256 self.assertEqual(round(-1.1), -1.0)
1257 self.assertEqual(round(-10.1), -10.0)
1258 self.assertEqual(round(-1000000000.1), -1000000000.0)
1259
1260 self.assertEqual(round(0.9), 1.0)
1261 self.assertEqual(round(9.9), 10.0)
1262 self.assertEqual(round(999999999.9), 1000000000.0)
1263
1264 self.assertEqual(round(-0.9), -1.0)
1265 self.assertEqual(round(-9.9), -10.0)
1266 self.assertEqual(round(-999999999.9), -1000000000.0)
1267
1268 self.assertEqual(round(-8.0, -1), -10.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001269 self.assertEqual(type(round(-8.0, -1)), float)
1270
1271 self.assertEqual(type(round(-8.0, 0)), float)
1272 self.assertEqual(type(round(-8.0, 1)), float)
1273
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001274 # Check half rounding behaviour.
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001275 self.assertEqual(round(5.5), 6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001276 self.assertEqual(round(6.5), 7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001277 self.assertEqual(round(-5.5), -6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001278 self.assertEqual(round(-6.5), -7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001279
1280 # Check behavior on ints
1281 self.assertEqual(round(0), 0)
1282 self.assertEqual(round(8), 8)
1283 self.assertEqual(round(-8), -8)
1284 self.assertEqual(type(round(0)), float) # Will be int in 3.0.
1285 self.assertEqual(type(round(-8, -1)), float)
1286 self.assertEqual(type(round(-8, 0)), float)
1287 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001288
Georg Brandlccadf842006-03-31 18:54:53 +00001289 # test new kwargs
1290 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1291
Walter Dörwald919497e2003-01-19 16:23:59 +00001292 self.assertRaises(TypeError, round)
1293
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001294 # test generic rounding delegation for reals
1295 class TestRound(object):
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001296 def __float__(self):
1297 return 23.0
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001298
1299 class TestNoRound(object):
1300 pass
1301
1302 self.assertEqual(round(TestRound()), 23)
1303
1304 self.assertRaises(TypeError, round, 1, 2, 3)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001305 self.assertRaises(TypeError, round, TestNoRound())
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001306
1307 t = TestNoRound()
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001308 t.__float__ = lambda *args: args
1309 self.assertRaises(TypeError, round, t)
1310 self.assertRaises(TypeError, round, t, 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001311
Mark Dickinsona8fd66d2009-11-09 17:03:34 +00001312 # Some versions of glibc for alpha have a bug that affects
1313 # float -> integer rounding (floor, ceil, rint, round) for
1314 # values in the range [2**52, 2**53). See:
1315 #
1316 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1317 #
1318 # We skip this test on Linux/alpha if it would fail.
1319 linux_alpha = (platform.system().startswith('Linux') and
1320 platform.machine().startswith('alpha'))
1321 system_round_bug = round(5e15+1) != 5e15+1
1322 @unittest.skipIf(linux_alpha and system_round_bug,
1323 "test will fail; failure is probably due to a "
1324 "buggy system round function")
1325 def test_round_large(self):
1326 # Issue #1869: integral floats should remain unchanged
1327 self.assertEqual(round(5e15-1), 5e15-1)
1328 self.assertEqual(round(5e15), 5e15)
1329 self.assertEqual(round(5e15+1), 5e15+1)
1330 self.assertEqual(round(5e15+2), 5e15+2)
1331 self.assertEqual(round(5e15+3), 5e15+3)
1332
Walter Dörwald919497e2003-01-19 16:23:59 +00001333 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001334 setattr(sys, 'spam', 1)
1335 self.assertEqual(sys.spam, 1)
1336 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1337 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001338
Alex Martellia70b1912003-04-22 08:12:33 +00001339 def test_sum(self):
1340 self.assertEqual(sum([]), 0)
1341 self.assertEqual(sum(range(2,8)), 27)
1342 self.assertEqual(sum(iter(range(2,8))), 27)
1343 self.assertEqual(sum(Squares(10)), 285)
1344 self.assertEqual(sum(iter(Squares(10))), 285)
1345 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1346
1347 self.assertRaises(TypeError, sum)
1348 self.assertRaises(TypeError, sum, 42)
1349 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1350 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1351 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1352 self.assertRaises(TypeError, sum, [{2:3}])
1353 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1354
1355 class BadSeq:
1356 def __getitem__(self, index):
1357 raise ValueError
1358 self.assertRaises(ValueError, sum, BadSeq())
1359
Mark Dickinsonbfd2dc72009-10-17 21:46:32 +00001360 empty = []
1361 sum(([x] for x in range(10)), empty)
1362 self.assertEqual(empty, [])
1363
Walter Dörwald919497e2003-01-19 16:23:59 +00001364 def test_type(self):
1365 self.assertEqual(type(''), type('123'))
1366 self.assertNotEqual(type(''), type(()))
1367
1368 def test_unichr(self):
1369 if have_unicode:
1370 self.assertEqual(unichr(32), unicode(' '))
1371 self.assertEqual(unichr(65), unicode('A'))
1372 self.assertEqual(unichr(97), unicode('a'))
1373 self.assertEqual(
1374 unichr(sys.maxunicode),
1375 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1376 )
1377 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1378 self.assertRaises(TypeError, unichr)
Amaury Forgeot d'Arc39fd6722008-07-31 21:28:03 +00001379 self.assertRaises((OverflowError, ValueError), unichr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +00001380
Guido van Rossumfee7b932005-01-16 00:21:28 +00001381 # We don't want self in vars(), so these are static methods
1382
1383 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001384 def get_vars_f0():
1385 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001386
Guido van Rossumfee7b932005-01-16 00:21:28 +00001387 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001388 def get_vars_f2():
1389 BuiltinTest.get_vars_f0()
1390 a = 1
1391 b = 2
1392 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001393
1394 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001395 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001396 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001397 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001398 self.assertEqual(self.get_vars_f0(), {})
1399 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1400 self.assertRaises(TypeError, vars, 42, 42)
1401 self.assertRaises(TypeError, vars, 42)
1402
1403 def test_zip(self):
1404 a = (1, 2, 3)
1405 b = (4, 5, 6)
1406 t = [(1, 4), (2, 5), (3, 6)]
1407 self.assertEqual(zip(a, b), t)
1408 b = [4, 5, 6]
1409 self.assertEqual(zip(a, b), t)
1410 b = (4, 5, 6, 7)
1411 self.assertEqual(zip(a, b), t)
1412 class I:
1413 def __getitem__(self, i):
1414 if i < 0 or i > 2: raise IndexError
1415 return i + 4
1416 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001417 self.assertEqual(zip(), [])
1418 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001419 self.assertRaises(TypeError, zip, None)
1420 class G:
1421 pass
1422 self.assertRaises(TypeError, zip, a, G())
1423
1424 # Make sure zip doesn't try to allocate a billion elements for the
1425 # result list when one of its arguments doesn't say how long it is.
1426 # A MemoryError is the most likely failure mode.
1427 class SequenceWithoutALength:
1428 def __getitem__(self, i):
1429 if i == 5:
1430 raise IndexError
1431 else:
1432 return i
1433 self.assertEqual(
1434 zip(SequenceWithoutALength(), xrange(2**30)),
1435 list(enumerate(range(5)))
1436 )
1437
1438 class BadSeq:
1439 def __getitem__(self, i):
1440 if i == 5:
1441 raise ValueError
1442 else:
1443 return i
1444 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1445
Eric Smitha9f7d622008-02-17 19:46:49 +00001446 def test_format(self):
1447 # Test the basic machinery of the format() builtin. Don't test
1448 # the specifics of the various formatters
1449 self.assertEqual(format(3, ''), '3')
1450
1451 # Returns some classes to use for various tests. There's
1452 # an old-style version, and a new-style version
1453 def classes_new():
1454 class A(object):
1455 def __init__(self, x):
1456 self.x = x
1457 def __format__(self, format_spec):
1458 return str(self.x) + format_spec
1459 class DerivedFromA(A):
1460 pass
1461
1462 class Simple(object): pass
1463 class DerivedFromSimple(Simple):
1464 def __init__(self, x):
1465 self.x = x
1466 def __format__(self, format_spec):
1467 return str(self.x) + format_spec
1468 class DerivedFromSimple2(DerivedFromSimple): pass
1469 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1470
1471 # In 3.0, classes_classic has the same meaning as classes_new
1472 def classes_classic():
1473 class A:
1474 def __init__(self, x):
1475 self.x = x
1476 def __format__(self, format_spec):
1477 return str(self.x) + format_spec
1478 class DerivedFromA(A):
1479 pass
1480
1481 class Simple: pass
1482 class DerivedFromSimple(Simple):
1483 def __init__(self, x):
1484 self.x = x
1485 def __format__(self, format_spec):
1486 return str(self.x) + format_spec
1487 class DerivedFromSimple2(DerivedFromSimple): pass
1488 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1489
1490 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1491 self.assertEqual(format(A(3), 'spec'), '3spec')
1492 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1493 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1494 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1495 '10abcdef')
1496
1497 class_test(*classes_new())
1498 class_test(*classes_classic())
1499
1500 def empty_format_spec(value):
1501 # test that:
1502 # format(x, '') == str(x)
1503 # format(x) == str(x)
1504 self.assertEqual(format(value, ""), str(value))
1505 self.assertEqual(format(value), str(value))
1506
1507 # for builtin types, format(x, "") == str(x)
1508 empty_format_spec(17**13)
1509 empty_format_spec(1.0)
1510 empty_format_spec(3.1415e104)
1511 empty_format_spec(-3.1415e104)
1512 empty_format_spec(3.1415e-104)
1513 empty_format_spec(-3.1415e-104)
1514 empty_format_spec(object)
1515 empty_format_spec(None)
1516
1517 # TypeError because self.__format__ returns the wrong type
1518 class BadFormatResult:
1519 def __format__(self, format_spec):
1520 return 1.0
1521 self.assertRaises(TypeError, format, BadFormatResult(), "")
1522
1523 # TypeError because format_spec is not unicode or str
1524 self.assertRaises(TypeError, format, object(), 4)
1525 self.assertRaises(TypeError, format, object(), object())
1526
1527 # tests for object.__format__ really belong elsewhere, but
1528 # there's no good place to put them
1529 x = object().__format__('')
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001530 self.assertTrue(x.startswith('<object object at'))
Eric Smitha9f7d622008-02-17 19:46:49 +00001531
1532 # first argument to object.__format__ must be string
1533 self.assertRaises(TypeError, object().__format__, 3)
1534 self.assertRaises(TypeError, object().__format__, object())
1535 self.assertRaises(TypeError, object().__format__, None)
1536
Eric Smithd44b2fc2010-04-02 12:30:56 +00001537 # --------------------------------------------------------------------
1538 # Issue #7994: object.__format__ with a non-empty format string is
1539 # pending deprecated
1540 def test_deprecated_format_string(obj, fmt_str, should_raise_warning):
1541 with warnings.catch_warnings(record=True) as w:
1542 warnings.simplefilter("always", PendingDeprecationWarning)
1543 format(obj, fmt_str)
1544 if should_raise_warning:
1545 self.assertEqual(len(w), 1)
1546 self.assertIsInstance(w[0].message, PendingDeprecationWarning)
1547 self.assertIn('object.__format__ with a non-empty format '
1548 'string', str(w[0].message))
1549 else:
1550 self.assertEqual(len(w), 0)
1551
1552 fmt_strs = ['', 's', u'', u's']
1553
1554 class A:
1555 def __format__(self, fmt_str):
1556 return format('', fmt_str)
1557
1558 for fmt_str in fmt_strs:
1559 test_deprecated_format_string(A(), fmt_str, False)
1560
1561 class B:
1562 pass
1563
1564 class C(object):
1565 pass
1566
1567 for cls in [object, B, C]:
1568 for fmt_str in fmt_strs:
1569 test_deprecated_format_string(cls(), fmt_str, len(fmt_str) != 0)
1570 # --------------------------------------------------------------------
1571
Eric Smitha9f7d622008-02-17 19:46:49 +00001572 # make sure we can take a subclass of str as a format spec
1573 class DerivedFromStr(str): pass
1574 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1575
Eric Smithfb0742f2008-02-22 17:43:17 +00001576 def test_bin(self):
1577 self.assertEqual(bin(0), '0b0')
1578 self.assertEqual(bin(1), '0b1')
1579 self.assertEqual(bin(-1), '-0b1')
1580 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1581 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1582 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1583 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1584
Georg Brandlec812ca2009-07-22 11:57:15 +00001585 def test_bytearray_translate(self):
1586 x = bytearray("abc")
1587 self.assertRaises(ValueError, x.translate, "1", 1)
1588 self.assertRaises(TypeError, x.translate, "1"*256, 1)
1589
Eric Smithce584d42008-02-21 20:17:08 +00001590class TestSorted(unittest.TestCase):
1591
1592 def test_basic(self):
1593 data = range(100)
1594 copy = data[:]
1595 random.shuffle(copy)
1596 self.assertEqual(data, sorted(copy))
1597 self.assertNotEqual(data, copy)
1598
1599 data.reverse()
1600 random.shuffle(copy)
1601 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1602 self.assertNotEqual(data, copy)
1603 random.shuffle(copy)
1604 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1605 self.assertNotEqual(data, copy)
1606 random.shuffle(copy)
1607 self.assertEqual(data, sorted(copy, reverse=1))
1608 self.assertNotEqual(data, copy)
1609
1610 def test_inputtypes(self):
1611 s = 'abracadabra'
1612 types = [list, tuple]
1613 if have_unicode:
1614 types.insert(0, unicode)
1615 for T in types:
1616 self.assertEqual(sorted(s), sorted(T(s)))
1617
1618 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
1619 types = [set, frozenset, list, tuple, dict.fromkeys]
1620 if have_unicode:
1621 types.insert(0, unicode)
1622 for T in types:
1623 self.assertEqual(sorted(s), sorted(T(s)))
1624
1625 def test_baddecorator(self):
1626 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1627 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1628
Florent Xicluna07627882010-03-21 01:14:24 +00001629def _run_unittest(*args):
1630 with check_py3k_warnings(
1631 (".+ not supported in 3.x", DeprecationWarning),
1632 (".+ is renamed to imp.reload", DeprecationWarning),
1633 ("classic int division", DeprecationWarning)):
1634 run_unittest(*args)
1635
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001636def test_main(verbose=None):
1637 test_classes = (BuiltinTest, TestSorted)
1638
Florent Xicluna07627882010-03-21 01:14:24 +00001639 _run_unittest(*test_classes)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001640
1641 # verify reference counting
1642 if verbose and hasattr(sys, "gettotalrefcount"):
1643 import gc
1644 counts = [None] * 5
1645 for i in xrange(len(counts)):
Florent Xicluna07627882010-03-21 01:14:24 +00001646 _run_unittest(*test_classes)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001647 gc.collect()
1648 counts[i] = sys.gettotalrefcount()
1649 print counts
1650
Walter Dörwald919497e2003-01-19 16:23:59 +00001651
1652if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001653 test_main(verbose=True)