blob: 28ff74c204a80c89986556eb4f84ab1b3b8ceb5b [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
113 S = [50, 60]
114 self.assertEqual(all(x > 42 for x in S), True)
115 S = [50, 40, 60]
116 self.assertEqual(all(x > 42 for x in S), False)
117
118 def test_any(self):
119 self.assertEqual(any([None, None, None]), False)
120 self.assertEqual(any([None, 4, None]), True)
121 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray9b3085c2013-02-06 10:06:10 -0500122 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000123 self.assertRaises(TypeError, any, 10) # Non-iterable
124 self.assertRaises(TypeError, any) # No args
125 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
126 self.assertEqual(any([]), False) # Empty iterator
127 S = [40, 60, 30]
128 self.assertEqual(any(x > 42 for x in S), True)
129 S = [10, 20, 30]
130 self.assertEqual(any(x > 42 for x in S), False)
131
Armin Rigo7ccbca92006-10-04 12:17:45 +0000132 def test_neg(self):
133 x = -sys.maxint-1
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000134 self.assertTrue(isinstance(x, int))
Armin Rigo7ccbca92006-10-04 12:17:45 +0000135 self.assertEqual(-x, sys.maxint+1)
136
Walter Dörwald919497e2003-01-19 16:23:59 +0000137 def test_apply(self):
138 def f0(*args):
139 self.assertEqual(args, ())
140 def f1(a1):
141 self.assertEqual(a1, 1)
142 def f2(a1, a2):
143 self.assertEqual(a1, 1)
144 self.assertEqual(a2, 2)
145 def f3(a1, a2, a3):
146 self.assertEqual(a1, 1)
147 self.assertEqual(a2, 2)
148 self.assertEqual(a3, 3)
149 apply(f0, ())
150 apply(f1, (1,))
151 apply(f2, (1, 2))
152 apply(f3, (1, 2, 3))
153
154 # A PyCFunction that takes only positional parameters should allow an
155 # empty keyword dictionary to pass without a complaint, but raise a
156 # TypeError if the dictionary is non-empty.
157 apply(id, (1,), {})
158 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
159 self.assertRaises(TypeError, apply)
160 self.assertRaises(TypeError, apply, id, 42)
161 self.assertRaises(TypeError, apply, id, (42,), 42)
162
163 def test_callable(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000164 self.assertTrue(callable(len))
Mark Dickinson20665592010-05-25 19:01:08 +0000165 self.assertFalse(callable("a"))
166 self.assertTrue(callable(callable))
167 self.assertTrue(callable(lambda x, y: x + y))
168 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000169 def f(): pass
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000170 self.assertTrue(callable(f))
Mark Dickinson20665592010-05-25 19:01:08 +0000171
172 class Classic:
Walter Dörwald919497e2003-01-19 16:23:59 +0000173 def meth(self): pass
Mark Dickinson20665592010-05-25 19:01:08 +0000174 self.assertTrue(callable(Classic))
175 c = Classic()
176 self.assertTrue(callable(c.meth))
177 self.assertFalse(callable(c))
178
179 class NewStyle(object):
180 def meth(self): pass
181 self.assertTrue(callable(NewStyle))
182 n = NewStyle()
183 self.assertTrue(callable(n.meth))
184 self.assertFalse(callable(n))
185
186 # Classic and new-style classes evaluate __call__() differently
187 c.__call__ = None
188 self.assertTrue(callable(c))
189 del c.__call__
190 self.assertFalse(callable(c))
191 n.__call__ = None
192 self.assertFalse(callable(n))
193 del n.__call__
194 self.assertFalse(callable(n))
195
196 class N2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000197 def __call__(self): pass
Mark Dickinson20665592010-05-25 19:01:08 +0000198 n2 = N2()
199 self.assertTrue(callable(n2))
200 class N3(N2): pass
201 n3 = N3()
202 self.assertTrue(callable(n3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000203
204 def test_chr(self):
205 self.assertEqual(chr(32), ' ')
206 self.assertEqual(chr(65), 'A')
207 self.assertEqual(chr(97), 'a')
208 self.assertEqual(chr(0xff), '\xff')
209 self.assertRaises(ValueError, chr, 256)
210 self.assertRaises(TypeError, chr)
211
212 def test_cmp(self):
213 self.assertEqual(cmp(-1, 1), -1)
214 self.assertEqual(cmp(1, -1), 1)
215 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000216 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000217 a = []; a.append(a)
218 b = []; b.append(b)
219 from UserList import UserList
220 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000221 self.assertRaises(RuntimeError, cmp, a, b)
222 self.assertRaises(RuntimeError, cmp, b, c)
223 self.assertRaises(RuntimeError, cmp, c, a)
224 self.assertRaises(RuntimeError, cmp, a, c)
225 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000226 a.pop(); b.pop(); c.pop()
227 self.assertRaises(TypeError, cmp)
228
229 def test_coerce(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000230 self.assertTrue(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000231 self.assertEqual(coerce(1, 1L), (1L, 1L))
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000232 self.assertTrue(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000233 self.assertRaises(TypeError, coerce)
234 class BadNumber:
235 def __coerce__(self, other):
236 raise ValueError
237 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000238 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000239
240 def test_compile(self):
241 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000242 bom = '\xef\xbb\xbf'
243 compile(bom + 'print 1\n', '', 'exec')
Georg Brandl5240d742007-03-13 20:46:32 +0000244 compile(source='pass', filename='?', mode='exec')
245 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
246 compile('pass', '?', dont_inherit=1, mode='exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000247 self.assertRaises(TypeError, compile)
248 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
249 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000250 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Georg Brandl5240d742007-03-13 20:46:32 +0000251 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
252 mode='eval', source='0', filename='tmp')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000253 if have_unicode:
254 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000255 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
256 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000257
Georg Brandl5240d742007-03-13 20:46:32 +0000258
Walter Dörwald919497e2003-01-19 16:23:59 +0000259 def test_delattr(self):
260 import sys
261 sys.spam = 1
262 delattr(sys, 'spam')
263 self.assertRaises(TypeError, delattr)
264
265 def test_dir(self):
Georg Brandl871f1bc2007-03-12 13:17:36 +0000266 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000267 self.assertRaises(TypeError, dir, 42, 42)
268
Georg Brandl871f1bc2007-03-12 13:17:36 +0000269 # dir() - local scope
270 local_var = 1
Ezio Melottiaa980582010-01-23 23:04:36 +0000271 self.assertIn('local_var', dir())
Georg Brandl871f1bc2007-03-12 13:17:36 +0000272
273 # dir(module)
274 import sys
Ezio Melottiaa980582010-01-23 23:04:36 +0000275 self.assertIn('exit', dir(sys))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000276
277 # dir(module_with_invalid__dict__)
278 import types
279 class Foo(types.ModuleType):
280 __dict__ = 8
281 f = Foo("foo")
282 self.assertRaises(TypeError, dir, f)
283
284 # dir(type)
Ezio Melottiaa980582010-01-23 23:04:36 +0000285 self.assertIn("strip", dir(str))
286 self.assertNotIn("__mro__", dir(str))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000287
288 # dir(obj)
289 class Foo(object):
290 def __init__(self):
291 self.x = 7
292 self.y = 8
293 self.z = 9
294 f = Foo()
Ezio Melottiaa980582010-01-23 23:04:36 +0000295 self.assertIn("y", dir(f))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000296
297 # dir(obj_no__dict__)
298 class Foo(object):
299 __slots__ = []
300 f = Foo()
Ezio Melottiaa980582010-01-23 23:04:36 +0000301 self.assertIn("__repr__", dir(f))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000302
303 # dir(obj_no__class__with__dict__)
304 # (an ugly trick to cause getattr(f, "__class__") to fail)
305 class Foo(object):
306 __slots__ = ["__class__", "__dict__"]
307 def __init__(self):
308 self.bar = "wow"
309 f = Foo()
Ezio Melottiaa980582010-01-23 23:04:36 +0000310 self.assertNotIn("__repr__", dir(f))
311 self.assertIn("bar", dir(f))
Georg Brandl871f1bc2007-03-12 13:17:36 +0000312
313 # dir(obj_using __dir__)
314 class Foo(object):
315 def __dir__(self):
316 return ["kan", "ga", "roo"]
317 f = Foo()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000318 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandl871f1bc2007-03-12 13:17:36 +0000319
320 # dir(obj__dir__not_list)
321 class Foo(object):
322 def __dir__(self):
323 return 7
324 f = Foo()
325 self.assertRaises(TypeError, dir, f)
326
Walter Dörwald919497e2003-01-19 16:23:59 +0000327 def test_divmod(self):
328 self.assertEqual(divmod(12, 7), (1, 5))
329 self.assertEqual(divmod(-12, 7), (-2, 2))
330 self.assertEqual(divmod(12, -7), (-2, -2))
331 self.assertEqual(divmod(-12, -7), (1, -5))
332
333 self.assertEqual(divmod(12L, 7L), (1L, 5L))
334 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
335 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
336 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
337
338 self.assertEqual(divmod(12, 7L), (1, 5L))
339 self.assertEqual(divmod(-12, 7L), (-2, 2L))
340 self.assertEqual(divmod(12L, -7), (-2L, -2))
341 self.assertEqual(divmod(-12L, -7), (1L, -5))
342
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000343 self.assertEqual(divmod(-sys.maxint-1, -1),
344 (sys.maxint+1, 0))
345
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000346 self.assertTrue(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
347 self.assertTrue(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
348 self.assertTrue(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
349 self.assertTrue(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000350
351 self.assertRaises(TypeError, divmod)
352
353 def test_eval(self):
354 self.assertEqual(eval('1+1'), 2)
355 self.assertEqual(eval(' 1+1\n'), 2)
356 globals = {'a': 1, 'b': 2}
357 locals = {'b': 200, 'c': 300}
358 self.assertEqual(eval('a', globals) , 1)
359 self.assertEqual(eval('a', globals, locals), 1)
360 self.assertEqual(eval('b', globals, locals), 200)
361 self.assertEqual(eval('c', globals, locals), 300)
362 if have_unicode:
363 self.assertEqual(eval(unicode('1+1')), 2)
364 self.assertEqual(eval(unicode(' 1+1\n')), 2)
365 globals = {'a': 1, 'b': 2}
366 locals = {'b': 200, 'c': 300}
367 if have_unicode:
368 self.assertEqual(eval(unicode('a'), globals), 1)
369 self.assertEqual(eval(unicode('a'), globals, locals), 1)
370 self.assertEqual(eval(unicode('b'), globals, locals), 200)
371 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000372 bom = '\xef\xbb\xbf'
373 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000374 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
375 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000376 self.assertRaises(TypeError, eval)
377 self.assertRaises(TypeError, eval, ())
378
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000379 def test_general_eval(self):
380 # Tests that general mappings can be used for the locals argument
381
382 class M:
383 "Test mapping interface versus possible calls from eval()."
384 def __getitem__(self, key):
385 if key == 'a':
386 return 12
387 raise KeyError
388 def keys(self):
389 return list('xyz')
390
391 m = M()
392 g = globals()
393 self.assertEqual(eval('a', g, m), 12)
394 self.assertRaises(NameError, eval, 'b', g, m)
395 self.assertEqual(eval('dir()', g, m), list('xyz'))
396 self.assertEqual(eval('globals()', g, m), g)
397 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000398 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000399 class A:
400 "Non-mapping"
401 pass
402 m = A()
403 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000404
405 # Verify that dict subclasses work as well
406 class D(dict):
407 def __getitem__(self, key):
408 if key == 'a':
409 return 12
410 return dict.__getitem__(self, key)
411 def keys(self):
412 return list('xyz')
413
414 d = D()
415 self.assertEqual(eval('a', g, d), 12)
416 self.assertRaises(NameError, eval, 'b', g, d)
417 self.assertEqual(eval('dir()', g, d), list('xyz'))
418 self.assertEqual(eval('globals()', g, d), g)
419 self.assertEqual(eval('locals()', g, d), d)
420
421 # Verify locals stores (used by list comps)
422 eval('[locals() for i in (2,3)]', g, d)
423 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
424
425 class SpreadSheet:
426 "Sample application showing nested, calculated lookups."
427 _cells = {}
428 def __setitem__(self, key, formula):
429 self._cells[key] = formula
Martin Blais215f13d2006-06-06 12:46:55 +0000430 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000431 return eval(self._cells[key], globals(), self)
432
433 ss = SpreadSheet()
434 ss['a1'] = '5'
435 ss['a2'] = 'a1*6'
436 ss['a3'] = 'a2*7'
437 self.assertEqual(ss['a3'], 210)
438
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000439 # Verify that dir() catches a non-list returned by eval
440 # SF bug #1004669
441 class C:
442 def __getitem__(self, item):
443 raise KeyError(item)
444 def keys(self):
445 return 'a'
446 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
447
Walter Dörwald919497e2003-01-19 16:23:59 +0000448 # Done outside of the method test_z to get the correct scope
449 z = 0
450 f = open(TESTFN, 'w')
451 f.write('z = z+1\n')
452 f.write('z = z*2\n')
453 f.close()
Florent Xicluna07627882010-03-21 01:14:24 +0000454 with check_py3k_warnings(("execfile.. not supported in 3.x",
455 DeprecationWarning)):
456 execfile(TESTFN)
Walter Dörwald919497e2003-01-19 16:23:59 +0000457
458 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000459 global numruns
460 if numruns:
461 return
462 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000463
Walter Dörwald919497e2003-01-19 16:23:59 +0000464 globals = {'a': 1, 'b': 2}
465 locals = {'b': 200, 'c': 300}
466
467 self.assertEqual(self.__class__.z, 2)
468 globals['z'] = 0
469 execfile(TESTFN, globals)
470 self.assertEqual(globals['z'], 2)
471 locals['z'] = 0
472 execfile(TESTFN, globals, locals)
473 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000474
475 class M:
476 "Test mapping interface versus possible calls from execfile()."
477 def __init__(self):
478 self.z = 10
479 def __getitem__(self, key):
480 if key == 'z':
481 return self.z
482 raise KeyError
483 def __setitem__(self, key, value):
484 if key == 'z':
485 self.z = value
486 return
487 raise KeyError
488
489 locals = M()
490 locals['z'] = 0
491 execfile(TESTFN, globals, locals)
492 self.assertEqual(locals['z'], 2)
493
Walter Dörwald919497e2003-01-19 16:23:59 +0000494 unlink(TESTFN)
495 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000496 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000497 import os
498 self.assertRaises(IOError, execfile, os.curdir)
499 self.assertRaises(IOError, execfile, "I_dont_exist")
500
501 def test_filter(self):
502 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
503 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
504 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
505 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
506 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
507 def identity(item):
508 return 1
509 filter(identity, Squares(5))
510 self.assertRaises(TypeError, filter)
511 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000512 def __getitem__(self, index):
513 if index<4:
514 return 42
515 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000516 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
517 def badfunc():
518 pass
519 self.assertRaises(TypeError, filter, badfunc, range(5))
520
Walter Dörwaldbf517072003-01-27 15:57:14 +0000521 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000522 self.assertEqual(filter(None, (1, 2)), (1, 2))
523 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
524 self.assertRaises(TypeError, filter, 42, (1, 2))
525
Walter Dörwaldbf517072003-01-27 15:57:14 +0000526 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000527 self.assertEqual(filter(None, "12"), "12")
528 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
529 self.assertRaises(TypeError, filter, 42, "12")
530 class badstr(str):
531 def __getitem__(self, index):
532 raise ValueError
533 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000534
Walter Dörwald903f1e02003-02-04 16:28:00 +0000535 class badstr2(str):
536 def __getitem__(self, index):
537 return 42
538 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
539
540 class weirdstr(str):
541 def __getitem__(self, index):
542 return weirdstr(2*str.__getitem__(self, index))
543 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
544
Walter Dörwald5e61e242003-02-04 17:04:01 +0000545 class shiftstr(str):
546 def __getitem__(self, index):
547 return chr(ord(str.__getitem__(self, index))+1)
548 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
549
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000550 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000551 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000552 self.assertEqual(filter(None, unicode("12")), unicode("12"))
553 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
554 self.assertRaises(TypeError, filter, 42, unicode("12"))
555 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000556
Walter Dörwald903f1e02003-02-04 16:28:00 +0000557 class badunicode(unicode):
558 def __getitem__(self, index):
559 return 42
560 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
561
562 class weirdunicode(unicode):
563 def __getitem__(self, index):
564 return weirdunicode(2*unicode.__getitem__(self, index))
565 self.assertEqual(
566 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
567
Walter Dörwald5e61e242003-02-04 17:04:01 +0000568 class shiftunicode(unicode):
569 def __getitem__(self, index):
570 return unichr(ord(unicode.__getitem__(self, index))+1)
571 self.assertEqual(
572 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
573 unicode("345")
574 )
575
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000576 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000577 # test that filter() never returns tuple, str or unicode subclasses
578 # and that the result always goes through __getitem__
579 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000580 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000581 def __getitem__(self, index):
582 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000583 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000584 def __getitem__(self, index):
585 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000586 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000587 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000588 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000589 }
590 if have_unicode:
591 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000592 def __getitem__(self, index):
593 return 2*unicode.__getitem__(self, index)
594 inputs[unicode2] = {
595 unicode(): unicode(),
596 unicode("123"): unicode("112233")
597 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000598
Walter Dörwald1918f772003-02-10 13:19:13 +0000599 for (cls, inps) in inputs.iteritems():
600 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000601 # make sure the output goes through __getitem__
602 # even if func is None
603 self.assertEqual(
604 filter(funcs[0], cls(inp)),
605 filter(funcs[1], cls(inp))
606 )
607 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000608 outp = filter(func, cls(inp))
609 self.assertEqual(outp, exp)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000610 self.assertTrue(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000611
Walter Dörwald919497e2003-01-19 16:23:59 +0000612 def test_getattr(self):
613 import sys
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000614 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000615 self.assertRaises(TypeError, getattr, sys, 1)
616 self.assertRaises(TypeError, getattr, sys, 1, "foo")
617 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000618 if have_unicode:
619 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000620
621 def test_hasattr(self):
622 import sys
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000623 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000624 self.assertRaises(TypeError, hasattr, sys, 1)
625 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000626 if have_unicode:
627 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000628
Benjamin Petersonb9030f42008-05-12 00:41:23 +0000629 # Check that hasattr allows SystemExit and KeyboardInterrupts by
630 class A:
631 def __getattr__(self, what):
632 raise KeyboardInterrupt
633 self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
634 class B:
635 def __getattr__(self, what):
636 raise SystemExit
637 self.assertRaises(SystemExit, hasattr, B(), "b")
638
Walter Dörwald919497e2003-01-19 16:23:59 +0000639 def test_hash(self):
640 hash(None)
641 self.assertEqual(hash(1), hash(1L))
642 self.assertEqual(hash(1), hash(1.0))
643 hash('spam')
644 if have_unicode:
645 self.assertEqual(hash('spam'), hash(unicode('spam')))
646 hash((0,1,2,3))
647 def f(): pass
648 self.assertRaises(TypeError, hash, [])
649 self.assertRaises(TypeError, hash, {})
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000650 # Bug 1536021: Allow hash to return long objects
651 class X:
652 def __hash__(self):
653 return 2**100
Ezio Melotti2623a372010-11-21 13:34:58 +0000654 self.assertEqual(type(hash(X())), int)
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000655 class Y(object):
656 def __hash__(self):
657 return 2**100
Ezio Melotti2623a372010-11-21 13:34:58 +0000658 self.assertEqual(type(hash(Y())), int)
Armin Rigo51fc8c42006-08-09 14:55:26 +0000659 class Z(long):
660 def __hash__(self):
661 return self
Ezio Melotti2623a372010-11-21 13:34:58 +0000662 self.assertEqual(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000663
664 def test_hex(self):
665 self.assertEqual(hex(16), '0x10')
666 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000667 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000668 self.assertEqual(hex(-16L), '-0x10L')
669 self.assertRaises(TypeError, hex, {})
670
671 def test_id(self):
672 id(None)
673 id(1)
674 id(1L)
675 id(1.0)
676 id('spam')
677 id((0,1,2,3))
678 id([0,1,2,3])
679 id({'spam': 1, 'eggs': 2, 'ham': 3})
680
681 # Test input() later, together with raw_input
682
Andrew Svetlovcddcafa2012-12-23 12:44:04 +0200683 # test_int(): see test_int.py for int() tests.
684
Walter Dörwald919497e2003-01-19 16:23:59 +0000685 def test_intern(self):
686 self.assertRaises(TypeError, intern)
Georg Brandl4e1be942009-10-27 22:56:09 +0000687 # This fails if the test is run twice with a constant string,
688 # therefore append the run counter
689 s = "never interned before " + str(numruns)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000690 self.assertTrue(intern(s) is s)
Walter Dörwald919497e2003-01-19 16:23:59 +0000691 s2 = s.swapcase().swapcase()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000692 self.assertTrue(intern(s2) is s)
Walter Dörwald919497e2003-01-19 16:23:59 +0000693
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000694 # Subclasses of string can't be interned, because they
695 # provide too much opportunity for insane things to happen.
696 # We don't want them in the interned dict and if they aren't
697 # actually interned, we don't want to create the appearance
Ezio Melottic2077b02011-03-16 12:34:31 +0200698 # that they are by allowing intern() to succeed.
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000699 class S(str):
700 def __hash__(self):
701 return 123
702
703 self.assertRaises(TypeError, intern, S("abc"))
704
705 # It's still safe to pass these strings to routines that
706 # call intern internally, e.g. PyObject_SetAttr().
707 s = S("abc")
708 setattr(s, s, s)
709 self.assertEqual(getattr(s, s), s)
710
Walter Dörwald919497e2003-01-19 16:23:59 +0000711 def test_iter(self):
712 self.assertRaises(TypeError, iter)
713 self.assertRaises(TypeError, iter, 42, 42)
714 lists = [("1", "2"), ["1", "2"], "12"]
715 if have_unicode:
716 lists.append(unicode("12"))
717 for l in lists:
718 i = iter(l)
719 self.assertEqual(i.next(), '1')
720 self.assertEqual(i.next(), '2')
721 self.assertRaises(StopIteration, i.next)
722
723 def test_isinstance(self):
724 class C:
725 pass
726 class D(C):
727 pass
728 class E:
729 pass
730 c = C()
731 d = D()
732 e = E()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000733 self.assertTrue(isinstance(c, C))
734 self.assertTrue(isinstance(d, C))
735 self.assertTrue(not isinstance(e, C))
736 self.assertTrue(not isinstance(c, D))
737 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000738 self.assertRaises(TypeError, isinstance, E, 'foo')
739 self.assertRaises(TypeError, isinstance)
740
741 def test_issubclass(self):
742 class C:
743 pass
744 class D(C):
745 pass
746 class E:
747 pass
748 c = C()
749 d = D()
750 e = E()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000751 self.assertTrue(issubclass(D, C))
752 self.assertTrue(issubclass(C, C))
753 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000754 self.assertRaises(TypeError, issubclass, 'foo', E)
755 self.assertRaises(TypeError, issubclass, E, 'foo')
756 self.assertRaises(TypeError, issubclass)
757
758 def test_len(self):
759 self.assertEqual(len('123'), 3)
760 self.assertEqual(len(()), 0)
761 self.assertEqual(len((1, 2, 3, 4)), 4)
762 self.assertEqual(len([1, 2, 3, 4]), 4)
763 self.assertEqual(len({}), 0)
764 self.assertEqual(len({'a':1, 'b': 2}), 2)
765 class BadSeq:
766 def __len__(self):
767 raise ValueError
768 self.assertRaises(ValueError, len, BadSeq())
Mark Dickinson20665592010-05-25 19:01:08 +0000769 self.assertRaises(TypeError, len, 2)
770 class ClassicStyle: pass
771 class NewStyle(object): pass
772 self.assertRaises(AttributeError, len, ClassicStyle())
773 self.assertRaises(TypeError, len, NewStyle())
Walter Dörwald919497e2003-01-19 16:23:59 +0000774
Walter Dörwald919497e2003-01-19 16:23:59 +0000775 def test_map(self):
776 self.assertEqual(
777 map(None, 'hello world'),
778 ['h','e','l','l','o',' ','w','o','r','l','d']
779 )
780 self.assertEqual(
781 map(None, 'abcd', 'efg'),
782 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
783 )
784 self.assertEqual(
785 map(None, range(10)),
786 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
787 )
788 self.assertEqual(
789 map(lambda x: x*x, range(1,4)),
790 [1, 4, 9]
791 )
792 try:
793 from math import sqrt
794 except ImportError:
795 def sqrt(x):
796 return pow(x, 0.5)
797 self.assertEqual(
798 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
799 [[4.0, 2.0], [9.0, 3.0]]
800 )
801 self.assertEqual(
802 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
803 [10, 4, 6]
804 )
805
806 def plus(*v):
807 accu = 0
808 for i in v: accu = accu + i
809 return accu
810 self.assertEqual(
811 map(plus, [1, 3, 7]),
812 [1, 3, 7]
813 )
814 self.assertEqual(
815 map(plus, [1, 3, 7], [4, 9, 2]),
816 [1+4, 3+9, 7+2]
817 )
818 self.assertEqual(
819 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
820 [1+4+1, 3+9+1, 7+2+0]
821 )
822 self.assertEqual(
823 map(None, Squares(10)),
824 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
825 )
826 self.assertEqual(
827 map(int, Squares(10)),
828 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
829 )
830 self.assertEqual(
831 map(None, Squares(3), Squares(2)),
832 [(0,0), (1,1), (4,None)]
833 )
834 self.assertEqual(
835 map(max, Squares(3), Squares(2)),
836 [0, 1, 4]
837 )
838 self.assertRaises(TypeError, map)
839 self.assertRaises(TypeError, map, lambda x: x, 42)
840 self.assertEqual(map(None, [42]), [42])
841 class BadSeq:
842 def __getitem__(self, index):
843 raise ValueError
844 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +0000845 def badfunc(x):
846 raise RuntimeError
847 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000848
849 def test_max(self):
850 self.assertEqual(max('123123'), '3')
851 self.assertEqual(max(1, 2, 3), 3)
852 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
853 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
854
855 self.assertEqual(max(1, 2L, 3.0), 3.0)
856 self.assertEqual(max(1L, 2.0, 3), 3)
857 self.assertEqual(max(1.0, 2, 3L), 3L)
858
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000859 for stmt in (
860 "max(key=int)", # no args
861 "max(1, key=int)", # single arg not iterable
862 "max(1, 2, keystone=int)", # wrong keyword
863 "max(1, 2, key=int, abc=int)", # two many keywords
864 "max(1, 2, key=1)", # keyfunc is not callable
865 ):
Tim Peters7f061872004-12-07 21:17:46 +0000866 try:
867 exec(stmt) in globals()
868 except TypeError:
869 pass
870 else:
871 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000872
873 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
874 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
875 self.assertEqual(max(1, 2, key=neg), 1) # two elems
876
877 data = [random.randrange(200) for i in range(100)]
878 keys = dict((elem, random.randrange(50)) for elem in data)
879 f = keys.__getitem__
880 self.assertEqual(max(data, key=f),
881 sorted(reversed(data), key=f)[-1])
882
Walter Dörwald919497e2003-01-19 16:23:59 +0000883 def test_min(self):
884 self.assertEqual(min('123123'), '1')
885 self.assertEqual(min(1, 2, 3), 1)
886 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
887 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
888
889 self.assertEqual(min(1, 2L, 3.0), 1)
890 self.assertEqual(min(1L, 2.0, 3), 1L)
891 self.assertEqual(min(1.0, 2, 3L), 1.0)
892
893 self.assertRaises(TypeError, min)
894 self.assertRaises(TypeError, min, 42)
895 self.assertRaises(ValueError, min, ())
896 class BadSeq:
897 def __getitem__(self, index):
898 raise ValueError
899 self.assertRaises(ValueError, min, BadSeq())
900 class BadNumber:
901 def __cmp__(self, other):
902 raise ValueError
903 self.assertRaises(ValueError, min, (42, BadNumber()))
904
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000905 for stmt in (
906 "min(key=int)", # no args
907 "min(1, key=int)", # single arg not iterable
908 "min(1, 2, keystone=int)", # wrong keyword
909 "min(1, 2, key=int, abc=int)", # two many keywords
910 "min(1, 2, key=1)", # keyfunc is not callable
911 ):
Tim Peters7f061872004-12-07 21:17:46 +0000912 try:
913 exec(stmt) in globals()
914 except TypeError:
915 pass
916 else:
917 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000918
919 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
920 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
921 self.assertEqual(min(1, 2, key=neg), 2) # two elems
922
923 data = [random.randrange(200) for i in range(100)]
924 keys = dict((elem, random.randrange(50)) for elem in data)
925 f = keys.__getitem__
926 self.assertEqual(min(data, key=f),
927 sorted(data, key=f)[0])
928
Georg Brandl28e08732008-04-30 19:47:09 +0000929 def test_next(self):
930 it = iter(range(2))
931 self.assertEqual(next(it), 0)
932 self.assertEqual(next(it), 1)
933 self.assertRaises(StopIteration, next, it)
934 self.assertRaises(StopIteration, next, it)
Ezio Melotti2623a372010-11-21 13:34:58 +0000935 self.assertEqual(next(it, 42), 42)
Georg Brandl28e08732008-04-30 19:47:09 +0000936
937 class Iter(object):
938 def __iter__(self):
939 return self
940 def next(self):
941 raise StopIteration
942
943 it = iter(Iter())
Ezio Melotti2623a372010-11-21 13:34:58 +0000944 self.assertEqual(next(it, 42), 42)
Georg Brandl28e08732008-04-30 19:47:09 +0000945 self.assertRaises(StopIteration, next, it)
946
947 def gen():
948 yield 1
949 return
950
951 it = gen()
Ezio Melotti2623a372010-11-21 13:34:58 +0000952 self.assertEqual(next(it), 1)
Georg Brandl28e08732008-04-30 19:47:09 +0000953 self.assertRaises(StopIteration, next, it)
Ezio Melotti2623a372010-11-21 13:34:58 +0000954 self.assertEqual(next(it, 42), 42)
Georg Brandl28e08732008-04-30 19:47:09 +0000955
Walter Dörwald919497e2003-01-19 16:23:59 +0000956 def test_oct(self):
957 self.assertEqual(oct(100), '0144')
958 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000959 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000960 self.assertEqual(oct(-100L), '-0144L')
961 self.assertRaises(TypeError, oct, ())
962
963 def write_testfile(self):
964 # NB the first 4 lines are also used to test input and raw_input, below
965 fp = open(TESTFN, 'w')
966 try:
967 fp.write('1+1\n')
968 fp.write('1+1\n')
969 fp.write('The quick brown fox jumps over the lazy dog')
970 fp.write('.\n')
971 fp.write('Dear John\n')
972 fp.write('XXX'*100)
973 fp.write('YYY'*100)
974 finally:
975 fp.close()
976
977 def test_open(self):
978 self.write_testfile()
979 fp = open(TESTFN, 'r')
980 try:
981 self.assertEqual(fp.readline(4), '1+1\n')
982 self.assertEqual(fp.readline(4), '1+1\n')
983 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
984 self.assertEqual(fp.readline(4), 'Dear')
985 self.assertEqual(fp.readline(100), ' John\n')
986 self.assertEqual(fp.read(300), 'XXX'*100)
987 self.assertEqual(fp.read(1000), 'YYY'*100)
988 finally:
989 fp.close()
990 unlink(TESTFN)
991
992 def test_ord(self):
993 self.assertEqual(ord(' '), 32)
994 self.assertEqual(ord('A'), 65)
995 self.assertEqual(ord('a'), 97)
996 if have_unicode:
997 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
998 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000999 if have_unicode:
1000 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001001
1002 def test_pow(self):
1003 self.assertEqual(pow(0,0), 1)
1004 self.assertEqual(pow(0,1), 0)
1005 self.assertEqual(pow(1,0), 1)
1006 self.assertEqual(pow(1,1), 1)
1007
1008 self.assertEqual(pow(2,0), 1)
1009 self.assertEqual(pow(2,10), 1024)
1010 self.assertEqual(pow(2,20), 1024*1024)
1011 self.assertEqual(pow(2,30), 1024*1024*1024)
1012
1013 self.assertEqual(pow(-2,0), 1)
1014 self.assertEqual(pow(-2,1), -2)
1015 self.assertEqual(pow(-2,2), 4)
1016 self.assertEqual(pow(-2,3), -8)
1017
1018 self.assertEqual(pow(0L,0), 1)
1019 self.assertEqual(pow(0L,1), 0)
1020 self.assertEqual(pow(1L,0), 1)
1021 self.assertEqual(pow(1L,1), 1)
1022
1023 self.assertEqual(pow(2L,0), 1)
1024 self.assertEqual(pow(2L,10), 1024)
1025 self.assertEqual(pow(2L,20), 1024*1024)
1026 self.assertEqual(pow(2L,30), 1024*1024*1024)
1027
1028 self.assertEqual(pow(-2L,0), 1)
1029 self.assertEqual(pow(-2L,1), -2)
1030 self.assertEqual(pow(-2L,2), 4)
1031 self.assertEqual(pow(-2L,3), -8)
1032
1033 self.assertAlmostEqual(pow(0.,0), 1.)
1034 self.assertAlmostEqual(pow(0.,1), 0.)
1035 self.assertAlmostEqual(pow(1.,0), 1.)
1036 self.assertAlmostEqual(pow(1.,1), 1.)
1037
1038 self.assertAlmostEqual(pow(2.,0), 1.)
1039 self.assertAlmostEqual(pow(2.,10), 1024.)
1040 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1041 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1042
1043 self.assertAlmostEqual(pow(-2.,0), 1.)
1044 self.assertAlmostEqual(pow(-2.,1), -2.)
1045 self.assertAlmostEqual(pow(-2.,2), 4.)
1046 self.assertAlmostEqual(pow(-2.,3), -8.)
1047
1048 for x in 2, 2L, 2.0:
1049 for y in 10, 10L, 10.0:
1050 for z in 1000, 1000L, 1000.0:
1051 if isinstance(x, float) or \
1052 isinstance(y, float) or \
1053 isinstance(z, float):
1054 self.assertRaises(TypeError, pow, x, y, z)
1055 else:
1056 self.assertAlmostEqual(pow(x, y, z), 24.0)
1057
1058 self.assertRaises(TypeError, pow, -1, -2, 3)
1059 self.assertRaises(ValueError, pow, 1, 2, 0)
1060 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1061 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001062 # Will return complex in 3.0:
1063 self.assertRaises(ValueError, pow, -342.43, 0.234)
Walter Dörwald919497e2003-01-19 16:23:59 +00001064
1065 self.assertRaises(TypeError, pow)
1066
1067 def test_range(self):
1068 self.assertEqual(range(3), [0, 1, 2])
1069 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1070 self.assertEqual(range(0), [])
1071 self.assertEqual(range(-3), [])
1072 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1073 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1074
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001075 # Now test range() with longs
1076 self.assertEqual(range(-2**100), [])
1077 self.assertEqual(range(0, -2**100), [])
1078 self.assertEqual(range(0, 2**100, -1), [])
1079 self.assertEqual(range(0, 2**100, -1), [])
1080
1081 a = long(10 * sys.maxint)
1082 b = long(100 * sys.maxint)
1083 c = long(50 * sys.maxint)
1084
1085 self.assertEqual(range(a, a+2), [a, a+1])
1086 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1087 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1088
1089 seq = range(a, b, c)
Ezio Melottiaa980582010-01-23 23:04:36 +00001090 self.assertIn(a, seq)
1091 self.assertNotIn(b, seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001092 self.assertEqual(len(seq), 2)
1093
1094 seq = range(b, a, -c)
Ezio Melottiaa980582010-01-23 23:04:36 +00001095 self.assertIn(b, seq)
1096 self.assertNotIn(a, seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001097 self.assertEqual(len(seq), 2)
1098
1099 seq = range(-a, -b, -c)
Ezio Melottiaa980582010-01-23 23:04:36 +00001100 self.assertIn(-a, seq)
1101 self.assertNotIn(-b, seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001102 self.assertEqual(len(seq), 2)
1103
Walter Dörwald919497e2003-01-19 16:23:59 +00001104 self.assertRaises(TypeError, range)
1105 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1106 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001107 self.assertRaises(ValueError, range, a, a + 1, long(0))
1108
1109 class badzero(int):
1110 def __cmp__(self, other):
1111 raise RuntimeError
Nick Coghlan48361f52008-08-11 15:45:58 +00001112 __hash__ = None # Invalid cmp makes this unhashable
Neal Norwitzfcf44352005-11-27 20:37:43 +00001113 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001114
Mark Dickinson481ab892010-05-05 22:42:51 +00001115 # Reject floats.
1116 self.assertRaises(TypeError, range, 1., 1., 1.)
Tim Peters299b3df2003-04-15 14:40:03 +00001117 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001118
Walter Dörwald357981e2003-04-15 18:59:28 +00001119 self.assertRaises(TypeError, range, 0, "spam")
1120 self.assertRaises(TypeError, range, 0, 42, "spam")
1121
1122 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1123 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1124
Mark Dickinsona8d26682010-05-04 16:18:25 +00001125 bignum = 2*sys.maxint
1126 smallnum = 42
1127 # Old-style user-defined class with __int__ method
1128 class I0:
1129 def __init__(self, n):
1130 self.n = int(n)
1131 def __int__(self):
1132 return self.n
1133 self.assertEqual(range(I0(bignum), I0(bignum + 1)), [bignum])
1134 self.assertEqual(range(I0(smallnum), I0(smallnum + 1)), [smallnum])
1135
1136 # New-style user-defined class with __int__ method
1137 class I1(object):
1138 def __init__(self, n):
1139 self.n = int(n)
1140 def __int__(self):
1141 return self.n
1142 self.assertEqual(range(I1(bignum), I1(bignum + 1)), [bignum])
1143 self.assertEqual(range(I1(smallnum), I1(smallnum + 1)), [smallnum])
1144
1145 # New-style user-defined class with failing __int__ method
1146 class IX(object):
1147 def __int__(self):
1148 raise RuntimeError
1149 self.assertRaises(RuntimeError, range, IX())
1150
1151 # New-style user-defined class with invalid __int__ method
1152 class IN(object):
1153 def __int__(self):
1154 return "not a number"
1155 self.assertRaises(TypeError, range, IN())
1156
1157 # Exercise various combinations of bad arguments, to check
1158 # refcounting logic
1159 self.assertRaises(TypeError, range, 0.0)
1160
1161 self.assertRaises(TypeError, range, 0, 0.0)
1162 self.assertRaises(TypeError, range, 0.0, 0)
1163 self.assertRaises(TypeError, range, 0.0, 0.0)
1164
1165 self.assertRaises(TypeError, range, 0, 0, 1.0)
1166 self.assertRaises(TypeError, range, 0, 0.0, 1)
1167 self.assertRaises(TypeError, range, 0, 0.0, 1.0)
1168 self.assertRaises(TypeError, range, 0.0, 0, 1)
1169 self.assertRaises(TypeError, range, 0.0, 0, 1.0)
1170 self.assertRaises(TypeError, range, 0.0, 0.0, 1)
1171 self.assertRaises(TypeError, range, 0.0, 0.0, 1.0)
1172
1173
1174
Walter Dörwald919497e2003-01-19 16:23:59 +00001175 def test_input_and_raw_input(self):
1176 self.write_testfile()
1177 fp = open(TESTFN, 'r')
1178 savestdin = sys.stdin
1179 savestdout = sys.stdout # Eats the echo
1180 try:
1181 sys.stdin = fp
1182 sys.stdout = BitBucket()
1183 self.assertEqual(input(), 2)
1184 self.assertEqual(input('testing\n'), 2)
1185 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1186 self.assertEqual(raw_input('testing\n'), 'Dear John')
Tim Peters8e24a962006-08-09 00:52:26 +00001187
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001188 # SF 1535165: don't segfault on closed stdin
1189 # sys.stdout must be a regular file for triggering
1190 sys.stdout = savestdout
1191 sys.stdin.close()
Georg Brandld336e982006-08-06 09:17:16 +00001192 self.assertRaises(ValueError, input)
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001193
1194 sys.stdout = BitBucket()
Walter Dörwald919497e2003-01-19 16:23:59 +00001195 sys.stdin = cStringIO.StringIO("NULL\0")
1196 self.assertRaises(TypeError, input, 42, 42)
1197 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1198 self.assertEqual(input(), 'whitespace')
1199 sys.stdin = cStringIO.StringIO()
1200 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001201
1202 # SF 876178: make sure input() respect future options.
1203 sys.stdin = cStringIO.StringIO('1/2')
1204 sys.stdout = cStringIO.StringIO()
1205 exec compile('print input()', 'test_builtin_tmp', 'exec')
1206 sys.stdin.seek(0, 0)
1207 exec compile('from __future__ import division;print input()',
1208 'test_builtin_tmp', 'exec')
1209 sys.stdin.seek(0, 0)
1210 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001211 # The result we expect depends on whether new division semantics
1212 # are already in effect.
1213 if 1/2 == 0:
1214 # This test was compiled with old semantics.
1215 expected = ['0', '0.5', '0']
1216 else:
1217 # This test was compiled with new semantics (e.g., -Qnew
1218 # was given on the command line.
1219 expected = ['0.5', '0.5', '0.5']
1220 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001221
Walter Dörwald919497e2003-01-19 16:23:59 +00001222 del sys.stdout
1223 self.assertRaises(RuntimeError, input, 'prompt')
1224 del sys.stdin
1225 self.assertRaises(RuntimeError, input, 'prompt')
1226 finally:
1227 sys.stdin = savestdin
1228 sys.stdout = savestdout
1229 fp.close()
1230 unlink(TESTFN)
1231
1232 def test_reduce(self):
Mark Dickinson20665592010-05-25 19:01:08 +00001233 add = lambda x, y: x+y
1234 self.assertEqual(reduce(add, ['a', 'b', 'c'], ''), 'abc')
Walter Dörwald919497e2003-01-19 16:23:59 +00001235 self.assertEqual(
Mark Dickinson20665592010-05-25 19:01:08 +00001236 reduce(add, [['a', 'c'], [], ['d', 'w']], []),
Walter Dörwald919497e2003-01-19 16:23:59 +00001237 ['a','c','d','w']
1238 )
1239 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1240 self.assertEqual(
1241 reduce(lambda x, y: x*y, range(2,21), 1L),
1242 2432902008176640000L
1243 )
Mark Dickinson20665592010-05-25 19:01:08 +00001244 self.assertEqual(reduce(add, Squares(10)), 285)
1245 self.assertEqual(reduce(add, Squares(10), 0), 285)
1246 self.assertEqual(reduce(add, Squares(0), 0), 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001247 self.assertRaises(TypeError, reduce)
Mark Dickinson20665592010-05-25 19:01:08 +00001248 self.assertRaises(TypeError, reduce, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001249 self.assertRaises(TypeError, reduce, 42, 42)
1250 self.assertRaises(TypeError, reduce, 42, 42, 42)
Mark Dickinson20665592010-05-25 19:01:08 +00001251 self.assertRaises(TypeError, reduce, None, range(5))
1252 self.assertRaises(TypeError, reduce, add, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001253 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1254 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1255 self.assertRaises(TypeError, reduce, 42, (42, 42))
Mark Dickinson20665592010-05-25 19:01:08 +00001256 self.assertRaises(TypeError, reduce, add, []) # arg 2 must not be empty sequence with no initial value
1257 self.assertRaises(TypeError, reduce, add, "")
1258 self.assertRaises(TypeError, reduce, add, ())
1259 self.assertEqual(reduce(add, [], None), None)
1260 self.assertEqual(reduce(add, [], 42), 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001261
1262 class BadSeq:
1263 def __getitem__(self, index):
1264 raise ValueError
1265 self.assertRaises(ValueError, reduce, 42, BadSeq())
1266
1267 def test_reload(self):
1268 import marshal
1269 reload(marshal)
1270 import string
1271 reload(string)
1272 ## import sys
1273 ## self.assertRaises(ImportError, reload, sys)
1274
1275 def test_repr(self):
1276 self.assertEqual(repr(''), '\'\'')
1277 self.assertEqual(repr(0), '0')
1278 self.assertEqual(repr(0L), '0L')
1279 self.assertEqual(repr(()), '()')
1280 self.assertEqual(repr([]), '[]')
1281 self.assertEqual(repr({}), '{}')
1282 a = []
1283 a.append(a)
1284 self.assertEqual(repr(a), '[[...]]')
1285 a = {}
1286 a[0] = a
1287 self.assertEqual(repr(a), '{0: {...}}')
1288
1289 def test_round(self):
1290 self.assertEqual(round(0.0), 0.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001291 self.assertEqual(type(round(0.0)), float) # Will be int in 3.0.
Walter Dörwald919497e2003-01-19 16:23:59 +00001292 self.assertEqual(round(1.0), 1.0)
1293 self.assertEqual(round(10.0), 10.0)
1294 self.assertEqual(round(1000000000.0), 1000000000.0)
1295 self.assertEqual(round(1e20), 1e20)
1296
1297 self.assertEqual(round(-1.0), -1.0)
1298 self.assertEqual(round(-10.0), -10.0)
1299 self.assertEqual(round(-1000000000.0), -1000000000.0)
1300 self.assertEqual(round(-1e20), -1e20)
1301
1302 self.assertEqual(round(0.1), 0.0)
1303 self.assertEqual(round(1.1), 1.0)
1304 self.assertEqual(round(10.1), 10.0)
1305 self.assertEqual(round(1000000000.1), 1000000000.0)
1306
1307 self.assertEqual(round(-1.1), -1.0)
1308 self.assertEqual(round(-10.1), -10.0)
1309 self.assertEqual(round(-1000000000.1), -1000000000.0)
1310
1311 self.assertEqual(round(0.9), 1.0)
1312 self.assertEqual(round(9.9), 10.0)
1313 self.assertEqual(round(999999999.9), 1000000000.0)
1314
1315 self.assertEqual(round(-0.9), -1.0)
1316 self.assertEqual(round(-9.9), -10.0)
1317 self.assertEqual(round(-999999999.9), -1000000000.0)
1318
1319 self.assertEqual(round(-8.0, -1), -10.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001320 self.assertEqual(type(round(-8.0, -1)), float)
1321
1322 self.assertEqual(type(round(-8.0, 0)), float)
1323 self.assertEqual(type(round(-8.0, 1)), float)
1324
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001325 # Check half rounding behaviour.
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001326 self.assertEqual(round(5.5), 6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001327 self.assertEqual(round(6.5), 7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001328 self.assertEqual(round(-5.5), -6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001329 self.assertEqual(round(-6.5), -7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001330
1331 # Check behavior on ints
1332 self.assertEqual(round(0), 0)
1333 self.assertEqual(round(8), 8)
1334 self.assertEqual(round(-8), -8)
1335 self.assertEqual(type(round(0)), float) # Will be int in 3.0.
1336 self.assertEqual(type(round(-8, -1)), float)
1337 self.assertEqual(type(round(-8, 0)), float)
1338 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001339
Georg Brandlccadf842006-03-31 18:54:53 +00001340 # test new kwargs
1341 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1342
Walter Dörwald919497e2003-01-19 16:23:59 +00001343 self.assertRaises(TypeError, round)
1344
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001345 # test generic rounding delegation for reals
1346 class TestRound(object):
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001347 def __float__(self):
1348 return 23.0
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001349
1350 class TestNoRound(object):
1351 pass
1352
1353 self.assertEqual(round(TestRound()), 23)
1354
1355 self.assertRaises(TypeError, round, 1, 2, 3)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001356 self.assertRaises(TypeError, round, TestNoRound())
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001357
1358 t = TestNoRound()
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001359 t.__float__ = lambda *args: args
1360 self.assertRaises(TypeError, round, t)
1361 self.assertRaises(TypeError, round, t, 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001362
Mark Dickinsona8fd66d2009-11-09 17:03:34 +00001363 # Some versions of glibc for alpha have a bug that affects
1364 # float -> integer rounding (floor, ceil, rint, round) for
1365 # values in the range [2**52, 2**53). See:
1366 #
1367 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1368 #
1369 # We skip this test on Linux/alpha if it would fail.
1370 linux_alpha = (platform.system().startswith('Linux') and
1371 platform.machine().startswith('alpha'))
1372 system_round_bug = round(5e15+1) != 5e15+1
1373 @unittest.skipIf(linux_alpha and system_round_bug,
1374 "test will fail; failure is probably due to a "
1375 "buggy system round function")
1376 def test_round_large(self):
1377 # Issue #1869: integral floats should remain unchanged
1378 self.assertEqual(round(5e15-1), 5e15-1)
1379 self.assertEqual(round(5e15), 5e15)
1380 self.assertEqual(round(5e15+1), 5e15+1)
1381 self.assertEqual(round(5e15+2), 5e15+2)
1382 self.assertEqual(round(5e15+3), 5e15+3)
1383
Walter Dörwald919497e2003-01-19 16:23:59 +00001384 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001385 setattr(sys, 'spam', 1)
1386 self.assertEqual(sys.spam, 1)
1387 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1388 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001389
Alex Martellia70b1912003-04-22 08:12:33 +00001390 def test_sum(self):
1391 self.assertEqual(sum([]), 0)
1392 self.assertEqual(sum(range(2,8)), 27)
1393 self.assertEqual(sum(iter(range(2,8))), 27)
1394 self.assertEqual(sum(Squares(10)), 285)
1395 self.assertEqual(sum(iter(Squares(10))), 285)
1396 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1397
1398 self.assertRaises(TypeError, sum)
1399 self.assertRaises(TypeError, sum, 42)
1400 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1401 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1402 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1403 self.assertRaises(TypeError, sum, [{2:3}])
1404 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1405
1406 class BadSeq:
1407 def __getitem__(self, index):
1408 raise ValueError
1409 self.assertRaises(ValueError, sum, BadSeq())
1410
Mark Dickinsonbfd2dc72009-10-17 21:46:32 +00001411 empty = []
1412 sum(([x] for x in range(10)), empty)
1413 self.assertEqual(empty, [])
1414
Walter Dörwald919497e2003-01-19 16:23:59 +00001415 def test_type(self):
1416 self.assertEqual(type(''), type('123'))
1417 self.assertNotEqual(type(''), type(()))
1418
1419 def test_unichr(self):
1420 if have_unicode:
1421 self.assertEqual(unichr(32), unicode(' '))
1422 self.assertEqual(unichr(65), unicode('A'))
1423 self.assertEqual(unichr(97), unicode('a'))
1424 self.assertEqual(
1425 unichr(sys.maxunicode),
1426 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1427 )
1428 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1429 self.assertRaises(TypeError, unichr)
Amaury Forgeot d'Arc39fd6722008-07-31 21:28:03 +00001430 self.assertRaises((OverflowError, ValueError), unichr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +00001431
Guido van Rossumfee7b932005-01-16 00:21:28 +00001432 # We don't want self in vars(), so these are static methods
1433
1434 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001435 def get_vars_f0():
1436 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001437
Guido van Rossumfee7b932005-01-16 00:21:28 +00001438 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001439 def get_vars_f2():
1440 BuiltinTest.get_vars_f0()
1441 a = 1
1442 b = 2
1443 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001444
Mark Dickinson20665592010-05-25 19:01:08 +00001445 class C_get_vars(object):
1446 def getDict(self):
1447 return {'a':2}
1448 __dict__ = property(fget=getDict)
1449
Walter Dörwald919497e2003-01-19 16:23:59 +00001450 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001451 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001452 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001453 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001454 self.assertEqual(self.get_vars_f0(), {})
1455 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1456 self.assertRaises(TypeError, vars, 42, 42)
1457 self.assertRaises(TypeError, vars, 42)
Mark Dickinson20665592010-05-25 19:01:08 +00001458 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001459
1460 def test_zip(self):
1461 a = (1, 2, 3)
1462 b = (4, 5, 6)
1463 t = [(1, 4), (2, 5), (3, 6)]
1464 self.assertEqual(zip(a, b), t)
1465 b = [4, 5, 6]
1466 self.assertEqual(zip(a, b), t)
1467 b = (4, 5, 6, 7)
1468 self.assertEqual(zip(a, b), t)
1469 class I:
1470 def __getitem__(self, i):
1471 if i < 0 or i > 2: raise IndexError
1472 return i + 4
1473 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001474 self.assertEqual(zip(), [])
1475 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001476 self.assertRaises(TypeError, zip, None)
1477 class G:
1478 pass
1479 self.assertRaises(TypeError, zip, a, G())
1480
1481 # Make sure zip doesn't try to allocate a billion elements for the
1482 # result list when one of its arguments doesn't say how long it is.
1483 # A MemoryError is the most likely failure mode.
1484 class SequenceWithoutALength:
1485 def __getitem__(self, i):
1486 if i == 5:
1487 raise IndexError
1488 else:
1489 return i
1490 self.assertEqual(
1491 zip(SequenceWithoutALength(), xrange(2**30)),
1492 list(enumerate(range(5)))
1493 )
1494
1495 class BadSeq:
1496 def __getitem__(self, i):
1497 if i == 5:
1498 raise ValueError
1499 else:
1500 return i
1501 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1502
Eric Smitha9f7d622008-02-17 19:46:49 +00001503 def test_format(self):
1504 # Test the basic machinery of the format() builtin. Don't test
1505 # the specifics of the various formatters
1506 self.assertEqual(format(3, ''), '3')
1507
1508 # Returns some classes to use for various tests. There's
1509 # an old-style version, and a new-style version
1510 def classes_new():
1511 class A(object):
1512 def __init__(self, x):
1513 self.x = x
1514 def __format__(self, format_spec):
1515 return str(self.x) + format_spec
1516 class DerivedFromA(A):
1517 pass
1518
1519 class Simple(object): pass
1520 class DerivedFromSimple(Simple):
1521 def __init__(self, x):
1522 self.x = x
1523 def __format__(self, format_spec):
1524 return str(self.x) + format_spec
1525 class DerivedFromSimple2(DerivedFromSimple): pass
1526 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1527
1528 # In 3.0, classes_classic has the same meaning as classes_new
1529 def classes_classic():
1530 class A:
1531 def __init__(self, x):
1532 self.x = x
1533 def __format__(self, format_spec):
1534 return str(self.x) + format_spec
1535 class DerivedFromA(A):
1536 pass
1537
1538 class Simple: pass
1539 class DerivedFromSimple(Simple):
1540 def __init__(self, x):
1541 self.x = x
1542 def __format__(self, format_spec):
1543 return str(self.x) + format_spec
1544 class DerivedFromSimple2(DerivedFromSimple): pass
1545 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1546
1547 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1548 self.assertEqual(format(A(3), 'spec'), '3spec')
1549 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1550 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1551 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1552 '10abcdef')
1553
1554 class_test(*classes_new())
1555 class_test(*classes_classic())
1556
1557 def empty_format_spec(value):
1558 # test that:
1559 # format(x, '') == str(x)
1560 # format(x) == str(x)
1561 self.assertEqual(format(value, ""), str(value))
1562 self.assertEqual(format(value), str(value))
1563
1564 # for builtin types, format(x, "") == str(x)
1565 empty_format_spec(17**13)
1566 empty_format_spec(1.0)
1567 empty_format_spec(3.1415e104)
1568 empty_format_spec(-3.1415e104)
1569 empty_format_spec(3.1415e-104)
1570 empty_format_spec(-3.1415e-104)
1571 empty_format_spec(object)
1572 empty_format_spec(None)
1573
1574 # TypeError because self.__format__ returns the wrong type
1575 class BadFormatResult:
1576 def __format__(self, format_spec):
1577 return 1.0
1578 self.assertRaises(TypeError, format, BadFormatResult(), "")
1579
1580 # TypeError because format_spec is not unicode or str
1581 self.assertRaises(TypeError, format, object(), 4)
1582 self.assertRaises(TypeError, format, object(), object())
1583
1584 # tests for object.__format__ really belong elsewhere, but
1585 # there's no good place to put them
1586 x = object().__format__('')
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001587 self.assertTrue(x.startswith('<object object at'))
Eric Smitha9f7d622008-02-17 19:46:49 +00001588
1589 # first argument to object.__format__ must be string
1590 self.assertRaises(TypeError, object().__format__, 3)
1591 self.assertRaises(TypeError, object().__format__, object())
1592 self.assertRaises(TypeError, object().__format__, None)
1593
Eric Smithd44b2fc2010-04-02 12:30:56 +00001594 # --------------------------------------------------------------------
1595 # Issue #7994: object.__format__ with a non-empty format string is
1596 # pending deprecated
1597 def test_deprecated_format_string(obj, fmt_str, should_raise_warning):
1598 with warnings.catch_warnings(record=True) as w:
1599 warnings.simplefilter("always", PendingDeprecationWarning)
1600 format(obj, fmt_str)
1601 if should_raise_warning:
1602 self.assertEqual(len(w), 1)
1603 self.assertIsInstance(w[0].message, PendingDeprecationWarning)
1604 self.assertIn('object.__format__ with a non-empty format '
1605 'string', str(w[0].message))
1606 else:
1607 self.assertEqual(len(w), 0)
1608
1609 fmt_strs = ['', 's', u'', u's']
1610
1611 class A:
1612 def __format__(self, fmt_str):
1613 return format('', fmt_str)
1614
1615 for fmt_str in fmt_strs:
1616 test_deprecated_format_string(A(), fmt_str, False)
1617
1618 class B:
1619 pass
1620
1621 class C(object):
1622 pass
1623
1624 for cls in [object, B, C]:
1625 for fmt_str in fmt_strs:
1626 test_deprecated_format_string(cls(), fmt_str, len(fmt_str) != 0)
1627 # --------------------------------------------------------------------
1628
Eric Smitha9f7d622008-02-17 19:46:49 +00001629 # make sure we can take a subclass of str as a format spec
1630 class DerivedFromStr(str): pass
1631 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1632
Eric Smithfb0742f2008-02-22 17:43:17 +00001633 def test_bin(self):
1634 self.assertEqual(bin(0), '0b0')
1635 self.assertEqual(bin(1), '0b1')
1636 self.assertEqual(bin(-1), '-0b1')
1637 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1638 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1639 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1640 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1641
Georg Brandlec812ca2009-07-22 11:57:15 +00001642 def test_bytearray_translate(self):
1643 x = bytearray("abc")
1644 self.assertRaises(ValueError, x.translate, "1", 1)
1645 self.assertRaises(TypeError, x.translate, "1"*256, 1)
1646
Eric Smithce584d42008-02-21 20:17:08 +00001647class TestSorted(unittest.TestCase):
1648
1649 def test_basic(self):
1650 data = range(100)
1651 copy = data[:]
1652 random.shuffle(copy)
1653 self.assertEqual(data, sorted(copy))
1654 self.assertNotEqual(data, copy)
1655
1656 data.reverse()
1657 random.shuffle(copy)
1658 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1659 self.assertNotEqual(data, copy)
1660 random.shuffle(copy)
1661 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1662 self.assertNotEqual(data, copy)
1663 random.shuffle(copy)
1664 self.assertEqual(data, sorted(copy, reverse=1))
1665 self.assertNotEqual(data, copy)
1666
1667 def test_inputtypes(self):
1668 s = 'abracadabra'
1669 types = [list, tuple]
1670 if have_unicode:
1671 types.insert(0, unicode)
1672 for T in types:
1673 self.assertEqual(sorted(s), sorted(T(s)))
1674
1675 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
1676 types = [set, frozenset, list, tuple, dict.fromkeys]
1677 if have_unicode:
1678 types.insert(0, unicode)
1679 for T in types:
1680 self.assertEqual(sorted(s), sorted(T(s)))
1681
1682 def test_baddecorator(self):
1683 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1684 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1685
Florent Xicluna07627882010-03-21 01:14:24 +00001686def _run_unittest(*args):
1687 with check_py3k_warnings(
1688 (".+ not supported in 3.x", DeprecationWarning),
1689 (".+ is renamed to imp.reload", DeprecationWarning),
1690 ("classic int division", DeprecationWarning)):
1691 run_unittest(*args)
1692
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001693def test_main(verbose=None):
1694 test_classes = (BuiltinTest, TestSorted)
1695
Florent Xicluna07627882010-03-21 01:14:24 +00001696 _run_unittest(*test_classes)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001697
1698 # verify reference counting
1699 if verbose and hasattr(sys, "gettotalrefcount"):
1700 import gc
1701 counts = [None] * 5
1702 for i in xrange(len(counts)):
Florent Xicluna07627882010-03-21 01:14:24 +00001703 _run_unittest(*test_classes)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001704 gc.collect()
1705 counts[i] = sys.gettotalrefcount()
1706 print counts
1707
Walter Dörwald919497e2003-01-19 16:23:59 +00001708
1709if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001710 test_main(verbose=True)