blob: 7b73949267c3c20dcd1d4edebf4262c7126cbef2 [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 Dickinsonad731b92009-11-09 17:12:30 +00003import platform
Georg Brandl1b37e872010-03-14 10:45:50 +00004import unittest
Benjamin Peterson076e0312010-08-23 21:58:59 +00005import sys
6import warnings
7import collections
8import io
9import types
10import builtins
11import random
Brett Cannon77628992010-03-20 20:59:33 +000012from test.support import fcmp, TESTFN, unlink, run_unittest, check_warnings
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +000013from operator import neg
Guido van Rossum3bead091992-01-27 17:00:37 +000014
Guido van Rossum3bead091992-01-27 17:00:37 +000015
Walter Dörwald919497e2003-01-19 16:23:59 +000016class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000017
Walter Dörwald919497e2003-01-19 16:23:59 +000018 def __init__(self, max):
19 self.max = max
20 self.sofar = []
21
22 def __len__(self): return len(self.sofar)
23
24 def __getitem__(self, i):
25 if not 0 <= i < self.max: raise IndexError
26 n = len(self.sofar)
27 while n <= i:
28 self.sofar.append(n*n)
29 n += 1
30 return self.sofar[i]
31
32class StrSquares:
33
34 def __init__(self, max):
35 self.max = max
36 self.sofar = []
37
38 def __len__(self):
39 return len(self.sofar)
40
41 def __getitem__(self, i):
42 if not 0 <= i < self.max:
43 raise IndexError
44 n = len(self.sofar)
45 while n <= i:
46 self.sofar.append(str(n*n))
47 n += 1
48 return self.sofar[i]
49
50class BitBucket:
51 def write(self, line):
52 pass
53
Facundo Batista2336bdd2008-01-19 19:12:01 +000054test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000055 ('0', 0),
56 ('1', 1),
57 ('9', 9),
58 ('10', 10),
59 ('99', 99),
60 ('100', 100),
61 ('314', 314),
62 (' 314', 314),
63 ('314 ', 314),
64 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000065 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000066 (' 1x', ValueError),
67 (' 1 ', 1),
68 (' 1\02 ', ValueError),
69 ('', ValueError),
70 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000071 (' \t\t ', ValueError),
Guido van Rossumef87d6e2007-05-02 19:09:54 +000072 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000073 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000074]
75
Facundo Batista2336bdd2008-01-19 19:12:01 +000076test_conv_sign = [
77 ('0', 0),
78 ('1', 1),
79 ('9', 9),
80 ('10', 10),
81 ('99', 99),
82 ('100', 100),
83 ('314', 314),
84 (' 314', ValueError),
85 ('314 ', 314),
86 (' \t\t 314 \t\t ', ValueError),
87 (repr(sys.maxsize), sys.maxsize),
88 (' 1x', ValueError),
89 (' 1 ', ValueError),
90 (' 1\02 ', ValueError),
91 ('', ValueError),
92 (' ', ValueError),
93 (' \t\t ', ValueError),
94 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
95 (chr(0x200), ValueError),
96]
97
Raymond Hettinger96229b12005-03-11 06:49:40 +000098class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +000099 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000100 raise RuntimeError
101
102class TestFailingIter:
103 def __iter__(self):
104 raise RuntimeError
105
Walter Dörwald919497e2003-01-19 16:23:59 +0000106class BuiltinTest(unittest.TestCase):
107
108 def test_import(self):
109 __import__('sys')
110 __import__('time')
111 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000112 __import__(name='sys')
113 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000114 self.assertRaises(ImportError, __import__, 'spamspam')
115 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000116 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000117 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +0000118
119 def test_abs(self):
120 # int
121 self.assertEqual(abs(0), 0)
122 self.assertEqual(abs(1234), 1234)
123 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000124 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000125 # float
126 self.assertEqual(abs(0.0), 0.0)
127 self.assertEqual(abs(3.14), 3.14)
128 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000129 # str
130 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000131 # bool
132 self.assertEqual(abs(True), 1)
133 self.assertEqual(abs(False), 0)
134 # other
135 self.assertRaises(TypeError, abs)
136 self.assertRaises(TypeError, abs, None)
137 class AbsClass(object):
138 def __abs__(self):
139 return -5
140 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000141
Raymond Hettinger96229b12005-03-11 06:49:40 +0000142 def test_all(self):
143 self.assertEqual(all([2, 4, 6]), True)
144 self.assertEqual(all([2, None, 6]), False)
145 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
146 self.assertRaises(RuntimeError, all, TestFailingIter())
147 self.assertRaises(TypeError, all, 10) # Non-iterable
148 self.assertRaises(TypeError, all) # No args
149 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
150 self.assertEqual(all([]), True) # Empty iterator
151 S = [50, 60]
152 self.assertEqual(all(x > 42 for x in S), True)
153 S = [50, 40, 60]
154 self.assertEqual(all(x > 42 for x in S), False)
155
156 def test_any(self):
157 self.assertEqual(any([None, None, None]), False)
158 self.assertEqual(any([None, 4, None]), True)
159 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
160 self.assertRaises(RuntimeError, all, TestFailingIter())
161 self.assertRaises(TypeError, any, 10) # Non-iterable
162 self.assertRaises(TypeError, any) # No args
163 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
164 self.assertEqual(any([]), False) # Empty iterator
165 S = [40, 60, 30]
166 self.assertEqual(any(x > 42 for x in S), True)
167 S = [10, 20, 30]
168 self.assertEqual(any(x > 42 for x in S), False)
169
Georg Brandl559e5d72008-06-11 18:37:52 +0000170 def test_ascii(self):
171 self.assertEqual(ascii(''), '\'\'')
172 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000173 self.assertEqual(ascii(()), '()')
174 self.assertEqual(ascii([]), '[]')
175 self.assertEqual(ascii({}), '{}')
176 a = []
177 a.append(a)
178 self.assertEqual(ascii(a), '[[...]]')
179 a = {}
180 a[0] = a
181 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000182 # Advanced checks for unicode strings
183 def _check_uni(s):
184 self.assertEqual(ascii(s), repr(s))
185 _check_uni("'")
186 _check_uni('"')
187 _check_uni('"\'')
188 _check_uni('\0')
189 _check_uni('\r\n\t .')
190 # Unprintable non-ASCII characters
191 _check_uni('\x85')
192 _check_uni('\u1fff')
193 _check_uni('\U00012fff')
194 # Lone surrogates
195 _check_uni('\ud800')
196 _check_uni('\udfff')
197 # Issue #9804: surrogates should be joined even for printable
198 # wide characters (UCS-2 builds).
199 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
200 # All together
201 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
202 self.assertEqual(ascii(s),
203 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000204
Thomas Wouters89f507f2006-12-13 04:49:30 +0000205 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000206 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000207 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000208 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000209
Walter Dörwald919497e2003-01-19 16:23:59 +0000210 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000211 self.assertTrue(callable(len))
212 self.assertFalse(callable("a"))
213 self.assertTrue(callable(callable))
214 self.assertTrue(callable(lambda x, y: x + y))
215 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000216 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000217 self.assertTrue(callable(f))
218
219 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000220 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000221 self.assertTrue(callable(C1))
222 c = C1()
223 self.assertTrue(callable(c.meth))
224 self.assertFalse(callable(c))
225
226 # __call__ is looked up on the class, not the instance
227 c.__call__ = None
228 self.assertFalse(callable(c))
229 c.__call__ = lambda self: 0
230 self.assertFalse(callable(c))
231 del c.__call__
232 self.assertFalse(callable(c))
233
234 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000235 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000236 c2 = C2()
237 self.assertTrue(callable(c2))
238 c2.__call__ = None
239 self.assertTrue(callable(c2))
240 class C3(C2): pass
241 c3 = C3()
242 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000243
244 def test_chr(self):
245 self.assertEqual(chr(32), ' ')
246 self.assertEqual(chr(65), 'A')
247 self.assertEqual(chr(97), 'a')
248 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000249 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000250 self.assertEqual(chr(sys.maxunicode),
251 str(('\\U%08x' % (sys.maxunicode)).encode("ascii"),
252 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000253 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000254 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
255 self.assertEqual(chr(0x00010000), "\U00010000")
256 self.assertEqual(chr(0x00010001), "\U00010001")
257 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
258 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
259 self.assertEqual(chr(0x00100000), "\U00100000")
260 self.assertEqual(chr(0x00100001), "\U00100001")
261 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
262 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
263 self.assertRaises(ValueError, chr, -1)
264 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000265 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000266
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000267 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000268 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000269
Walter Dörwald919497e2003-01-19 16:23:59 +0000270 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000271 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000272 bom = b'\xef\xbb\xbf'
273 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000274 compile(source='pass', filename='?', mode='exec')
275 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
276 compile('pass', '?', dont_inherit=1, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000277 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000278 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000279 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
280 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000281 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000282 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
283 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000284 compile('print("\xe5")\n', '', 'exec')
285 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
286 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000287
Walter Dörwald919497e2003-01-19 16:23:59 +0000288 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000289 sys.spam = 1
290 delattr(sys, 'spam')
291 self.assertRaises(TypeError, delattr)
292
293 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000294 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000295 self.assertRaises(TypeError, dir, 42, 42)
296
Georg Brandle32b4222007-03-10 22:13:27 +0000297 # dir() - local scope
298 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000299 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000300
301 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000302 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000303
304 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000305 class Foo(types.ModuleType):
306 __dict__ = 8
307 f = Foo("foo")
308 self.assertRaises(TypeError, dir, f)
309
310 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000311 self.assertIn("strip", dir(str))
312 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000313
314 # dir(obj)
315 class Foo(object):
316 def __init__(self):
317 self.x = 7
318 self.y = 8
319 self.z = 9
320 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000321 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000322
323 # dir(obj_no__dict__)
324 class Foo(object):
325 __slots__ = []
326 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000327 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000328
329 # dir(obj_no__class__with__dict__)
330 # (an ugly trick to cause getattr(f, "__class__") to fail)
331 class Foo(object):
332 __slots__ = ["__class__", "__dict__"]
333 def __init__(self):
334 self.bar = "wow"
335 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000336 self.assertNotIn("__repr__", dir(f))
337 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000338
339 # dir(obj_using __dir__)
340 class Foo(object):
341 def __dir__(self):
342 return ["kan", "ga", "roo"]
343 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000344 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000345
346 # dir(obj__dir__not_list)
347 class Foo(object):
348 def __dir__(self):
349 return 7
350 f = Foo()
351 self.assertRaises(TypeError, dir, f)
352
Collin Winter3eed7652007-08-14 17:53:54 +0000353 # dir(traceback)
354 try:
355 raise IndexError
356 except:
357 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
358
359
Walter Dörwald919497e2003-01-19 16:23:59 +0000360 def test_divmod(self):
361 self.assertEqual(divmod(12, 7), (1, 5))
362 self.assertEqual(divmod(-12, 7), (-2, 2))
363 self.assertEqual(divmod(12, -7), (-2, -2))
364 self.assertEqual(divmod(-12, -7), (1, -5))
365
Mark Dickinson5c2db372009-12-05 20:28:34 +0000366 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000367
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000368 self.assertTrue(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
369 self.assertTrue(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
370 self.assertTrue(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
371 self.assertTrue(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000372
373 self.assertRaises(TypeError, divmod)
374
375 def test_eval(self):
376 self.assertEqual(eval('1+1'), 2)
377 self.assertEqual(eval(' 1+1\n'), 2)
378 globals = {'a': 1, 'b': 2}
379 locals = {'b': 200, 'c': 300}
380 self.assertEqual(eval('a', globals) , 1)
381 self.assertEqual(eval('a', globals, locals), 1)
382 self.assertEqual(eval('b', globals, locals), 200)
383 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000384 globals = {'a': 1, 'b': 2}
385 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000386 bom = b'\xef\xbb\xbf'
387 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000388 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000389 self.assertRaises(TypeError, eval)
390 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000391 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000392
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000393 def test_general_eval(self):
394 # Tests that general mappings can be used for the locals argument
395
396 class M:
397 "Test mapping interface versus possible calls from eval()."
398 def __getitem__(self, key):
399 if key == 'a':
400 return 12
401 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000402 def keys(self):
403 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000404
405 m = M()
406 g = globals()
407 self.assertEqual(eval('a', g, m), 12)
408 self.assertRaises(NameError, eval, 'b', g, m)
409 self.assertEqual(eval('dir()', g, m), list('xyz'))
410 self.assertEqual(eval('globals()', g, m), g)
411 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000412 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000413 class A:
414 "Non-mapping"
415 pass
416 m = A()
417 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000418
419 # Verify that dict subclasses work as well
420 class D(dict):
421 def __getitem__(self, key):
422 if key == 'a':
423 return 12
424 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000425 def keys(self):
426 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000427
428 d = D()
429 self.assertEqual(eval('a', g, d), 12)
430 self.assertRaises(NameError, eval, 'b', g, d)
431 self.assertEqual(eval('dir()', g, d), list('xyz'))
432 self.assertEqual(eval('globals()', g, d), g)
433 self.assertEqual(eval('locals()', g, d), d)
434
435 # Verify locals stores (used by list comps)
436 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000437 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000438
439 class SpreadSheet:
440 "Sample application showing nested, calculated lookups."
441 _cells = {}
442 def __setitem__(self, key, formula):
443 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000444 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000445 return eval(self._cells[key], globals(), self)
446
447 ss = SpreadSheet()
448 ss['a1'] = '5'
449 ss['a2'] = 'a1*6'
450 ss['a3'] = 'a2*7'
451 self.assertEqual(ss['a3'], 210)
452
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000453 # Verify that dir() catches a non-list returned by eval
454 # SF bug #1004669
455 class C:
456 def __getitem__(self, item):
457 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000458 def keys(self):
459 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000460 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
461
Georg Brandl7cae87c2006-09-06 06:51:57 +0000462 def test_exec(self):
463 g = {}
464 exec('z = 1', g)
465 if '__builtins__' in g:
466 del g['__builtins__']
467 self.assertEqual(g, {'z': 1})
468
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000469 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000470 if '__builtins__' in g:
471 del g['__builtins__']
472 self.assertEqual(g, {'z': 2})
473 g = {}
474 l = {}
475
Brett Cannon77628992010-03-20 20:59:33 +0000476 with check_warnings():
477 warnings.filterwarnings("ignore", "global statement",
478 module="<string>")
479 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000480 if '__builtins__' in g:
481 del g['__builtins__']
482 if '__builtins__' in l:
483 del l['__builtins__']
484 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
485
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000486 def test_exec_redirected(self):
487 savestdout = sys.stdout
488 sys.stdout = None # Whatever that cannot flush()
489 try:
490 # Used to raise SystemError('error return without exception set')
491 exec('a')
492 except NameError:
493 pass
494 finally:
495 sys.stdout = savestdout
496
Walter Dörwald919497e2003-01-19 16:23:59 +0000497 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000498 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
499 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
500 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
501 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
502 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000503 def identity(item):
504 return 1
505 filter(identity, Squares(5))
506 self.assertRaises(TypeError, filter)
507 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000508 def __getitem__(self, index):
509 if index<4:
510 return 42
511 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000512 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000513 def badfunc():
514 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000515 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000516
Walter Dörwaldbf517072003-01-27 15:57:14 +0000517 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000518 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
519 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
520 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000521
Walter Dörwald919497e2003-01-19 16:23:59 +0000522 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000523 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000524 self.assertRaises(TypeError, getattr, sys, 1)
525 self.assertRaises(TypeError, getattr, sys, 1, "foo")
526 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000527 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000528 # unicode surrogates are not encodable to the default encoding (utf8)
529 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000530
531 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000532 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000533 self.assertRaises(TypeError, hasattr, sys, 1)
534 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000535 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000536
Benjamin Peterson17689992010-08-24 03:26:23 +0000537 # Check that hasattr propagates all exceptions outside of
538 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000539 class A:
540 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000541 raise SystemExit
542 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000543 class B:
544 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000545 raise ValueError
546 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000547
Walter Dörwald919497e2003-01-19 16:23:59 +0000548 def test_hash(self):
549 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000550 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000551 self.assertEqual(hash(1), hash(1.0))
552 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000553 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000554 hash((0,1,2,3))
555 def f(): pass
556 self.assertRaises(TypeError, hash, [])
557 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000558 # Bug 1536021: Allow hash to return long objects
559 class X:
560 def __hash__(self):
561 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000562 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000563 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000564 def __hash__(self):
565 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000566 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000567
568 def test_hex(self):
569 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000570 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000571 self.assertRaises(TypeError, hex, {})
572
573 def test_id(self):
574 id(None)
575 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000576 id(1.0)
577 id('spam')
578 id((0,1,2,3))
579 id([0,1,2,3])
580 id({'spam': 1, 'eggs': 2, 'ham': 3})
581
Guido van Rossuma88a0332007-02-26 16:59:55 +0000582 # Test input() later, alphabetized as if it were raw_input
583
Walter Dörwald919497e2003-01-19 16:23:59 +0000584 def test_iter(self):
585 self.assertRaises(TypeError, iter)
586 self.assertRaises(TypeError, iter, 42, 42)
587 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000588 for l in lists:
589 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000590 self.assertEqual(next(i), '1')
591 self.assertEqual(next(i), '2')
592 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000593
594 def test_isinstance(self):
595 class C:
596 pass
597 class D(C):
598 pass
599 class E:
600 pass
601 c = C()
602 d = D()
603 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000604 self.assertTrue(isinstance(c, C))
605 self.assertTrue(isinstance(d, C))
606 self.assertTrue(not isinstance(e, C))
607 self.assertTrue(not isinstance(c, D))
608 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000609 self.assertRaises(TypeError, isinstance, E, 'foo')
610 self.assertRaises(TypeError, isinstance)
611
612 def test_issubclass(self):
613 class C:
614 pass
615 class D(C):
616 pass
617 class E:
618 pass
619 c = C()
620 d = D()
621 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000622 self.assertTrue(issubclass(D, C))
623 self.assertTrue(issubclass(C, C))
624 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000625 self.assertRaises(TypeError, issubclass, 'foo', E)
626 self.assertRaises(TypeError, issubclass, E, 'foo')
627 self.assertRaises(TypeError, issubclass)
628
629 def test_len(self):
630 self.assertEqual(len('123'), 3)
631 self.assertEqual(len(()), 0)
632 self.assertEqual(len((1, 2, 3, 4)), 4)
633 self.assertEqual(len([1, 2, 3, 4]), 4)
634 self.assertEqual(len({}), 0)
635 self.assertEqual(len({'a':1, 'b': 2}), 2)
636 class BadSeq:
637 def __len__(self):
638 raise ValueError
639 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000640 class InvalidLen:
641 def __len__(self):
642 return None
643 self.assertRaises(TypeError, len, InvalidLen())
644 class FloatLen:
645 def __len__(self):
646 return 4.5
647 self.assertRaises(TypeError, len, FloatLen())
648 class HugeLen:
649 def __len__(self):
650 return sys.maxsize + 1
651 self.assertRaises(OverflowError, len, HugeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000652 class NoLenMethod(object): pass
653 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000654
Walter Dörwald919497e2003-01-19 16:23:59 +0000655 def test_map(self):
656 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000657 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000658 [1, 4, 9]
659 )
660 try:
661 from math import sqrt
662 except ImportError:
663 def sqrt(x):
664 return pow(x, 0.5)
665 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000666 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000667 [[4.0, 2.0], [9.0, 3.0]]
668 )
669 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000670 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000671 [10, 4, 6]
672 )
673
674 def plus(*v):
675 accu = 0
676 for i in v: accu = accu + i
677 return accu
678 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000679 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000680 [1, 3, 7]
681 )
682 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000683 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000684 [1+4, 3+9, 7+2]
685 )
686 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000687 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000688 [1+4+1, 3+9+1, 7+2+0]
689 )
690 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000691 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000692 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
693 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000694 def Max(a, b):
695 if a is None:
696 return b
697 if b is None:
698 return a
699 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000700 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000701 list(map(Max, Squares(3), Squares(2))),
702 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000703 )
704 self.assertRaises(TypeError, map)
705 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000706 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000707 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000708 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000709 yield None
710 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000711 def badfunc(x):
712 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000713 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000714
715 def test_max(self):
716 self.assertEqual(max('123123'), '3')
717 self.assertEqual(max(1, 2, 3), 3)
718 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
719 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
720
Guido van Rossume2a383d2007-01-15 16:59:06 +0000721 self.assertEqual(max(1, 2, 3.0), 3.0)
722 self.assertEqual(max(1, 2.0, 3), 3)
723 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000724
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000725 for stmt in (
726 "max(key=int)", # no args
727 "max(1, key=int)", # single arg not iterable
728 "max(1, 2, keystone=int)", # wrong keyword
729 "max(1, 2, key=int, abc=int)", # two many keywords
730 "max(1, 2, key=1)", # keyfunc is not callable
731 ):
Tim Peters7f061872004-12-07 21:17:46 +0000732 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000733 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000734 except TypeError:
735 pass
736 else:
737 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000738
739 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
740 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
741 self.assertEqual(max(1, 2, key=neg), 1) # two elems
742
743 data = [random.randrange(200) for i in range(100)]
744 keys = dict((elem, random.randrange(50)) for elem in data)
745 f = keys.__getitem__
746 self.assertEqual(max(data, key=f),
747 sorted(reversed(data), key=f)[-1])
748
Walter Dörwald919497e2003-01-19 16:23:59 +0000749 def test_min(self):
750 self.assertEqual(min('123123'), '1')
751 self.assertEqual(min(1, 2, 3), 1)
752 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
753 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
754
Guido van Rossume2a383d2007-01-15 16:59:06 +0000755 self.assertEqual(min(1, 2, 3.0), 1)
756 self.assertEqual(min(1, 2.0, 3), 1)
757 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000758
759 self.assertRaises(TypeError, min)
760 self.assertRaises(TypeError, min, 42)
761 self.assertRaises(ValueError, min, ())
762 class BadSeq:
763 def __getitem__(self, index):
764 raise ValueError
765 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000766
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000767 for stmt in (
768 "min(key=int)", # no args
769 "min(1, key=int)", # single arg not iterable
770 "min(1, 2, keystone=int)", # wrong keyword
771 "min(1, 2, key=int, abc=int)", # two many keywords
772 "min(1, 2, key=1)", # keyfunc is not callable
773 ):
Tim Peters7f061872004-12-07 21:17:46 +0000774 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000775 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000776 except TypeError:
777 pass
778 else:
779 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000780
781 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
782 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
783 self.assertEqual(min(1, 2, key=neg), 2) # two elems
784
785 data = [random.randrange(200) for i in range(100)]
786 keys = dict((elem, random.randrange(50)) for elem in data)
787 f = keys.__getitem__
788 self.assertEqual(min(data, key=f),
789 sorted(data, key=f)[0])
790
Georg Brandla18af4e2007-04-21 15:47:16 +0000791 def test_next(self):
792 it = iter(range(2))
793 self.assertEqual(next(it), 0)
794 self.assertEqual(next(it), 1)
795 self.assertRaises(StopIteration, next, it)
796 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000797 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000798
799 class Iter(object):
800 def __iter__(self):
801 return self
802 def __next__(self):
803 raise StopIteration
804
805 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +0000806 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000807 self.assertRaises(StopIteration, next, it)
808
809 def gen():
810 yield 1
811 return
812
813 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000814 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +0000815 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000816 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000817
Walter Dörwald919497e2003-01-19 16:23:59 +0000818 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000819 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000820 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000821 self.assertRaises(TypeError, oct, ())
822
823 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000824 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000825 fp = open(TESTFN, 'w')
826 try:
827 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000828 fp.write('The quick brown fox jumps over the lazy dog')
829 fp.write('.\n')
830 fp.write('Dear John\n')
831 fp.write('XXX'*100)
832 fp.write('YYY'*100)
833 finally:
834 fp.close()
835
836 def test_open(self):
837 self.write_testfile()
838 fp = open(TESTFN, 'r')
839 try:
840 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000841 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
842 self.assertEqual(fp.readline(4), 'Dear')
843 self.assertEqual(fp.readline(100), ' John\n')
844 self.assertEqual(fp.read(300), 'XXX'*100)
845 self.assertEqual(fp.read(1000), 'YYY'*100)
846 finally:
847 fp.close()
848 unlink(TESTFN)
849
850 def test_ord(self):
851 self.assertEqual(ord(' '), 32)
852 self.assertEqual(ord('A'), 65)
853 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000854 self.assertEqual(ord('\x80'), 128)
855 self.assertEqual(ord('\xff'), 255)
856
857 self.assertEqual(ord(b' '), 32)
858 self.assertEqual(ord(b'A'), 65)
859 self.assertEqual(ord(b'a'), 97)
860 self.assertEqual(ord(b'\x80'), 128)
861 self.assertEqual(ord(b'\xff'), 255)
862
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000863 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +0000864 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000865
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000866 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
867 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
868 self.assertEqual(ord("\U00010000"), 0x00010000)
869 self.assertEqual(ord("\U00010001"), 0x00010001)
870 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
871 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
872 self.assertEqual(ord("\U00100000"), 0x00100000)
873 self.assertEqual(ord("\U00100001"), 0x00100001)
874 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
875 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
876
Walter Dörwald919497e2003-01-19 16:23:59 +0000877 def test_pow(self):
878 self.assertEqual(pow(0,0), 1)
879 self.assertEqual(pow(0,1), 0)
880 self.assertEqual(pow(1,0), 1)
881 self.assertEqual(pow(1,1), 1)
882
883 self.assertEqual(pow(2,0), 1)
884 self.assertEqual(pow(2,10), 1024)
885 self.assertEqual(pow(2,20), 1024*1024)
886 self.assertEqual(pow(2,30), 1024*1024*1024)
887
888 self.assertEqual(pow(-2,0), 1)
889 self.assertEqual(pow(-2,1), -2)
890 self.assertEqual(pow(-2,2), 4)
891 self.assertEqual(pow(-2,3), -8)
892
Walter Dörwald919497e2003-01-19 16:23:59 +0000893 self.assertAlmostEqual(pow(0.,0), 1.)
894 self.assertAlmostEqual(pow(0.,1), 0.)
895 self.assertAlmostEqual(pow(1.,0), 1.)
896 self.assertAlmostEqual(pow(1.,1), 1.)
897
898 self.assertAlmostEqual(pow(2.,0), 1.)
899 self.assertAlmostEqual(pow(2.,10), 1024.)
900 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
901 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
902
903 self.assertAlmostEqual(pow(-2.,0), 1.)
904 self.assertAlmostEqual(pow(-2.,1), -2.)
905 self.assertAlmostEqual(pow(-2.,2), 4.)
906 self.assertAlmostEqual(pow(-2.,3), -8.)
907
Mark Dickinson5c2db372009-12-05 20:28:34 +0000908 for x in 2, 2.0:
909 for y in 10, 10.0:
910 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +0000911 if isinstance(x, float) or \
912 isinstance(y, float) or \
913 isinstance(z, float):
914 self.assertRaises(TypeError, pow, x, y, z)
915 else:
916 self.assertAlmostEqual(pow(x, y, z), 24.0)
917
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +0000918 self.assertAlmostEqual(pow(-1, 0.5), 1j)
919 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
920
Walter Dörwald919497e2003-01-19 16:23:59 +0000921 self.assertRaises(TypeError, pow, -1, -2, 3)
922 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000923
924 self.assertRaises(TypeError, pow)
925
Guido van Rossuma88a0332007-02-26 16:59:55 +0000926 def test_input(self):
927 self.write_testfile()
928 fp = open(TESTFN, 'r')
929 savestdin = sys.stdin
930 savestdout = sys.stdout # Eats the echo
931 try:
932 sys.stdin = fp
933 sys.stdout = BitBucket()
934 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000935 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
936 self.assertEqual(input('testing\n'), 'Dear John')
937
938 # SF 1535165: don't segfault on closed stdin
939 # sys.stdout must be a regular file for triggering
940 sys.stdout = savestdout
941 sys.stdin.close()
942 self.assertRaises(ValueError, input)
943
944 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +0000945 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000946 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +0000947 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000948 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +0000949 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +0000950 self.assertRaises(EOFError, input)
951
952 del sys.stdout
953 self.assertRaises(RuntimeError, input, 'prompt')
954 del sys.stdin
955 self.assertRaises(RuntimeError, input, 'prompt')
956 finally:
957 sys.stdin = savestdin
958 sys.stdout = savestdout
959 fp.close()
960 unlink(TESTFN)
961
Walter Dörwald919497e2003-01-19 16:23:59 +0000962 def test_repr(self):
963 self.assertEqual(repr(''), '\'\'')
964 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +0000965 self.assertEqual(repr(()), '()')
966 self.assertEqual(repr([]), '[]')
967 self.assertEqual(repr({}), '{}')
968 a = []
969 a.append(a)
970 self.assertEqual(repr(a), '[[...]]')
971 a = {}
972 a[0] = a
973 self.assertEqual(repr(a), '{0: {...}}')
974
975 def test_round(self):
976 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +0000977 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +0000978 self.assertEqual(round(1.0), 1.0)
979 self.assertEqual(round(10.0), 10.0)
980 self.assertEqual(round(1000000000.0), 1000000000.0)
981 self.assertEqual(round(1e20), 1e20)
982
983 self.assertEqual(round(-1.0), -1.0)
984 self.assertEqual(round(-10.0), -10.0)
985 self.assertEqual(round(-1000000000.0), -1000000000.0)
986 self.assertEqual(round(-1e20), -1e20)
987
988 self.assertEqual(round(0.1), 0.0)
989 self.assertEqual(round(1.1), 1.0)
990 self.assertEqual(round(10.1), 10.0)
991 self.assertEqual(round(1000000000.1), 1000000000.0)
992
993 self.assertEqual(round(-1.1), -1.0)
994 self.assertEqual(round(-10.1), -10.0)
995 self.assertEqual(round(-1000000000.1), -1000000000.0)
996
997 self.assertEqual(round(0.9), 1.0)
998 self.assertEqual(round(9.9), 10.0)
999 self.assertEqual(round(999999999.9), 1000000000.0)
1000
1001 self.assertEqual(round(-0.9), -1.0)
1002 self.assertEqual(round(-9.9), -10.0)
1003 self.assertEqual(round(-999999999.9), -1000000000.0)
1004
1005 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001006 self.assertEqual(type(round(-8.0, -1)), float)
1007
1008 self.assertEqual(type(round(-8.0, 0)), float)
1009 self.assertEqual(type(round(-8.0, 1)), float)
1010
1011 # Check even / odd rounding behaviour
1012 self.assertEqual(round(5.5), 6)
1013 self.assertEqual(round(6.5), 6)
1014 self.assertEqual(round(-5.5), -6)
1015 self.assertEqual(round(-6.5), -6)
1016
1017 # Check behavior on ints
1018 self.assertEqual(round(0), 0)
1019 self.assertEqual(round(8), 8)
1020 self.assertEqual(round(-8), -8)
1021 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001022 self.assertEqual(type(round(-8, -1)), int)
1023 self.assertEqual(type(round(-8, 0)), int)
1024 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001025
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001026 # test new kwargs
1027 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1028
Walter Dörwald919497e2003-01-19 16:23:59 +00001029 self.assertRaises(TypeError, round)
1030
Alex Martelliae211f92007-08-22 23:21:33 +00001031 # test generic rounding delegation for reals
1032 class TestRound:
1033 def __round__(self):
1034 return 23
1035
1036 class TestNoRound:
1037 pass
1038
1039 self.assertEqual(round(TestRound()), 23)
1040
1041 self.assertRaises(TypeError, round, 1, 2, 3)
1042 self.assertRaises(TypeError, round, TestNoRound())
1043
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001044 t = TestNoRound()
1045 t.__round__ = lambda *args: args
1046 self.assertRaises(TypeError, round, t)
1047 self.assertRaises(TypeError, round, t, 0)
1048
Mark Dickinsonad731b92009-11-09 17:12:30 +00001049 # Some versions of glibc for alpha have a bug that affects
1050 # float -> integer rounding (floor, ceil, rint, round) for
1051 # values in the range [2**52, 2**53). See:
1052 #
1053 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1054 #
1055 # We skip this test on Linux/alpha if it would fail.
1056 linux_alpha = (platform.system().startswith('Linux') and
1057 platform.machine().startswith('alpha'))
1058 system_round_bug = round(5e15+1) != 5e15+1
1059 @unittest.skipIf(linux_alpha and system_round_bug,
1060 "test will fail; failure is probably due to a "
1061 "buggy system round function")
1062 def test_round_large(self):
1063 # Issue #1869: integral floats should remain unchanged
1064 self.assertEqual(round(5e15-1), 5e15-1)
1065 self.assertEqual(round(5e15), 5e15)
1066 self.assertEqual(round(5e15+1), 5e15+1)
1067 self.assertEqual(round(5e15+2), 5e15+2)
1068 self.assertEqual(round(5e15+3), 5e15+3)
1069
Walter Dörwald919497e2003-01-19 16:23:59 +00001070 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001071 setattr(sys, 'spam', 1)
1072 self.assertEqual(sys.spam, 1)
1073 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1074 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001075
Walter Dörwald919497e2003-01-19 16:23:59 +00001076
Alex Martellia70b1912003-04-22 08:12:33 +00001077 def test_sum(self):
1078 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001079 self.assertEqual(sum(list(range(2,8))), 27)
1080 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001081 self.assertEqual(sum(Squares(10)), 285)
1082 self.assertEqual(sum(iter(Squares(10))), 285)
1083 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1084
1085 self.assertRaises(TypeError, sum)
1086 self.assertRaises(TypeError, sum, 42)
1087 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1088 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1089 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1090 self.assertRaises(TypeError, sum, [{2:3}])
1091 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1092
1093 class BadSeq:
1094 def __getitem__(self, index):
1095 raise ValueError
1096 self.assertRaises(ValueError, sum, BadSeq())
1097
Mark Dickinson3a22b472009-10-17 21:48:16 +00001098 empty = []
1099 sum(([x] for x in range(10)), empty)
1100 self.assertEqual(empty, [])
1101
Walter Dörwald919497e2003-01-19 16:23:59 +00001102 def test_type(self):
1103 self.assertEqual(type(''), type('123'))
1104 self.assertNotEqual(type(''), type(()))
1105
Guido van Rossumfee7b932005-01-16 00:21:28 +00001106 # We don't want self in vars(), so these are static methods
1107
1108 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001109 def get_vars_f0():
1110 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001111
Guido van Rossumfee7b932005-01-16 00:21:28 +00001112 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001113 def get_vars_f2():
1114 BuiltinTest.get_vars_f0()
1115 a = 1
1116 b = 2
1117 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001118
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001119 class C_get_vars(object):
1120 def getDict(self):
1121 return {'a':2}
1122 __dict__ = property(fget=getDict)
1123
Walter Dörwald919497e2003-01-19 16:23:59 +00001124 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001125 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001126 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001127 self.assertEqual(self.get_vars_f0(), {})
1128 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1129 self.assertRaises(TypeError, vars, 42, 42)
1130 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001131 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001132
1133 def test_zip(self):
1134 a = (1, 2, 3)
1135 b = (4, 5, 6)
1136 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001137 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001138 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001139 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001140 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001141 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001142 class I:
1143 def __getitem__(self, i):
1144 if i < 0 or i > 2: raise IndexError
1145 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001146 self.assertEqual(list(zip(a, I())), t)
1147 self.assertEqual(list(zip()), [])
1148 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001149 self.assertRaises(TypeError, zip, None)
1150 class G:
1151 pass
1152 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001153 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001154
1155 # Make sure zip doesn't try to allocate a billion elements for the
1156 # result list when one of its arguments doesn't say how long it is.
1157 # A MemoryError is the most likely failure mode.
1158 class SequenceWithoutALength:
1159 def __getitem__(self, i):
1160 if i == 5:
1161 raise IndexError
1162 else:
1163 return i
1164 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001165 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001166 list(enumerate(range(5)))
1167 )
1168
1169 class BadSeq:
1170 def __getitem__(self, i):
1171 if i == 5:
1172 raise ValueError
1173 else:
1174 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001175 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001176
Eric Smithe4d63172010-09-13 20:48:43 +00001177 def test_format(self):
1178 # Test the basic machinery of the format() builtin. Don't test
1179 # the specifics of the various formatters
1180 self.assertEqual(format(3, ''), '3')
1181
1182 # Returns some classes to use for various tests. There's
1183 # an old-style version, and a new-style version
1184 def classes_new():
1185 class A(object):
1186 def __init__(self, x):
1187 self.x = x
1188 def __format__(self, format_spec):
1189 return str(self.x) + format_spec
1190 class DerivedFromA(A):
1191 pass
1192
1193 class Simple(object): pass
1194 class DerivedFromSimple(Simple):
1195 def __init__(self, x):
1196 self.x = x
1197 def __format__(self, format_spec):
1198 return str(self.x) + format_spec
1199 class DerivedFromSimple2(DerivedFromSimple): pass
1200 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1201
1202 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1203 self.assertEqual(format(A(3), 'spec'), '3spec')
1204 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1205 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1206 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1207 '10abcdef')
1208
1209 class_test(*classes_new())
1210
1211 def empty_format_spec(value):
1212 # test that:
1213 # format(x, '') == str(x)
1214 # format(x) == str(x)
1215 self.assertEqual(format(value, ""), str(value))
1216 self.assertEqual(format(value), str(value))
1217
1218 # for builtin types, format(x, "") == str(x)
1219 empty_format_spec(17**13)
1220 empty_format_spec(1.0)
1221 empty_format_spec(3.1415e104)
1222 empty_format_spec(-3.1415e104)
1223 empty_format_spec(3.1415e-104)
1224 empty_format_spec(-3.1415e-104)
1225 empty_format_spec(object)
1226 empty_format_spec(None)
1227
1228 # TypeError because self.__format__ returns the wrong type
1229 class BadFormatResult:
1230 def __format__(self, format_spec):
1231 return 1.0
1232 self.assertRaises(TypeError, format, BadFormatResult(), "")
1233
1234 # TypeError because format_spec is not unicode or str
1235 self.assertRaises(TypeError, format, object(), 4)
1236 self.assertRaises(TypeError, format, object(), object())
1237
1238 # tests for object.__format__ really belong elsewhere, but
1239 # there's no good place to put them
1240 x = object().__format__('')
1241 self.assertTrue(x.startswith('<object object at'))
1242
1243 # first argument to object.__format__ must be string
1244 self.assertRaises(TypeError, object().__format__, 3)
1245 self.assertRaises(TypeError, object().__format__, object())
1246 self.assertRaises(TypeError, object().__format__, None)
1247
1248 # --------------------------------------------------------------------
1249 # Issue #7994: object.__format__ with a non-empty format string is
1250 # pending deprecated
1251 def test_deprecated_format_string(obj, fmt_str, should_raise_warning):
1252 with warnings.catch_warnings(record=True) as w:
1253 warnings.simplefilter("always", PendingDeprecationWarning)
1254 format(obj, fmt_str)
1255 if should_raise_warning:
1256 self.assertEqual(len(w), 1)
1257 self.assertIsInstance(w[0].message, PendingDeprecationWarning)
1258 self.assertIn('object.__format__ with a non-empty format '
1259 'string', str(w[0].message))
1260 else:
1261 self.assertEqual(len(w), 0)
1262
1263 fmt_strs = ['', 's']
1264
1265 class A:
1266 def __format__(self, fmt_str):
1267 return format('', fmt_str)
1268
1269 for fmt_str in fmt_strs:
1270 test_deprecated_format_string(A(), fmt_str, False)
1271
1272 class B:
1273 pass
1274
1275 class C(object):
1276 pass
1277
1278 for cls in [object, B, C]:
1279 for fmt_str in fmt_strs:
1280 test_deprecated_format_string(cls(), fmt_str, len(fmt_str) != 0)
1281 # --------------------------------------------------------------------
1282
1283 # make sure we can take a subclass of str as a format spec
1284 class DerivedFromStr(str): pass
1285 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1286
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001287 def test_bin(self):
1288 self.assertEqual(bin(0), '0b0')
1289 self.assertEqual(bin(1), '0b1')
1290 self.assertEqual(bin(-1), '-0b1')
1291 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1292 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1293 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1294 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1295
Georg Brandl953152f2009-07-22 12:03:59 +00001296 def test_bytearray_translate(self):
1297 x = bytearray(b"abc")
1298 self.assertRaises(ValueError, x.translate, b"1", 1)
1299 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1300
Raymond Hettinger64958a12003-12-17 20:43:33 +00001301class TestSorted(unittest.TestCase):
1302
1303 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001304 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001305 copy = data[:]
1306 random.shuffle(copy)
1307 self.assertEqual(data, sorted(copy))
1308 self.assertNotEqual(data, copy)
1309
1310 data.reverse()
1311 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001312 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1313 self.assertNotEqual(data, copy)
1314 random.shuffle(copy)
1315 self.assertEqual(data, sorted(copy, reverse=1))
1316 self.assertNotEqual(data, copy)
1317
1318 def test_inputtypes(self):
1319 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001320 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001321 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001322 self.assertEqual(sorted(s), sorted(T(s)))
1323
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001324 s = ''.join(set(s)) # unique letters only
1325 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001326 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001327 self.assertEqual(sorted(s), sorted(T(s)))
1328
1329 def test_baddecorator(self):
1330 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1331 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1332
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001333def test_main(verbose=None):
1334 test_classes = (BuiltinTest, TestSorted)
1335
1336 run_unittest(*test_classes)
1337
1338 # verify reference counting
1339 if verbose and hasattr(sys, "gettotalrefcount"):
1340 import gc
1341 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001342 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001343 run_unittest(*test_classes)
1344 gc.collect()
1345 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001346 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001347
Walter Dörwald919497e2003-01-19 16:23:59 +00001348
1349if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001350 test_main(verbose=True)