blob: 15581d99d1277f9d486a3f140c0524af783b10e7 [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')
Mark Dickinson20665592010-05-25 19:01:08 +000093 # bool
94 self.assertEqual(abs(True), 1)
95 self.assertEqual(abs(False), 0)
96 # other
97 self.assertRaises(TypeError, abs)
98 self.assertRaises(TypeError, abs, None)
99 class AbsClass(object):
100 def __abs__(self):
101 return -5
102 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000103
Raymond Hettinger96229b12005-03-11 06:49:40 +0000104 def test_all(self):
105 self.assertEqual(all([2, 4, 6]), True)
106 self.assertEqual(all([2, None, 6]), False)
107 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
108 self.assertRaises(RuntimeError, all, TestFailingIter())
109 self.assertRaises(TypeError, all, 10) # Non-iterable
110 self.assertRaises(TypeError, all) # No args
111 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
112 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti7d0eb4b2013-02-21 23:15:40 +0200113 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000114 S = [50, 60]
115 self.assertEqual(all(x > 42 for x in S), True)
116 S = [50, 40, 60]
117 self.assertEqual(all(x > 42 for x in S), False)
118
119 def test_any(self):
120 self.assertEqual(any([None, None, None]), False)
121 self.assertEqual(any([None, 4, None]), True)
122 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray9b3085c2013-02-06 10:06:10 -0500123 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000124 self.assertRaises(TypeError, any, 10) # Non-iterable
125 self.assertRaises(TypeError, any) # No args
126 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
127 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti7d0eb4b2013-02-21 23:15:40 +0200128 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000129 S = [40, 60, 30]
130 self.assertEqual(any(x > 42 for x in S), True)
131 S = [10, 20, 30]
132 self.assertEqual(any(x > 42 for x in S), False)
133
Armin Rigo7ccbca92006-10-04 12:17:45 +0000134 def test_neg(self):
135 x = -sys.maxint-1
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000136 self.assertTrue(isinstance(x, int))
Armin Rigo7ccbca92006-10-04 12:17:45 +0000137 self.assertEqual(-x, sys.maxint+1)
138
Walter Dörwald919497e2003-01-19 16:23:59 +0000139 def test_apply(self):
140 def f0(*args):
141 self.assertEqual(args, ())
142 def f1(a1):
143 self.assertEqual(a1, 1)
144 def f2(a1, a2):
145 self.assertEqual(a1, 1)
146 self.assertEqual(a2, 2)
147 def f3(a1, a2, a3):
148 self.assertEqual(a1, 1)
149 self.assertEqual(a2, 2)
150 self.assertEqual(a3, 3)
151 apply(f0, ())
152 apply(f1, (1,))
153 apply(f2, (1, 2))
154 apply(f3, (1, 2, 3))
155
156 # A PyCFunction that takes only positional parameters should allow an
157 # empty keyword dictionary to pass without a complaint, but raise a
158 # TypeError if the dictionary is non-empty.
159 apply(id, (1,), {})
160 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
161 self.assertRaises(TypeError, apply)
162 self.assertRaises(TypeError, apply, id, 42)
163 self.assertRaises(TypeError, apply, id, (42,), 42)
164
165 def test_callable(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000166 self.assertTrue(callable(len))
Mark Dickinson20665592010-05-25 19:01:08 +0000167 self.assertFalse(callable("a"))
168 self.assertTrue(callable(callable))
169 self.assertTrue(callable(lambda x, y: x + y))
170 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000171 def f(): pass
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000172 self.assertTrue(callable(f))
Mark Dickinson20665592010-05-25 19:01:08 +0000173
174 class Classic:
Walter Dörwald919497e2003-01-19 16:23:59 +0000175 def meth(self): pass
Mark Dickinson20665592010-05-25 19:01:08 +0000176 self.assertTrue(callable(Classic))
177 c = Classic()
178 self.assertTrue(callable(c.meth))
179 self.assertFalse(callable(c))
180
181 class NewStyle(object):
182 def meth(self): pass
183 self.assertTrue(callable(NewStyle))
184 n = NewStyle()
185 self.assertTrue(callable(n.meth))
186 self.assertFalse(callable(n))
187
188 # Classic and new-style classes evaluate __call__() differently
189 c.__call__ = None
190 self.assertTrue(callable(c))
191 del c.__call__
192 self.assertFalse(callable(c))
193 n.__call__ = None
194 self.assertFalse(callable(n))
195 del n.__call__
196 self.assertFalse(callable(n))
197
198 class N2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000199 def __call__(self): pass
Mark Dickinson20665592010-05-25 19:01:08 +0000200 n2 = N2()
201 self.assertTrue(callable(n2))
202 class N3(N2): pass
203 n3 = N3()
204 self.assertTrue(callable(n3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000205
206 def test_chr(self):
207 self.assertEqual(chr(32), ' ')
208 self.assertEqual(chr(65), 'A')
209 self.assertEqual(chr(97), 'a')
210 self.assertEqual(chr(0xff), '\xff')
211 self.assertRaises(ValueError, chr, 256)
212 self.assertRaises(TypeError, chr)
213
214 def test_cmp(self):
215 self.assertEqual(cmp(-1, 1), -1)
216 self.assertEqual(cmp(1, -1), 1)
217 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000218 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000219 a = []; a.append(a)
220 b = []; b.append(b)
221 from UserList import UserList
222 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000223 self.assertRaises(RuntimeError, cmp, a, b)
224 self.assertRaises(RuntimeError, cmp, b, c)
225 self.assertRaises(RuntimeError, cmp, c, a)
226 self.assertRaises(RuntimeError, cmp, a, c)
227 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000228 a.pop(); b.pop(); c.pop()
229 self.assertRaises(TypeError, cmp)
230
231 def test_coerce(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000232 self.assertTrue(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000233 self.assertEqual(coerce(1, 1L), (1L, 1L))
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000234 self.assertTrue(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000235 self.assertRaises(TypeError, coerce)
236 class BadNumber:
237 def __coerce__(self, other):
238 raise ValueError
239 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000240 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000241
242 def test_compile(self):
243 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000244 bom = '\xef\xbb\xbf'
245 compile(bom + 'print 1\n', '', 'exec')
Georg Brandl5240d742007-03-13 20:46:32 +0000246 compile(source='pass', filename='?', mode='exec')
247 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
248 compile('pass', '?', dont_inherit=1, mode='exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000249 self.assertRaises(TypeError, compile)
250 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
251 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000252 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Georg Brandl5240d742007-03-13 20:46:32 +0000253 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
254 mode='eval', source='0', filename='tmp')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000255 if have_unicode:
256 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000257 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
258 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000259
Georg Brandl5240d742007-03-13 20:46:32 +0000260
Walter Dörwald919497e2003-01-19 16:23:59 +0000261 def test_delattr(self):
262 import sys
263 sys.spam = 1
264 delattr(sys, 'spam')
265 self.assertRaises(TypeError, delattr)
266
267 def test_dir(self):
Georg Brandl871f1bc2007-03-12 13:17:36 +0000268 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000269 self.assertRaises(TypeError, dir, 42, 42)
270
Georg Brandl871f1bc2007-03-12 13:17:36 +0000271 # dir() - local scope
272 local_var = 1
Ezio Melottiaa980582010-01-23 23:04:36 +0000273 self.assertIn('local_var', dir())
Georg Brandl871f1bc2007-03-12 13:17:36 +0000274
275 # dir(module)
276 import sys
Ezio Melottiaa980582010-01-23 23:04:36 +0000277 self.assertIn('exit', dir(sys))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000278
279 # dir(module_with_invalid__dict__)
280 import types
281 class Foo(types.ModuleType):
282 __dict__ = 8
283 f = Foo("foo")
284 self.assertRaises(TypeError, dir, f)
285
286 # dir(type)
Ezio Melottiaa980582010-01-23 23:04:36 +0000287 self.assertIn("strip", dir(str))
288 self.assertNotIn("__mro__", dir(str))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000289
290 # dir(obj)
291 class Foo(object):
292 def __init__(self):
293 self.x = 7
294 self.y = 8
295 self.z = 9
296 f = Foo()
Ezio Melottiaa980582010-01-23 23:04:36 +0000297 self.assertIn("y", dir(f))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000298
299 # dir(obj_no__dict__)
300 class Foo(object):
301 __slots__ = []
302 f = Foo()
Ezio Melottiaa980582010-01-23 23:04:36 +0000303 self.assertIn("__repr__", dir(f))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000304
305 # dir(obj_no__class__with__dict__)
306 # (an ugly trick to cause getattr(f, "__class__") to fail)
307 class Foo(object):
308 __slots__ = ["__class__", "__dict__"]
309 def __init__(self):
310 self.bar = "wow"
311 f = Foo()
Ezio Melottiaa980582010-01-23 23:04:36 +0000312 self.assertNotIn("__repr__", dir(f))
313 self.assertIn("bar", dir(f))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000314
315 # dir(obj_using __dir__)
316 class Foo(object):
317 def __dir__(self):
318 return ["kan", "ga", "roo"]
319 f = Foo()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000320 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandl871f1bc2007-03-12 13:17:36 +0000321
322 # dir(obj__dir__not_list)
323 class Foo(object):
324 def __dir__(self):
325 return 7
326 f = Foo()
327 self.assertRaises(TypeError, dir, f)
328
Walter Dörwald919497e2003-01-19 16:23:59 +0000329 def test_divmod(self):
330 self.assertEqual(divmod(12, 7), (1, 5))
331 self.assertEqual(divmod(-12, 7), (-2, 2))
332 self.assertEqual(divmod(12, -7), (-2, -2))
333 self.assertEqual(divmod(-12, -7), (1, -5))
334
335 self.assertEqual(divmod(12L, 7L), (1L, 5L))
336 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
337 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
338 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
339
340 self.assertEqual(divmod(12, 7L), (1, 5L))
341 self.assertEqual(divmod(-12, 7L), (-2, 2L))
342 self.assertEqual(divmod(12L, -7), (-2L, -2))
343 self.assertEqual(divmod(-12L, -7), (1L, -5))
344
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000345 self.assertEqual(divmod(-sys.maxint-1, -1),
346 (sys.maxint+1, 0))
347
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000348 self.assertTrue(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
349 self.assertTrue(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
350 self.assertTrue(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
351 self.assertTrue(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000352
353 self.assertRaises(TypeError, divmod)
354
355 def test_eval(self):
356 self.assertEqual(eval('1+1'), 2)
357 self.assertEqual(eval(' 1+1\n'), 2)
358 globals = {'a': 1, 'b': 2}
359 locals = {'b': 200, 'c': 300}
360 self.assertEqual(eval('a', globals) , 1)
361 self.assertEqual(eval('a', globals, locals), 1)
362 self.assertEqual(eval('b', globals, locals), 200)
363 self.assertEqual(eval('c', globals, locals), 300)
364 if have_unicode:
365 self.assertEqual(eval(unicode('1+1')), 2)
366 self.assertEqual(eval(unicode(' 1+1\n')), 2)
367 globals = {'a': 1, 'b': 2}
368 locals = {'b': 200, 'c': 300}
369 if have_unicode:
370 self.assertEqual(eval(unicode('a'), globals), 1)
371 self.assertEqual(eval(unicode('a'), globals, locals), 1)
372 self.assertEqual(eval(unicode('b'), globals, locals), 200)
373 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000374 bom = '\xef\xbb\xbf'
375 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000376 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
377 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000378 self.assertRaises(TypeError, eval)
379 self.assertRaises(TypeError, eval, ())
380
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000381 def test_general_eval(self):
382 # Tests that general mappings can be used for the locals argument
383
384 class M:
385 "Test mapping interface versus possible calls from eval()."
386 def __getitem__(self, key):
387 if key == 'a':
388 return 12
389 raise KeyError
390 def keys(self):
391 return list('xyz')
392
393 m = M()
394 g = globals()
395 self.assertEqual(eval('a', g, m), 12)
396 self.assertRaises(NameError, eval, 'b', g, m)
397 self.assertEqual(eval('dir()', g, m), list('xyz'))
398 self.assertEqual(eval('globals()', g, m), g)
399 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000400 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000401 class A:
402 "Non-mapping"
403 pass
404 m = A()
405 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000406
407 # Verify that dict subclasses work as well
408 class D(dict):
409 def __getitem__(self, key):
410 if key == 'a':
411 return 12
412 return dict.__getitem__(self, key)
413 def keys(self):
414 return list('xyz')
415
416 d = D()
417 self.assertEqual(eval('a', g, d), 12)
418 self.assertRaises(NameError, eval, 'b', g, d)
419 self.assertEqual(eval('dir()', g, d), list('xyz'))
420 self.assertEqual(eval('globals()', g, d), g)
421 self.assertEqual(eval('locals()', g, d), d)
422
423 # Verify locals stores (used by list comps)
424 eval('[locals() for i in (2,3)]', g, d)
425 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
426
427 class SpreadSheet:
428 "Sample application showing nested, calculated lookups."
429 _cells = {}
430 def __setitem__(self, key, formula):
431 self._cells[key] = formula
Martin Blais215f13d2006-06-06 12:46:55 +0000432 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000433 return eval(self._cells[key], globals(), self)
434
435 ss = SpreadSheet()
436 ss['a1'] = '5'
437 ss['a2'] = 'a1*6'
438 ss['a3'] = 'a2*7'
439 self.assertEqual(ss['a3'], 210)
440
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000441 # Verify that dir() catches a non-list returned by eval
442 # SF bug #1004669
443 class C:
444 def __getitem__(self, item):
445 raise KeyError(item)
446 def keys(self):
447 return 'a'
448 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
449
Walter Dörwald919497e2003-01-19 16:23:59 +0000450 def test_filter(self):
451 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
452 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
453 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
454 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
455 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
456 def identity(item):
457 return 1
458 filter(identity, Squares(5))
459 self.assertRaises(TypeError, filter)
460 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000461 def __getitem__(self, index):
462 if index<4:
463 return 42
464 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000465 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
466 def badfunc():
467 pass
468 self.assertRaises(TypeError, filter, badfunc, range(5))
469
Walter Dörwaldbf517072003-01-27 15:57:14 +0000470 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000471 self.assertEqual(filter(None, (1, 2)), (1, 2))
472 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
473 self.assertRaises(TypeError, filter, 42, (1, 2))
474
Walter Dörwaldbf517072003-01-27 15:57:14 +0000475 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000476 self.assertEqual(filter(None, "12"), "12")
477 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
478 self.assertRaises(TypeError, filter, 42, "12")
479 class badstr(str):
480 def __getitem__(self, index):
481 raise ValueError
482 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000483
Walter Dörwald903f1e02003-02-04 16:28:00 +0000484 class badstr2(str):
485 def __getitem__(self, index):
486 return 42
487 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
488
489 class weirdstr(str):
490 def __getitem__(self, index):
491 return weirdstr(2*str.__getitem__(self, index))
492 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
493
Walter Dörwald5e61e242003-02-04 17:04:01 +0000494 class shiftstr(str):
495 def __getitem__(self, index):
496 return chr(ord(str.__getitem__(self, index))+1)
497 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
498
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000499 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000500 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000501 self.assertEqual(filter(None, unicode("12")), unicode("12"))
502 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
503 self.assertRaises(TypeError, filter, 42, unicode("12"))
504 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000505
Walter Dörwald903f1e02003-02-04 16:28:00 +0000506 class badunicode(unicode):
507 def __getitem__(self, index):
508 return 42
509 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
510
511 class weirdunicode(unicode):
512 def __getitem__(self, index):
513 return weirdunicode(2*unicode.__getitem__(self, index))
514 self.assertEqual(
515 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
516
Walter Dörwald5e61e242003-02-04 17:04:01 +0000517 class shiftunicode(unicode):
518 def __getitem__(self, index):
519 return unichr(ord(unicode.__getitem__(self, index))+1)
520 self.assertEqual(
521 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
522 unicode("345")
523 )
524
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000525 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000526 # test that filter() never returns tuple, str or unicode subclasses
527 # and that the result always goes through __getitem__
528 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000529 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000530 def __getitem__(self, index):
531 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000532 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000533 def __getitem__(self, index):
534 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000535 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000536 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000537 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000538 }
539 if have_unicode:
540 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000541 def __getitem__(self, index):
542 return 2*unicode.__getitem__(self, index)
543 inputs[unicode2] = {
544 unicode(): unicode(),
545 unicode("123"): unicode("112233")
546 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000547
Walter Dörwald1918f772003-02-10 13:19:13 +0000548 for (cls, inps) in inputs.iteritems():
549 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000550 # make sure the output goes through __getitem__
551 # even if func is None
552 self.assertEqual(
553 filter(funcs[0], cls(inp)),
554 filter(funcs[1], cls(inp))
555 )
556 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000557 outp = filter(func, cls(inp))
558 self.assertEqual(outp, exp)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000559 self.assertTrue(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000560
Walter Dörwald919497e2003-01-19 16:23:59 +0000561 def test_getattr(self):
562 import sys
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000563 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000564 self.assertRaises(TypeError, getattr, sys, 1)
565 self.assertRaises(TypeError, getattr, sys, 1, "foo")
566 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000567 if have_unicode:
568 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000569
570 def test_hasattr(self):
571 import sys
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000572 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000573 self.assertRaises(TypeError, hasattr, sys, 1)
574 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000575 if have_unicode:
576 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000577
Benjamin Petersonb9030f42008-05-12 00:41:23 +0000578 # Check that hasattr allows SystemExit and KeyboardInterrupts by
579 class A:
580 def __getattr__(self, what):
581 raise KeyboardInterrupt
582 self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
583 class B:
584 def __getattr__(self, what):
585 raise SystemExit
586 self.assertRaises(SystemExit, hasattr, B(), "b")
587
Walter Dörwald919497e2003-01-19 16:23:59 +0000588 def test_hash(self):
589 hash(None)
590 self.assertEqual(hash(1), hash(1L))
591 self.assertEqual(hash(1), hash(1.0))
592 hash('spam')
593 if have_unicode:
594 self.assertEqual(hash('spam'), hash(unicode('spam')))
595 hash((0,1,2,3))
596 def f(): pass
597 self.assertRaises(TypeError, hash, [])
598 self.assertRaises(TypeError, hash, {})
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000599 # Bug 1536021: Allow hash to return long objects
600 class X:
601 def __hash__(self):
602 return 2**100
Ezio Melotti2623a372010-11-21 13:34:58 +0000603 self.assertEqual(type(hash(X())), int)
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000604 class Y(object):
605 def __hash__(self):
606 return 2**100
Ezio Melotti2623a372010-11-21 13:34:58 +0000607 self.assertEqual(type(hash(Y())), int)
Armin Rigo51fc8c42006-08-09 14:55:26 +0000608 class Z(long):
609 def __hash__(self):
610 return self
Ezio Melotti2623a372010-11-21 13:34:58 +0000611 self.assertEqual(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000612
613 def test_hex(self):
614 self.assertEqual(hex(16), '0x10')
615 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000616 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000617 self.assertEqual(hex(-16L), '-0x10L')
618 self.assertRaises(TypeError, hex, {})
619
620 def test_id(self):
621 id(None)
622 id(1)
623 id(1L)
624 id(1.0)
625 id('spam')
626 id((0,1,2,3))
627 id([0,1,2,3])
628 id({'spam': 1, 'eggs': 2, 'ham': 3})
629
630 # Test input() later, together with raw_input
631
Andrew Svetlovcddcafa2012-12-23 12:44:04 +0200632 # test_int(): see test_int.py for int() tests.
633
Walter Dörwald919497e2003-01-19 16:23:59 +0000634 def test_intern(self):
635 self.assertRaises(TypeError, intern)
Georg Brandl4e1be942009-10-27 22:56:09 +0000636 # This fails if the test is run twice with a constant string,
637 # therefore append the run counter
638 s = "never interned before " + str(numruns)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000639 self.assertTrue(intern(s) is s)
Walter Dörwald919497e2003-01-19 16:23:59 +0000640 s2 = s.swapcase().swapcase()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000641 self.assertTrue(intern(s2) is s)
Walter Dörwald919497e2003-01-19 16:23:59 +0000642
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000643 # Subclasses of string can't be interned, because they
644 # provide too much opportunity for insane things to happen.
645 # We don't want them in the interned dict and if they aren't
646 # actually interned, we don't want to create the appearance
Ezio Melottic2077b02011-03-16 12:34:31 +0200647 # that they are by allowing intern() to succeed.
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000648 class S(str):
649 def __hash__(self):
650 return 123
651
652 self.assertRaises(TypeError, intern, S("abc"))
653
654 # It's still safe to pass these strings to routines that
655 # call intern internally, e.g. PyObject_SetAttr().
656 s = S("abc")
657 setattr(s, s, s)
658 self.assertEqual(getattr(s, s), s)
659
Walter Dörwald919497e2003-01-19 16:23:59 +0000660 def test_iter(self):
661 self.assertRaises(TypeError, iter)
662 self.assertRaises(TypeError, iter, 42, 42)
663 lists = [("1", "2"), ["1", "2"], "12"]
664 if have_unicode:
665 lists.append(unicode("12"))
666 for l in lists:
667 i = iter(l)
668 self.assertEqual(i.next(), '1')
669 self.assertEqual(i.next(), '2')
670 self.assertRaises(StopIteration, i.next)
671
672 def test_isinstance(self):
673 class C:
674 pass
675 class D(C):
676 pass
677 class E:
678 pass
679 c = C()
680 d = D()
681 e = E()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000682 self.assertTrue(isinstance(c, C))
683 self.assertTrue(isinstance(d, C))
684 self.assertTrue(not isinstance(e, C))
685 self.assertTrue(not isinstance(c, D))
686 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000687 self.assertRaises(TypeError, isinstance, E, 'foo')
688 self.assertRaises(TypeError, isinstance)
689
690 def test_issubclass(self):
691 class C:
692 pass
693 class D(C):
694 pass
695 class E:
696 pass
697 c = C()
698 d = D()
699 e = E()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000700 self.assertTrue(issubclass(D, C))
701 self.assertTrue(issubclass(C, C))
702 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000703 self.assertRaises(TypeError, issubclass, 'foo', E)
704 self.assertRaises(TypeError, issubclass, E, 'foo')
705 self.assertRaises(TypeError, issubclass)
706
707 def test_len(self):
708 self.assertEqual(len('123'), 3)
709 self.assertEqual(len(()), 0)
710 self.assertEqual(len((1, 2, 3, 4)), 4)
711 self.assertEqual(len([1, 2, 3, 4]), 4)
712 self.assertEqual(len({}), 0)
713 self.assertEqual(len({'a':1, 'b': 2}), 2)
714 class BadSeq:
715 def __len__(self):
716 raise ValueError
717 self.assertRaises(ValueError, len, BadSeq())
Mark Dickinson20665592010-05-25 19:01:08 +0000718 self.assertRaises(TypeError, len, 2)
719 class ClassicStyle: pass
720 class NewStyle(object): pass
721 self.assertRaises(AttributeError, len, ClassicStyle())
722 self.assertRaises(TypeError, len, NewStyle())
Walter Dörwald919497e2003-01-19 16:23:59 +0000723
Walter Dörwald919497e2003-01-19 16:23:59 +0000724 def test_map(self):
725 self.assertEqual(
726 map(None, 'hello world'),
727 ['h','e','l','l','o',' ','w','o','r','l','d']
728 )
729 self.assertEqual(
730 map(None, 'abcd', 'efg'),
731 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
732 )
733 self.assertEqual(
734 map(None, range(10)),
735 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
736 )
737 self.assertEqual(
738 map(lambda x: x*x, range(1,4)),
739 [1, 4, 9]
740 )
741 try:
742 from math import sqrt
743 except ImportError:
744 def sqrt(x):
745 return pow(x, 0.5)
746 self.assertEqual(
747 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
748 [[4.0, 2.0], [9.0, 3.0]]
749 )
750 self.assertEqual(
751 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
752 [10, 4, 6]
753 )
754
755 def plus(*v):
756 accu = 0
757 for i in v: accu = accu + i
758 return accu
759 self.assertEqual(
760 map(plus, [1, 3, 7]),
761 [1, 3, 7]
762 )
763 self.assertEqual(
764 map(plus, [1, 3, 7], [4, 9, 2]),
765 [1+4, 3+9, 7+2]
766 )
767 self.assertEqual(
768 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
769 [1+4+1, 3+9+1, 7+2+0]
770 )
771 self.assertEqual(
772 map(None, Squares(10)),
773 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
774 )
775 self.assertEqual(
776 map(int, Squares(10)),
777 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
778 )
779 self.assertEqual(
780 map(None, Squares(3), Squares(2)),
781 [(0,0), (1,1), (4,None)]
782 )
783 self.assertEqual(
784 map(max, Squares(3), Squares(2)),
785 [0, 1, 4]
786 )
787 self.assertRaises(TypeError, map)
788 self.assertRaises(TypeError, map, lambda x: x, 42)
789 self.assertEqual(map(None, [42]), [42])
790 class BadSeq:
791 def __getitem__(self, index):
792 raise ValueError
793 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +0000794 def badfunc(x):
795 raise RuntimeError
796 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000797
798 def test_max(self):
799 self.assertEqual(max('123123'), '3')
800 self.assertEqual(max(1, 2, 3), 3)
801 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
802 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
803
804 self.assertEqual(max(1, 2L, 3.0), 3.0)
805 self.assertEqual(max(1L, 2.0, 3), 3)
806 self.assertEqual(max(1.0, 2, 3L), 3L)
807
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000808 for stmt in (
809 "max(key=int)", # no args
810 "max(1, key=int)", # single arg not iterable
811 "max(1, 2, keystone=int)", # wrong keyword
812 "max(1, 2, key=int, abc=int)", # two many keywords
813 "max(1, 2, key=1)", # keyfunc is not callable
814 ):
Tim Peters7f061872004-12-07 21:17:46 +0000815 try:
816 exec(stmt) in globals()
817 except TypeError:
818 pass
819 else:
820 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000821
822 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
823 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
824 self.assertEqual(max(1, 2, key=neg), 1) # two elems
825
826 data = [random.randrange(200) for i in range(100)]
827 keys = dict((elem, random.randrange(50)) for elem in data)
828 f = keys.__getitem__
829 self.assertEqual(max(data, key=f),
830 sorted(reversed(data), key=f)[-1])
831
Walter Dörwald919497e2003-01-19 16:23:59 +0000832 def test_min(self):
833 self.assertEqual(min('123123'), '1')
834 self.assertEqual(min(1, 2, 3), 1)
835 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
836 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
837
838 self.assertEqual(min(1, 2L, 3.0), 1)
839 self.assertEqual(min(1L, 2.0, 3), 1L)
840 self.assertEqual(min(1.0, 2, 3L), 1.0)
841
842 self.assertRaises(TypeError, min)
843 self.assertRaises(TypeError, min, 42)
844 self.assertRaises(ValueError, min, ())
845 class BadSeq:
846 def __getitem__(self, index):
847 raise ValueError
848 self.assertRaises(ValueError, min, BadSeq())
849 class BadNumber:
850 def __cmp__(self, other):
851 raise ValueError
852 self.assertRaises(ValueError, min, (42, BadNumber()))
853
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000854 for stmt in (
855 "min(key=int)", # no args
856 "min(1, key=int)", # single arg not iterable
857 "min(1, 2, keystone=int)", # wrong keyword
858 "min(1, 2, key=int, abc=int)", # two many keywords
859 "min(1, 2, key=1)", # keyfunc is not callable
860 ):
Tim Peters7f061872004-12-07 21:17:46 +0000861 try:
862 exec(stmt) in globals()
863 except TypeError:
864 pass
865 else:
866 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000867
868 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
869 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
870 self.assertEqual(min(1, 2, key=neg), 2) # two elems
871
872 data = [random.randrange(200) for i in range(100)]
873 keys = dict((elem, random.randrange(50)) for elem in data)
874 f = keys.__getitem__
875 self.assertEqual(min(data, key=f),
876 sorted(data, key=f)[0])
877
Georg Brandl28e08732008-04-30 19:47:09 +0000878 def test_next(self):
879 it = iter(range(2))
880 self.assertEqual(next(it), 0)
881 self.assertEqual(next(it), 1)
882 self.assertRaises(StopIteration, next, it)
883 self.assertRaises(StopIteration, next, it)
Ezio Melotti2623a372010-11-21 13:34:58 +0000884 self.assertEqual(next(it, 42), 42)
Georg Brandl28e08732008-04-30 19:47:09 +0000885
886 class Iter(object):
887 def __iter__(self):
888 return self
889 def next(self):
890 raise StopIteration
891
892 it = iter(Iter())
Ezio Melotti2623a372010-11-21 13:34:58 +0000893 self.assertEqual(next(it, 42), 42)
Georg Brandl28e08732008-04-30 19:47:09 +0000894 self.assertRaises(StopIteration, next, it)
895
896 def gen():
897 yield 1
898 return
899
900 it = gen()
Ezio Melotti2623a372010-11-21 13:34:58 +0000901 self.assertEqual(next(it), 1)
Georg Brandl28e08732008-04-30 19:47:09 +0000902 self.assertRaises(StopIteration, next, it)
Ezio Melotti2623a372010-11-21 13:34:58 +0000903 self.assertEqual(next(it, 42), 42)
Georg Brandl28e08732008-04-30 19:47:09 +0000904
Walter Dörwald919497e2003-01-19 16:23:59 +0000905 def test_oct(self):
906 self.assertEqual(oct(100), '0144')
907 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000908 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000909 self.assertEqual(oct(-100L), '-0144L')
910 self.assertRaises(TypeError, oct, ())
911
912 def write_testfile(self):
913 # NB the first 4 lines are also used to test input and raw_input, below
914 fp = open(TESTFN, 'w')
915 try:
916 fp.write('1+1\n')
917 fp.write('1+1\n')
918 fp.write('The quick brown fox jumps over the lazy dog')
919 fp.write('.\n')
920 fp.write('Dear John\n')
921 fp.write('XXX'*100)
922 fp.write('YYY'*100)
923 finally:
924 fp.close()
925
926 def test_open(self):
927 self.write_testfile()
928 fp = open(TESTFN, 'r')
929 try:
930 self.assertEqual(fp.readline(4), '1+1\n')
931 self.assertEqual(fp.readline(4), '1+1\n')
932 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
933 self.assertEqual(fp.readline(4), 'Dear')
934 self.assertEqual(fp.readline(100), ' John\n')
935 self.assertEqual(fp.read(300), 'XXX'*100)
936 self.assertEqual(fp.read(1000), 'YYY'*100)
937 finally:
938 fp.close()
939 unlink(TESTFN)
940
941 def test_ord(self):
942 self.assertEqual(ord(' '), 32)
943 self.assertEqual(ord('A'), 65)
944 self.assertEqual(ord('a'), 97)
945 if have_unicode:
946 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
947 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000948 if have_unicode:
949 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000950
951 def test_pow(self):
952 self.assertEqual(pow(0,0), 1)
953 self.assertEqual(pow(0,1), 0)
954 self.assertEqual(pow(1,0), 1)
955 self.assertEqual(pow(1,1), 1)
956
957 self.assertEqual(pow(2,0), 1)
958 self.assertEqual(pow(2,10), 1024)
959 self.assertEqual(pow(2,20), 1024*1024)
960 self.assertEqual(pow(2,30), 1024*1024*1024)
961
962 self.assertEqual(pow(-2,0), 1)
963 self.assertEqual(pow(-2,1), -2)
964 self.assertEqual(pow(-2,2), 4)
965 self.assertEqual(pow(-2,3), -8)
966
967 self.assertEqual(pow(0L,0), 1)
968 self.assertEqual(pow(0L,1), 0)
969 self.assertEqual(pow(1L,0), 1)
970 self.assertEqual(pow(1L,1), 1)
971
972 self.assertEqual(pow(2L,0), 1)
973 self.assertEqual(pow(2L,10), 1024)
974 self.assertEqual(pow(2L,20), 1024*1024)
975 self.assertEqual(pow(2L,30), 1024*1024*1024)
976
977 self.assertEqual(pow(-2L,0), 1)
978 self.assertEqual(pow(-2L,1), -2)
979 self.assertEqual(pow(-2L,2), 4)
980 self.assertEqual(pow(-2L,3), -8)
981
982 self.assertAlmostEqual(pow(0.,0), 1.)
983 self.assertAlmostEqual(pow(0.,1), 0.)
984 self.assertAlmostEqual(pow(1.,0), 1.)
985 self.assertAlmostEqual(pow(1.,1), 1.)
986
987 self.assertAlmostEqual(pow(2.,0), 1.)
988 self.assertAlmostEqual(pow(2.,10), 1024.)
989 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
990 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
991
992 self.assertAlmostEqual(pow(-2.,0), 1.)
993 self.assertAlmostEqual(pow(-2.,1), -2.)
994 self.assertAlmostEqual(pow(-2.,2), 4.)
995 self.assertAlmostEqual(pow(-2.,3), -8.)
996
997 for x in 2, 2L, 2.0:
998 for y in 10, 10L, 10.0:
999 for z in 1000, 1000L, 1000.0:
1000 if isinstance(x, float) or \
1001 isinstance(y, float) or \
1002 isinstance(z, float):
1003 self.assertRaises(TypeError, pow, x, y, z)
1004 else:
1005 self.assertAlmostEqual(pow(x, y, z), 24.0)
1006
1007 self.assertRaises(TypeError, pow, -1, -2, 3)
1008 self.assertRaises(ValueError, pow, 1, 2, 0)
1009 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1010 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001011 # Will return complex in 3.0:
1012 self.assertRaises(ValueError, pow, -342.43, 0.234)
Walter Dörwald919497e2003-01-19 16:23:59 +00001013
1014 self.assertRaises(TypeError, pow)
1015
1016 def test_range(self):
1017 self.assertEqual(range(3), [0, 1, 2])
1018 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1019 self.assertEqual(range(0), [])
1020 self.assertEqual(range(-3), [])
1021 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1022 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1023
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001024 # Now test range() with longs
1025 self.assertEqual(range(-2**100), [])
1026 self.assertEqual(range(0, -2**100), [])
1027 self.assertEqual(range(0, 2**100, -1), [])
1028 self.assertEqual(range(0, 2**100, -1), [])
1029
1030 a = long(10 * sys.maxint)
1031 b = long(100 * sys.maxint)
1032 c = long(50 * sys.maxint)
1033
1034 self.assertEqual(range(a, a+2), [a, a+1])
1035 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1036 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1037
1038 seq = range(a, b, c)
Ezio Melottiaa980582010-01-23 23:04:36 +00001039 self.assertIn(a, seq)
1040 self.assertNotIn(b, seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001041 self.assertEqual(len(seq), 2)
1042
1043 seq = range(b, a, -c)
Ezio Melottiaa980582010-01-23 23:04:36 +00001044 self.assertIn(b, seq)
1045 self.assertNotIn(a, seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001046 self.assertEqual(len(seq), 2)
1047
1048 seq = range(-a, -b, -c)
Ezio Melottiaa980582010-01-23 23:04:36 +00001049 self.assertIn(-a, seq)
1050 self.assertNotIn(-b, seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001051 self.assertEqual(len(seq), 2)
1052
Walter Dörwald919497e2003-01-19 16:23:59 +00001053 self.assertRaises(TypeError, range)
1054 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1055 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001056 self.assertRaises(ValueError, range, a, a + 1, long(0))
1057
1058 class badzero(int):
1059 def __cmp__(self, other):
1060 raise RuntimeError
Nick Coghlan48361f52008-08-11 15:45:58 +00001061 __hash__ = None # Invalid cmp makes this unhashable
Neal Norwitzfcf44352005-11-27 20:37:43 +00001062 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001063
Mark Dickinson481ab892010-05-05 22:42:51 +00001064 # Reject floats.
1065 self.assertRaises(TypeError, range, 1., 1., 1.)
Tim Peters299b3df2003-04-15 14:40:03 +00001066 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001067
Walter Dörwald357981e2003-04-15 18:59:28 +00001068 self.assertRaises(TypeError, range, 0, "spam")
1069 self.assertRaises(TypeError, range, 0, 42, "spam")
1070
1071 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1072 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1073
Mark Dickinsona8d26682010-05-04 16:18:25 +00001074 bignum = 2*sys.maxint
1075 smallnum = 42
1076 # Old-style user-defined class with __int__ method
1077 class I0:
1078 def __init__(self, n):
1079 self.n = int(n)
1080 def __int__(self):
1081 return self.n
1082 self.assertEqual(range(I0(bignum), I0(bignum + 1)), [bignum])
1083 self.assertEqual(range(I0(smallnum), I0(smallnum + 1)), [smallnum])
1084
1085 # New-style user-defined class with __int__ method
1086 class I1(object):
1087 def __init__(self, n):
1088 self.n = int(n)
1089 def __int__(self):
1090 return self.n
1091 self.assertEqual(range(I1(bignum), I1(bignum + 1)), [bignum])
1092 self.assertEqual(range(I1(smallnum), I1(smallnum + 1)), [smallnum])
1093
1094 # New-style user-defined class with failing __int__ method
1095 class IX(object):
1096 def __int__(self):
1097 raise RuntimeError
1098 self.assertRaises(RuntimeError, range, IX())
1099
1100 # New-style user-defined class with invalid __int__ method
1101 class IN(object):
1102 def __int__(self):
1103 return "not a number"
1104 self.assertRaises(TypeError, range, IN())
1105
1106 # Exercise various combinations of bad arguments, to check
1107 # refcounting logic
1108 self.assertRaises(TypeError, range, 0.0)
1109
1110 self.assertRaises(TypeError, range, 0, 0.0)
1111 self.assertRaises(TypeError, range, 0.0, 0)
1112 self.assertRaises(TypeError, range, 0.0, 0.0)
1113
1114 self.assertRaises(TypeError, range, 0, 0, 1.0)
1115 self.assertRaises(TypeError, range, 0, 0.0, 1)
1116 self.assertRaises(TypeError, range, 0, 0.0, 1.0)
1117 self.assertRaises(TypeError, range, 0.0, 0, 1)
1118 self.assertRaises(TypeError, range, 0.0, 0, 1.0)
1119 self.assertRaises(TypeError, range, 0.0, 0.0, 1)
1120 self.assertRaises(TypeError, range, 0.0, 0.0, 1.0)
1121
1122
1123
Walter Dörwald919497e2003-01-19 16:23:59 +00001124 def test_input_and_raw_input(self):
1125 self.write_testfile()
1126 fp = open(TESTFN, 'r')
1127 savestdin = sys.stdin
1128 savestdout = sys.stdout # Eats the echo
1129 try:
1130 sys.stdin = fp
1131 sys.stdout = BitBucket()
1132 self.assertEqual(input(), 2)
1133 self.assertEqual(input('testing\n'), 2)
1134 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1135 self.assertEqual(raw_input('testing\n'), 'Dear John')
Tim Peters8e24a962006-08-09 00:52:26 +00001136
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001137 # SF 1535165: don't segfault on closed stdin
1138 # sys.stdout must be a regular file for triggering
1139 sys.stdout = savestdout
1140 sys.stdin.close()
Georg Brandld336e982006-08-06 09:17:16 +00001141 self.assertRaises(ValueError, input)
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001142
1143 sys.stdout = BitBucket()
Walter Dörwald919497e2003-01-19 16:23:59 +00001144 sys.stdin = cStringIO.StringIO("NULL\0")
1145 self.assertRaises(TypeError, input, 42, 42)
1146 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1147 self.assertEqual(input(), 'whitespace')
1148 sys.stdin = cStringIO.StringIO()
1149 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001150
1151 # SF 876178: make sure input() respect future options.
1152 sys.stdin = cStringIO.StringIO('1/2')
1153 sys.stdout = cStringIO.StringIO()
1154 exec compile('print input()', 'test_builtin_tmp', 'exec')
1155 sys.stdin.seek(0, 0)
1156 exec compile('from __future__ import division;print input()',
1157 'test_builtin_tmp', 'exec')
1158 sys.stdin.seek(0, 0)
1159 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001160 # The result we expect depends on whether new division semantics
1161 # are already in effect.
1162 if 1/2 == 0:
1163 # This test was compiled with old semantics.
1164 expected = ['0', '0.5', '0']
1165 else:
1166 # This test was compiled with new semantics (e.g., -Qnew
1167 # was given on the command line.
1168 expected = ['0.5', '0.5', '0.5']
1169 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001170
Walter Dörwald919497e2003-01-19 16:23:59 +00001171 del sys.stdout
1172 self.assertRaises(RuntimeError, input, 'prompt')
1173 del sys.stdin
1174 self.assertRaises(RuntimeError, input, 'prompt')
1175 finally:
1176 sys.stdin = savestdin
1177 sys.stdout = savestdout
1178 fp.close()
1179 unlink(TESTFN)
1180
1181 def test_reduce(self):
Mark Dickinson20665592010-05-25 19:01:08 +00001182 add = lambda x, y: x+y
1183 self.assertEqual(reduce(add, ['a', 'b', 'c'], ''), 'abc')
Walter Dörwald919497e2003-01-19 16:23:59 +00001184 self.assertEqual(
Mark Dickinson20665592010-05-25 19:01:08 +00001185 reduce(add, [['a', 'c'], [], ['d', 'w']], []),
Walter Dörwald919497e2003-01-19 16:23:59 +00001186 ['a','c','d','w']
1187 )
1188 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1189 self.assertEqual(
1190 reduce(lambda x, y: x*y, range(2,21), 1L),
1191 2432902008176640000L
1192 )
Mark Dickinson20665592010-05-25 19:01:08 +00001193 self.assertEqual(reduce(add, Squares(10)), 285)
1194 self.assertEqual(reduce(add, Squares(10), 0), 285)
1195 self.assertEqual(reduce(add, Squares(0), 0), 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001196 self.assertRaises(TypeError, reduce)
Mark Dickinson20665592010-05-25 19:01:08 +00001197 self.assertRaises(TypeError, reduce, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001198 self.assertRaises(TypeError, reduce, 42, 42)
1199 self.assertRaises(TypeError, reduce, 42, 42, 42)
Mark Dickinson20665592010-05-25 19:01:08 +00001200 self.assertRaises(TypeError, reduce, None, range(5))
1201 self.assertRaises(TypeError, reduce, add, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001202 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1203 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1204 self.assertRaises(TypeError, reduce, 42, (42, 42))
Mark Dickinson20665592010-05-25 19:01:08 +00001205 self.assertRaises(TypeError, reduce, add, []) # arg 2 must not be empty sequence with no initial value
1206 self.assertRaises(TypeError, reduce, add, "")
1207 self.assertRaises(TypeError, reduce, add, ())
1208 self.assertEqual(reduce(add, [], None), None)
1209 self.assertEqual(reduce(add, [], 42), 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001210
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
Mark Dickinson20665592010-05-25 19:01:08 +00001394 class C_get_vars(object):
1395 def getDict(self):
1396 return {'a':2}
1397 __dict__ = property(fget=getDict)
1398
Walter Dörwald919497e2003-01-19 16:23:59 +00001399 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001400 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001401 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001402 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001403 self.assertEqual(self.get_vars_f0(), {})
1404 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1405 self.assertRaises(TypeError, vars, 42, 42)
1406 self.assertRaises(TypeError, vars, 42)
Mark Dickinson20665592010-05-25 19:01:08 +00001407 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001408
1409 def test_zip(self):
1410 a = (1, 2, 3)
1411 b = (4, 5, 6)
1412 t = [(1, 4), (2, 5), (3, 6)]
1413 self.assertEqual(zip(a, b), t)
1414 b = [4, 5, 6]
1415 self.assertEqual(zip(a, b), t)
1416 b = (4, 5, 6, 7)
1417 self.assertEqual(zip(a, b), t)
1418 class I:
1419 def __getitem__(self, i):
1420 if i < 0 or i > 2: raise IndexError
1421 return i + 4
1422 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001423 self.assertEqual(zip(), [])
1424 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001425 self.assertRaises(TypeError, zip, None)
1426 class G:
1427 pass
1428 self.assertRaises(TypeError, zip, a, G())
1429
1430 # Make sure zip doesn't try to allocate a billion elements for the
1431 # result list when one of its arguments doesn't say how long it is.
1432 # A MemoryError is the most likely failure mode.
1433 class SequenceWithoutALength:
1434 def __getitem__(self, i):
1435 if i == 5:
1436 raise IndexError
1437 else:
1438 return i
1439 self.assertEqual(
1440 zip(SequenceWithoutALength(), xrange(2**30)),
1441 list(enumerate(range(5)))
1442 )
1443
1444 class BadSeq:
1445 def __getitem__(self, i):
1446 if i == 5:
1447 raise ValueError
1448 else:
1449 return i
1450 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1451
Eric Smitha9f7d622008-02-17 19:46:49 +00001452 def test_format(self):
1453 # Test the basic machinery of the format() builtin. Don't test
1454 # the specifics of the various formatters
1455 self.assertEqual(format(3, ''), '3')
1456
1457 # Returns some classes to use for various tests. There's
1458 # an old-style version, and a new-style version
1459 def classes_new():
1460 class A(object):
1461 def __init__(self, x):
1462 self.x = x
1463 def __format__(self, format_spec):
1464 return str(self.x) + format_spec
1465 class DerivedFromA(A):
1466 pass
1467
1468 class Simple(object): pass
1469 class DerivedFromSimple(Simple):
1470 def __init__(self, x):
1471 self.x = x
1472 def __format__(self, format_spec):
1473 return str(self.x) + format_spec
1474 class DerivedFromSimple2(DerivedFromSimple): pass
1475 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1476
1477 # In 3.0, classes_classic has the same meaning as classes_new
1478 def classes_classic():
1479 class A:
1480 def __init__(self, x):
1481 self.x = x
1482 def __format__(self, format_spec):
1483 return str(self.x) + format_spec
1484 class DerivedFromA(A):
1485 pass
1486
1487 class Simple: pass
1488 class DerivedFromSimple(Simple):
1489 def __init__(self, x):
1490 self.x = x
1491 def __format__(self, format_spec):
1492 return str(self.x) + format_spec
1493 class DerivedFromSimple2(DerivedFromSimple): pass
1494 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1495
1496 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1497 self.assertEqual(format(A(3), 'spec'), '3spec')
1498 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1499 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1500 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1501 '10abcdef')
1502
1503 class_test(*classes_new())
1504 class_test(*classes_classic())
1505
1506 def empty_format_spec(value):
1507 # test that:
1508 # format(x, '') == str(x)
1509 # format(x) == str(x)
1510 self.assertEqual(format(value, ""), str(value))
1511 self.assertEqual(format(value), str(value))
1512
1513 # for builtin types, format(x, "") == str(x)
1514 empty_format_spec(17**13)
1515 empty_format_spec(1.0)
1516 empty_format_spec(3.1415e104)
1517 empty_format_spec(-3.1415e104)
1518 empty_format_spec(3.1415e-104)
1519 empty_format_spec(-3.1415e-104)
1520 empty_format_spec(object)
1521 empty_format_spec(None)
1522
1523 # TypeError because self.__format__ returns the wrong type
1524 class BadFormatResult:
1525 def __format__(self, format_spec):
1526 return 1.0
1527 self.assertRaises(TypeError, format, BadFormatResult(), "")
1528
1529 # TypeError because format_spec is not unicode or str
1530 self.assertRaises(TypeError, format, object(), 4)
1531 self.assertRaises(TypeError, format, object(), object())
1532
1533 # tests for object.__format__ really belong elsewhere, but
1534 # there's no good place to put them
1535 x = object().__format__('')
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001536 self.assertTrue(x.startswith('<object object at'))
Eric Smitha9f7d622008-02-17 19:46:49 +00001537
1538 # first argument to object.__format__ must be string
1539 self.assertRaises(TypeError, object().__format__, 3)
1540 self.assertRaises(TypeError, object().__format__, object())
1541 self.assertRaises(TypeError, object().__format__, None)
1542
Eric Smithd44b2fc2010-04-02 12:30:56 +00001543 # --------------------------------------------------------------------
1544 # Issue #7994: object.__format__ with a non-empty format string is
1545 # pending deprecated
1546 def test_deprecated_format_string(obj, fmt_str, should_raise_warning):
1547 with warnings.catch_warnings(record=True) as w:
1548 warnings.simplefilter("always", PendingDeprecationWarning)
1549 format(obj, fmt_str)
1550 if should_raise_warning:
1551 self.assertEqual(len(w), 1)
1552 self.assertIsInstance(w[0].message, PendingDeprecationWarning)
1553 self.assertIn('object.__format__ with a non-empty format '
1554 'string', str(w[0].message))
1555 else:
1556 self.assertEqual(len(w), 0)
1557
1558 fmt_strs = ['', 's', u'', u's']
1559
1560 class A:
1561 def __format__(self, fmt_str):
1562 return format('', fmt_str)
1563
1564 for fmt_str in fmt_strs:
1565 test_deprecated_format_string(A(), fmt_str, False)
1566
1567 class B:
1568 pass
1569
1570 class C(object):
1571 pass
1572
1573 for cls in [object, B, C]:
1574 for fmt_str in fmt_strs:
1575 test_deprecated_format_string(cls(), fmt_str, len(fmt_str) != 0)
1576 # --------------------------------------------------------------------
1577
Eric Smitha9f7d622008-02-17 19:46:49 +00001578 # make sure we can take a subclass of str as a format spec
1579 class DerivedFromStr(str): pass
1580 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1581
Eric Smithfb0742f2008-02-22 17:43:17 +00001582 def test_bin(self):
1583 self.assertEqual(bin(0), '0b0')
1584 self.assertEqual(bin(1), '0b1')
1585 self.assertEqual(bin(-1), '-0b1')
1586 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1587 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1588 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1589 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1590
Georg Brandlec812ca2009-07-22 11:57:15 +00001591 def test_bytearray_translate(self):
1592 x = bytearray("abc")
1593 self.assertRaises(ValueError, x.translate, "1", 1)
1594 self.assertRaises(TypeError, x.translate, "1"*256, 1)
1595
Zachary Ware1f702212013-12-10 14:09:20 -06001596class TestExecFile(unittest.TestCase):
1597 # Done outside of the method test_z to get the correct scope
1598 z = 0
1599 f = open(TESTFN, 'w')
1600 f.write('z = z+1\n')
1601 f.write('z = z*2\n')
1602 f.close()
1603 with check_py3k_warnings(("execfile.. not supported in 3.x",
1604 DeprecationWarning)):
1605 execfile(TESTFN)
1606
1607 def test_execfile(self):
1608 globals = {'a': 1, 'b': 2}
1609 locals = {'b': 200, 'c': 300}
1610
1611 self.assertEqual(self.__class__.z, 2)
1612 globals['z'] = 0
1613 execfile(TESTFN, globals)
1614 self.assertEqual(globals['z'], 2)
1615 locals['z'] = 0
1616 execfile(TESTFN, globals, locals)
1617 self.assertEqual(locals['z'], 2)
1618
1619 class M:
1620 "Test mapping interface versus possible calls from execfile()."
1621 def __init__(self):
1622 self.z = 10
1623 def __getitem__(self, key):
1624 if key == 'z':
1625 return self.z
1626 raise KeyError
1627 def __setitem__(self, key, value):
1628 if key == 'z':
1629 self.z = value
1630 return
1631 raise KeyError
1632
1633 locals = M()
1634 locals['z'] = 0
1635 execfile(TESTFN, globals, locals)
1636 self.assertEqual(locals['z'], 2)
1637
1638 unlink(TESTFN)
1639 self.assertRaises(TypeError, execfile)
1640 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
1641 import os
1642 self.assertRaises(IOError, execfile, os.curdir)
1643 self.assertRaises(IOError, execfile, "I_dont_exist")
1644
1645
Eric Smithce584d42008-02-21 20:17:08 +00001646class TestSorted(unittest.TestCase):
1647
1648 def test_basic(self):
1649 data = range(100)
1650 copy = data[:]
1651 random.shuffle(copy)
1652 self.assertEqual(data, sorted(copy))
1653 self.assertNotEqual(data, copy)
1654
1655 data.reverse()
1656 random.shuffle(copy)
1657 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1658 self.assertNotEqual(data, copy)
1659 random.shuffle(copy)
1660 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1661 self.assertNotEqual(data, copy)
1662 random.shuffle(copy)
1663 self.assertEqual(data, sorted(copy, reverse=1))
1664 self.assertNotEqual(data, copy)
1665
1666 def test_inputtypes(self):
1667 s = 'abracadabra'
1668 types = [list, tuple]
1669 if have_unicode:
1670 types.insert(0, unicode)
1671 for T in types:
1672 self.assertEqual(sorted(s), sorted(T(s)))
1673
1674 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
1675 types = [set, frozenset, list, tuple, dict.fromkeys]
1676 if have_unicode:
1677 types.insert(0, unicode)
1678 for T in types:
1679 self.assertEqual(sorted(s), sorted(T(s)))
1680
1681 def test_baddecorator(self):
1682 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1683 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1684
Florent Xicluna07627882010-03-21 01:14:24 +00001685def _run_unittest(*args):
1686 with check_py3k_warnings(
1687 (".+ not supported in 3.x", DeprecationWarning),
1688 (".+ is renamed to imp.reload", DeprecationWarning),
1689 ("classic int division", DeprecationWarning)):
1690 run_unittest(*args)
1691
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001692def test_main(verbose=None):
Zachary Ware1f702212013-12-10 14:09:20 -06001693 global numruns
1694 if not numruns:
1695 with check_py3k_warnings(
1696 (".+ not supported in 3.x", DeprecationWarning)):
1697 run_unittest(TestExecFile)
1698 numruns += 1
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001699 test_classes = (BuiltinTest, TestSorted)
1700
Florent Xicluna07627882010-03-21 01:14:24 +00001701 _run_unittest(*test_classes)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001702
1703 # verify reference counting
1704 if verbose and hasattr(sys, "gettotalrefcount"):
1705 import gc
1706 counts = [None] * 5
1707 for i in xrange(len(counts)):
Florent Xicluna07627882010-03-21 01:14:24 +00001708 _run_unittest(*test_classes)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001709 gc.collect()
1710 counts[i] = sys.gettotalrefcount()
1711 print counts
1712
Walter Dörwald919497e2003-01-19 16:23:59 +00001713
1714if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001715 test_main(verbose=True)