blob: 587c1c04e92ed98d88512e6f9b5e75cf8abedd00 [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
Georg Brandl8334fd92010-12-04 10:26:46 +00009import ast
Benjamin Peterson076e0312010-08-23 21:58:59 +000010import types
11import builtins
12import random
Eli Bendersky67ebabd2011-02-25 10:14:17 +000013from test.support import TESTFN, unlink, run_unittest, check_warnings
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +000014from operator import neg
Guido van Rossum3bead091992-01-27 17:00:37 +000015
Guido van Rossum3bead091992-01-27 17:00:37 +000016
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
Facundo Batista2336bdd2008-01-19 19:12:01 +000055test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000056 ('0', 0),
57 ('1', 1),
58 ('9', 9),
59 ('10', 10),
60 ('99', 99),
61 ('100', 100),
62 ('314', 314),
63 (' 314', 314),
64 ('314 ', 314),
65 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000066 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000067 (' 1x', ValueError),
68 (' 1 ', 1),
69 (' 1\02 ', ValueError),
70 ('', ValueError),
71 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000072 (' \t\t ', ValueError),
Guido van Rossumef87d6e2007-05-02 19:09:54 +000073 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000074 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000075]
76
Facundo Batista2336bdd2008-01-19 19:12:01 +000077test_conv_sign = [
78 ('0', 0),
79 ('1', 1),
80 ('9', 9),
81 ('10', 10),
82 ('99', 99),
83 ('100', 100),
84 ('314', 314),
85 (' 314', ValueError),
86 ('314 ', 314),
87 (' \t\t 314 \t\t ', ValueError),
88 (repr(sys.maxsize), sys.maxsize),
89 (' 1x', ValueError),
90 (' 1 ', ValueError),
91 (' 1\02 ', ValueError),
92 ('', ValueError),
93 (' ', ValueError),
94 (' \t\t ', ValueError),
95 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
96 (chr(0x200), ValueError),
97]
98
Raymond Hettinger96229b12005-03-11 06:49:40 +000099class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000100 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000101 raise RuntimeError
102
103class TestFailingIter:
104 def __iter__(self):
105 raise RuntimeError
106
Walter Dörwald919497e2003-01-19 16:23:59 +0000107class BuiltinTest(unittest.TestCase):
108
109 def test_import(self):
110 __import__('sys')
111 __import__('time')
112 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000113 __import__(name='sys')
114 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000115 self.assertRaises(ImportError, __import__, 'spamspam')
116 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000117 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000118 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +0000119
120 def test_abs(self):
121 # int
122 self.assertEqual(abs(0), 0)
123 self.assertEqual(abs(1234), 1234)
124 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000125 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000126 # float
127 self.assertEqual(abs(0.0), 0.0)
128 self.assertEqual(abs(3.14), 3.14)
129 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000130 # str
131 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000132 # bool
133 self.assertEqual(abs(True), 1)
134 self.assertEqual(abs(False), 0)
135 # other
136 self.assertRaises(TypeError, abs)
137 self.assertRaises(TypeError, abs, None)
138 class AbsClass(object):
139 def __abs__(self):
140 return -5
141 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000142
Raymond Hettinger96229b12005-03-11 06:49:40 +0000143 def test_all(self):
144 self.assertEqual(all([2, 4, 6]), True)
145 self.assertEqual(all([2, None, 6]), False)
146 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
147 self.assertRaises(RuntimeError, all, TestFailingIter())
148 self.assertRaises(TypeError, all, 10) # Non-iterable
149 self.assertRaises(TypeError, all) # No args
150 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
151 self.assertEqual(all([]), True) # Empty iterator
152 S = [50, 60]
153 self.assertEqual(all(x > 42 for x in S), True)
154 S = [50, 40, 60]
155 self.assertEqual(all(x > 42 for x in S), False)
156
157 def test_any(self):
158 self.assertEqual(any([None, None, None]), False)
159 self.assertEqual(any([None, 4, None]), True)
160 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
161 self.assertRaises(RuntimeError, all, TestFailingIter())
162 self.assertRaises(TypeError, any, 10) # Non-iterable
163 self.assertRaises(TypeError, any) # No args
164 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
165 self.assertEqual(any([]), False) # Empty iterator
166 S = [40, 60, 30]
167 self.assertEqual(any(x > 42 for x in S), True)
168 S = [10, 20, 30]
169 self.assertEqual(any(x > 42 for x in S), False)
170
Georg Brandl559e5d72008-06-11 18:37:52 +0000171 def test_ascii(self):
172 self.assertEqual(ascii(''), '\'\'')
173 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000174 self.assertEqual(ascii(()), '()')
175 self.assertEqual(ascii([]), '[]')
176 self.assertEqual(ascii({}), '{}')
177 a = []
178 a.append(a)
179 self.assertEqual(ascii(a), '[[...]]')
180 a = {}
181 a[0] = a
182 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000183 # Advanced checks for unicode strings
184 def _check_uni(s):
185 self.assertEqual(ascii(s), repr(s))
186 _check_uni("'")
187 _check_uni('"')
188 _check_uni('"\'')
189 _check_uni('\0')
190 _check_uni('\r\n\t .')
191 # Unprintable non-ASCII characters
192 _check_uni('\x85')
193 _check_uni('\u1fff')
194 _check_uni('\U00012fff')
195 # Lone surrogates
196 _check_uni('\ud800')
197 _check_uni('\udfff')
198 # Issue #9804: surrogates should be joined even for printable
199 # wide characters (UCS-2 builds).
200 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
201 # All together
202 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
203 self.assertEqual(ascii(s),
204 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000205
Thomas Wouters89f507f2006-12-13 04:49:30 +0000206 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000207 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000208 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000209 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000210
Walter Dörwald919497e2003-01-19 16:23:59 +0000211 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000212 self.assertTrue(callable(len))
213 self.assertFalse(callable("a"))
214 self.assertTrue(callable(callable))
215 self.assertTrue(callable(lambda x, y: x + y))
216 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000217 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000218 self.assertTrue(callable(f))
219
220 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000221 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000222 self.assertTrue(callable(C1))
223 c = C1()
224 self.assertTrue(callable(c.meth))
225 self.assertFalse(callable(c))
226
227 # __call__ is looked up on the class, not the instance
228 c.__call__ = None
229 self.assertFalse(callable(c))
230 c.__call__ = lambda self: 0
231 self.assertFalse(callable(c))
232 del c.__call__
233 self.assertFalse(callable(c))
234
235 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000236 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000237 c2 = C2()
238 self.assertTrue(callable(c2))
239 c2.__call__ = None
240 self.assertTrue(callable(c2))
241 class C3(C2): pass
242 c3 = C3()
243 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000244
245 def test_chr(self):
246 self.assertEqual(chr(32), ' ')
247 self.assertEqual(chr(65), 'A')
248 self.assertEqual(chr(97), 'a')
249 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000250 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000251 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300252 str('\\U0010ffff'.encode("ascii"), '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
Georg Brandl8334fd92010-12-04 10:26:46 +0000288 # test the optimize argument
289
290 codestr = '''def f():
291 """doc"""
292 try:
293 assert False
294 except AssertionError:
295 return (True, f.__doc__)
296 else:
297 return (False, f.__doc__)
298 '''
299 def f(): """doc"""
300 values = [(-1, __debug__, f.__doc__),
301 (0, True, 'doc'),
302 (1, False, 'doc'),
303 (2, False, None)]
304 for optval, debugval, docstring in values:
305 # test both direct compilation and compilation via AST
306 codeobjs = []
307 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
308 tree = ast.parse(codestr)
309 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
310 for code in codeobjs:
311 ns = {}
312 exec(code, ns)
313 rv = ns['f']()
314 self.assertEqual(rv, (debugval, docstring))
315
Walter Dörwald919497e2003-01-19 16:23:59 +0000316 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000317 sys.spam = 1
318 delattr(sys, 'spam')
319 self.assertRaises(TypeError, delattr)
320
321 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000322 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000323 self.assertRaises(TypeError, dir, 42, 42)
324
Georg Brandle32b4222007-03-10 22:13:27 +0000325 # dir() - local scope
326 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000327 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000328
329 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000330 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000331
332 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000333 class Foo(types.ModuleType):
334 __dict__ = 8
335 f = Foo("foo")
336 self.assertRaises(TypeError, dir, f)
337
338 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000339 self.assertIn("strip", dir(str))
340 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000341
342 # dir(obj)
343 class Foo(object):
344 def __init__(self):
345 self.x = 7
346 self.y = 8
347 self.z = 9
348 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000349 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000350
351 # dir(obj_no__dict__)
352 class Foo(object):
353 __slots__ = []
354 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000355 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000356
357 # dir(obj_no__class__with__dict__)
358 # (an ugly trick to cause getattr(f, "__class__") to fail)
359 class Foo(object):
360 __slots__ = ["__class__", "__dict__"]
361 def __init__(self):
362 self.bar = "wow"
363 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000364 self.assertNotIn("__repr__", dir(f))
365 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000366
367 # dir(obj_using __dir__)
368 class Foo(object):
369 def __dir__(self):
370 return ["kan", "ga", "roo"]
371 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000372 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000373
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500374 # dir(obj__dir__tuple)
375 class Foo(object):
376 def __dir__(self):
377 return ("b", "c", "a")
378 res = dir(Foo())
379 self.assertIsInstance(res, list)
380 self.assertTrue(res == ["a", "b", "c"])
381
382 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000383 class Foo(object):
384 def __dir__(self):
385 return 7
386 f = Foo()
387 self.assertRaises(TypeError, dir, f)
388
Collin Winter3eed7652007-08-14 17:53:54 +0000389 # dir(traceback)
390 try:
391 raise IndexError
392 except:
393 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
394
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500395 # test that object has a __dir__()
396 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000397
Walter Dörwald919497e2003-01-19 16:23:59 +0000398 def test_divmod(self):
399 self.assertEqual(divmod(12, 7), (1, 5))
400 self.assertEqual(divmod(-12, 7), (-2, 2))
401 self.assertEqual(divmod(12, -7), (-2, -2))
402 self.assertEqual(divmod(-12, -7), (1, -5))
403
Mark Dickinson5c2db372009-12-05 20:28:34 +0000404 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000405
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000406 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
407 (-3.25, 1.0, (-4.0, 0.75)),
408 (3.25, -1.0, (-4.0, -0.75)),
409 (-3.25, -1.0, (3.0, -0.25))]:
410 result = divmod(num, denom)
411 self.assertAlmostEqual(result[0], exp_result[0])
412 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000413
414 self.assertRaises(TypeError, divmod)
415
416 def test_eval(self):
417 self.assertEqual(eval('1+1'), 2)
418 self.assertEqual(eval(' 1+1\n'), 2)
419 globals = {'a': 1, 'b': 2}
420 locals = {'b': 200, 'c': 300}
421 self.assertEqual(eval('a', globals) , 1)
422 self.assertEqual(eval('a', globals, locals), 1)
423 self.assertEqual(eval('b', globals, locals), 200)
424 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000425 globals = {'a': 1, 'b': 2}
426 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000427 bom = b'\xef\xbb\xbf'
428 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000429 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000430 self.assertRaises(TypeError, eval)
431 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000432 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000433
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000434 def test_general_eval(self):
435 # Tests that general mappings can be used for the locals argument
436
437 class M:
438 "Test mapping interface versus possible calls from eval()."
439 def __getitem__(self, key):
440 if key == 'a':
441 return 12
442 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000443 def keys(self):
444 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000445
446 m = M()
447 g = globals()
448 self.assertEqual(eval('a', g, m), 12)
449 self.assertRaises(NameError, eval, 'b', g, m)
450 self.assertEqual(eval('dir()', g, m), list('xyz'))
451 self.assertEqual(eval('globals()', g, m), g)
452 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000453 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000454 class A:
455 "Non-mapping"
456 pass
457 m = A()
458 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000459
460 # Verify that dict subclasses work as well
461 class D(dict):
462 def __getitem__(self, key):
463 if key == 'a':
464 return 12
465 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000466 def keys(self):
467 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000468
469 d = D()
470 self.assertEqual(eval('a', g, d), 12)
471 self.assertRaises(NameError, eval, 'b', g, d)
472 self.assertEqual(eval('dir()', g, d), list('xyz'))
473 self.assertEqual(eval('globals()', g, d), g)
474 self.assertEqual(eval('locals()', g, d), d)
475
476 # Verify locals stores (used by list comps)
477 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000478 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000479
480 class SpreadSheet:
481 "Sample application showing nested, calculated lookups."
482 _cells = {}
483 def __setitem__(self, key, formula):
484 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000485 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000486 return eval(self._cells[key], globals(), self)
487
488 ss = SpreadSheet()
489 ss['a1'] = '5'
490 ss['a2'] = 'a1*6'
491 ss['a3'] = 'a2*7'
492 self.assertEqual(ss['a3'], 210)
493
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000494 # Verify that dir() catches a non-list returned by eval
495 # SF bug #1004669
496 class C:
497 def __getitem__(self, item):
498 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000499 def keys(self):
500 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000501 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
502
Georg Brandl7cae87c2006-09-06 06:51:57 +0000503 def test_exec(self):
504 g = {}
505 exec('z = 1', g)
506 if '__builtins__' in g:
507 del g['__builtins__']
508 self.assertEqual(g, {'z': 1})
509
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000510 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000511 if '__builtins__' in g:
512 del g['__builtins__']
513 self.assertEqual(g, {'z': 2})
514 g = {}
515 l = {}
516
Brett Cannon77628992010-03-20 20:59:33 +0000517 with check_warnings():
518 warnings.filterwarnings("ignore", "global statement",
519 module="<string>")
520 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000521 if '__builtins__' in g:
522 del g['__builtins__']
523 if '__builtins__' in l:
524 del l['__builtins__']
525 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
526
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000527 def test_exec_redirected(self):
528 savestdout = sys.stdout
529 sys.stdout = None # Whatever that cannot flush()
530 try:
531 # Used to raise SystemError('error return without exception set')
532 exec('a')
533 except NameError:
534 pass
535 finally:
536 sys.stdout = savestdout
537
Walter Dörwald919497e2003-01-19 16:23:59 +0000538 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000539 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
540 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
541 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
542 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
543 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000544 def identity(item):
545 return 1
546 filter(identity, Squares(5))
547 self.assertRaises(TypeError, filter)
548 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000549 def __getitem__(self, index):
550 if index<4:
551 return 42
552 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000553 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000554 def badfunc():
555 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000556 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000557
Walter Dörwaldbf517072003-01-27 15:57:14 +0000558 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000559 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
560 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
561 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000562
Walter Dörwald919497e2003-01-19 16:23:59 +0000563 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000564 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000565 self.assertRaises(TypeError, getattr, sys, 1)
566 self.assertRaises(TypeError, getattr, sys, 1, "foo")
567 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000568 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000569 # unicode surrogates are not encodable to the default encoding (utf8)
570 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000571
572 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000573 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000574 self.assertRaises(TypeError, hasattr, sys, 1)
575 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000576 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000577
Benjamin Peterson17689992010-08-24 03:26:23 +0000578 # Check that hasattr propagates all exceptions outside of
579 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000580 class A:
581 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000582 raise SystemExit
583 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000584 class B:
585 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000586 raise ValueError
587 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000588
Walter Dörwald919497e2003-01-19 16:23:59 +0000589 def test_hash(self):
590 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000591 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000592 self.assertEqual(hash(1), hash(1.0))
593 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000594 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000595 hash((0,1,2,3))
596 def f(): pass
597 self.assertRaises(TypeError, hash, [])
598 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000599 # Bug 1536021: Allow hash to return long objects
600 class X:
601 def __hash__(self):
602 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000603 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000604 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000605 def __hash__(self):
606 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000607 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000608
609 def test_hex(self):
610 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000611 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000612 self.assertRaises(TypeError, hex, {})
613
614 def test_id(self):
615 id(None)
616 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000617 id(1.0)
618 id('spam')
619 id((0,1,2,3))
620 id([0,1,2,3])
621 id({'spam': 1, 'eggs': 2, 'ham': 3})
622
Guido van Rossuma88a0332007-02-26 16:59:55 +0000623 # Test input() later, alphabetized as if it were raw_input
624
Walter Dörwald919497e2003-01-19 16:23:59 +0000625 def test_iter(self):
626 self.assertRaises(TypeError, iter)
627 self.assertRaises(TypeError, iter, 42, 42)
628 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000629 for l in lists:
630 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000631 self.assertEqual(next(i), '1')
632 self.assertEqual(next(i), '2')
633 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000634
635 def test_isinstance(self):
636 class C:
637 pass
638 class D(C):
639 pass
640 class E:
641 pass
642 c = C()
643 d = D()
644 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000645 self.assertTrue(isinstance(c, C))
646 self.assertTrue(isinstance(d, C))
647 self.assertTrue(not isinstance(e, C))
648 self.assertTrue(not isinstance(c, D))
649 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000650 self.assertRaises(TypeError, isinstance, E, 'foo')
651 self.assertRaises(TypeError, isinstance)
652
653 def test_issubclass(self):
654 class C:
655 pass
656 class D(C):
657 pass
658 class E:
659 pass
660 c = C()
661 d = D()
662 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000663 self.assertTrue(issubclass(D, C))
664 self.assertTrue(issubclass(C, C))
665 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000666 self.assertRaises(TypeError, issubclass, 'foo', E)
667 self.assertRaises(TypeError, issubclass, E, 'foo')
668 self.assertRaises(TypeError, issubclass)
669
670 def test_len(self):
671 self.assertEqual(len('123'), 3)
672 self.assertEqual(len(()), 0)
673 self.assertEqual(len((1, 2, 3, 4)), 4)
674 self.assertEqual(len([1, 2, 3, 4]), 4)
675 self.assertEqual(len({}), 0)
676 self.assertEqual(len({'a':1, 'b': 2}), 2)
677 class BadSeq:
678 def __len__(self):
679 raise ValueError
680 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000681 class InvalidLen:
682 def __len__(self):
683 return None
684 self.assertRaises(TypeError, len, InvalidLen())
685 class FloatLen:
686 def __len__(self):
687 return 4.5
688 self.assertRaises(TypeError, len, FloatLen())
689 class HugeLen:
690 def __len__(self):
691 return sys.maxsize + 1
692 self.assertRaises(OverflowError, len, HugeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000693 class NoLenMethod(object): pass
694 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000695
Walter Dörwald919497e2003-01-19 16:23:59 +0000696 def test_map(self):
697 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000698 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000699 [1, 4, 9]
700 )
701 try:
702 from math import sqrt
703 except ImportError:
704 def sqrt(x):
705 return pow(x, 0.5)
706 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000707 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000708 [[4.0, 2.0], [9.0, 3.0]]
709 )
710 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000711 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000712 [10, 4, 6]
713 )
714
715 def plus(*v):
716 accu = 0
717 for i in v: accu = accu + i
718 return accu
719 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000720 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000721 [1, 3, 7]
722 )
723 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000724 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000725 [1+4, 3+9, 7+2]
726 )
727 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000728 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000729 [1+4+1, 3+9+1, 7+2+0]
730 )
731 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000732 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000733 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
734 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000735 def Max(a, b):
736 if a is None:
737 return b
738 if b is None:
739 return a
740 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000741 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000742 list(map(Max, Squares(3), Squares(2))),
743 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000744 )
745 self.assertRaises(TypeError, map)
746 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000747 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000748 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000749 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000750 yield None
751 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000752 def badfunc(x):
753 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000754 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000755
756 def test_max(self):
757 self.assertEqual(max('123123'), '3')
758 self.assertEqual(max(1, 2, 3), 3)
759 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
760 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
761
Guido van Rossume2a383d2007-01-15 16:59:06 +0000762 self.assertEqual(max(1, 2, 3.0), 3.0)
763 self.assertEqual(max(1, 2.0, 3), 3)
764 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000765
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000766 for stmt in (
767 "max(key=int)", # no args
768 "max(1, key=int)", # single arg not iterable
769 "max(1, 2, keystone=int)", # wrong keyword
770 "max(1, 2, key=int, abc=int)", # two many keywords
771 "max(1, 2, key=1)", # keyfunc is not callable
772 ):
Tim Peters7f061872004-12-07 21:17:46 +0000773 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000774 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000775 except TypeError:
776 pass
777 else:
778 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000779
780 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
781 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
782 self.assertEqual(max(1, 2, key=neg), 1) # two elems
783
784 data = [random.randrange(200) for i in range(100)]
785 keys = dict((elem, random.randrange(50)) for elem in data)
786 f = keys.__getitem__
787 self.assertEqual(max(data, key=f),
788 sorted(reversed(data), key=f)[-1])
789
Walter Dörwald919497e2003-01-19 16:23:59 +0000790 def test_min(self):
791 self.assertEqual(min('123123'), '1')
792 self.assertEqual(min(1, 2, 3), 1)
793 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
794 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
795
Guido van Rossume2a383d2007-01-15 16:59:06 +0000796 self.assertEqual(min(1, 2, 3.0), 1)
797 self.assertEqual(min(1, 2.0, 3), 1)
798 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000799
800 self.assertRaises(TypeError, min)
801 self.assertRaises(TypeError, min, 42)
802 self.assertRaises(ValueError, min, ())
803 class BadSeq:
804 def __getitem__(self, index):
805 raise ValueError
806 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000807
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000808 for stmt in (
809 "min(key=int)", # no args
810 "min(1, key=int)", # single arg not iterable
811 "min(1, 2, keystone=int)", # wrong keyword
812 "min(1, 2, key=int, abc=int)", # two many keywords
813 "min(1, 2, key=1)", # keyfunc is not callable
814 ):
Tim Peters7f061872004-12-07 21:17:46 +0000815 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000816 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000817 except TypeError:
818 pass
819 else:
820 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000821
822 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
823 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
824 self.assertEqual(min(1, 2, key=neg), 2) # two elems
825
826 data = [random.randrange(200) for i in range(100)]
827 keys = dict((elem, random.randrange(50)) for elem in data)
828 f = keys.__getitem__
829 self.assertEqual(min(data, key=f),
830 sorted(data, key=f)[0])
831
Georg Brandla18af4e2007-04-21 15:47:16 +0000832 def test_next(self):
833 it = iter(range(2))
834 self.assertEqual(next(it), 0)
835 self.assertEqual(next(it), 1)
836 self.assertRaises(StopIteration, next, it)
837 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000838 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000839
840 class Iter(object):
841 def __iter__(self):
842 return self
843 def __next__(self):
844 raise StopIteration
845
846 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +0000847 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000848 self.assertRaises(StopIteration, next, it)
849
850 def gen():
851 yield 1
852 return
853
854 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000855 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +0000856 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000857 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000858
Walter Dörwald919497e2003-01-19 16:23:59 +0000859 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000860 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000861 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000862 self.assertRaises(TypeError, oct, ())
863
864 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000865 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000866 fp = open(TESTFN, 'w')
867 try:
868 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000869 fp.write('The quick brown fox jumps over the lazy dog')
870 fp.write('.\n')
871 fp.write('Dear John\n')
872 fp.write('XXX'*100)
873 fp.write('YYY'*100)
874 finally:
875 fp.close()
876
877 def test_open(self):
878 self.write_testfile()
879 fp = open(TESTFN, 'r')
880 try:
881 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000882 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
883 self.assertEqual(fp.readline(4), 'Dear')
884 self.assertEqual(fp.readline(100), ' John\n')
885 self.assertEqual(fp.read(300), 'XXX'*100)
886 self.assertEqual(fp.read(1000), 'YYY'*100)
887 finally:
888 fp.close()
889 unlink(TESTFN)
890
891 def test_ord(self):
892 self.assertEqual(ord(' '), 32)
893 self.assertEqual(ord('A'), 65)
894 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000895 self.assertEqual(ord('\x80'), 128)
896 self.assertEqual(ord('\xff'), 255)
897
898 self.assertEqual(ord(b' '), 32)
899 self.assertEqual(ord(b'A'), 65)
900 self.assertEqual(ord(b'a'), 97)
901 self.assertEqual(ord(b'\x80'), 128)
902 self.assertEqual(ord(b'\xff'), 255)
903
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000904 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +0000905 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000906
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000907 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
908 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
909 self.assertEqual(ord("\U00010000"), 0x00010000)
910 self.assertEqual(ord("\U00010001"), 0x00010001)
911 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
912 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
913 self.assertEqual(ord("\U00100000"), 0x00100000)
914 self.assertEqual(ord("\U00100001"), 0x00100001)
915 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
916 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
917
Walter Dörwald919497e2003-01-19 16:23:59 +0000918 def test_pow(self):
919 self.assertEqual(pow(0,0), 1)
920 self.assertEqual(pow(0,1), 0)
921 self.assertEqual(pow(1,0), 1)
922 self.assertEqual(pow(1,1), 1)
923
924 self.assertEqual(pow(2,0), 1)
925 self.assertEqual(pow(2,10), 1024)
926 self.assertEqual(pow(2,20), 1024*1024)
927 self.assertEqual(pow(2,30), 1024*1024*1024)
928
929 self.assertEqual(pow(-2,0), 1)
930 self.assertEqual(pow(-2,1), -2)
931 self.assertEqual(pow(-2,2), 4)
932 self.assertEqual(pow(-2,3), -8)
933
Walter Dörwald919497e2003-01-19 16:23:59 +0000934 self.assertAlmostEqual(pow(0.,0), 1.)
935 self.assertAlmostEqual(pow(0.,1), 0.)
936 self.assertAlmostEqual(pow(1.,0), 1.)
937 self.assertAlmostEqual(pow(1.,1), 1.)
938
939 self.assertAlmostEqual(pow(2.,0), 1.)
940 self.assertAlmostEqual(pow(2.,10), 1024.)
941 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
942 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
943
944 self.assertAlmostEqual(pow(-2.,0), 1.)
945 self.assertAlmostEqual(pow(-2.,1), -2.)
946 self.assertAlmostEqual(pow(-2.,2), 4.)
947 self.assertAlmostEqual(pow(-2.,3), -8.)
948
Mark Dickinson5c2db372009-12-05 20:28:34 +0000949 for x in 2, 2.0:
950 for y in 10, 10.0:
951 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +0000952 if isinstance(x, float) or \
953 isinstance(y, float) or \
954 isinstance(z, float):
955 self.assertRaises(TypeError, pow, x, y, z)
956 else:
957 self.assertAlmostEqual(pow(x, y, z), 24.0)
958
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +0000959 self.assertAlmostEqual(pow(-1, 0.5), 1j)
960 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
961
Walter Dörwald919497e2003-01-19 16:23:59 +0000962 self.assertRaises(TypeError, pow, -1, -2, 3)
963 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000964
965 self.assertRaises(TypeError, pow)
966
Guido van Rossuma88a0332007-02-26 16:59:55 +0000967 def test_input(self):
968 self.write_testfile()
969 fp = open(TESTFN, 'r')
970 savestdin = sys.stdin
971 savestdout = sys.stdout # Eats the echo
972 try:
973 sys.stdin = fp
974 sys.stdout = BitBucket()
975 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000976 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
977 self.assertEqual(input('testing\n'), 'Dear John')
978
979 # SF 1535165: don't segfault on closed stdin
980 # sys.stdout must be a regular file for triggering
981 sys.stdout = savestdout
982 sys.stdin.close()
983 self.assertRaises(ValueError, input)
984
985 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +0000986 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000987 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +0000988 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +0000989 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +0000990 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +0000991 self.assertRaises(EOFError, input)
992
993 del sys.stdout
994 self.assertRaises(RuntimeError, input, 'prompt')
995 del sys.stdin
996 self.assertRaises(RuntimeError, input, 'prompt')
997 finally:
998 sys.stdin = savestdin
999 sys.stdout = savestdout
1000 fp.close()
1001 unlink(TESTFN)
1002
Walter Dörwald919497e2003-01-19 16:23:59 +00001003 def test_repr(self):
1004 self.assertEqual(repr(''), '\'\'')
1005 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001006 self.assertEqual(repr(()), '()')
1007 self.assertEqual(repr([]), '[]')
1008 self.assertEqual(repr({}), '{}')
1009 a = []
1010 a.append(a)
1011 self.assertEqual(repr(a), '[[...]]')
1012 a = {}
1013 a[0] = a
1014 self.assertEqual(repr(a), '{0: {...}}')
1015
1016 def test_round(self):
1017 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001018 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001019 self.assertEqual(round(1.0), 1.0)
1020 self.assertEqual(round(10.0), 10.0)
1021 self.assertEqual(round(1000000000.0), 1000000000.0)
1022 self.assertEqual(round(1e20), 1e20)
1023
1024 self.assertEqual(round(-1.0), -1.0)
1025 self.assertEqual(round(-10.0), -10.0)
1026 self.assertEqual(round(-1000000000.0), -1000000000.0)
1027 self.assertEqual(round(-1e20), -1e20)
1028
1029 self.assertEqual(round(0.1), 0.0)
1030 self.assertEqual(round(1.1), 1.0)
1031 self.assertEqual(round(10.1), 10.0)
1032 self.assertEqual(round(1000000000.1), 1000000000.0)
1033
1034 self.assertEqual(round(-1.1), -1.0)
1035 self.assertEqual(round(-10.1), -10.0)
1036 self.assertEqual(round(-1000000000.1), -1000000000.0)
1037
1038 self.assertEqual(round(0.9), 1.0)
1039 self.assertEqual(round(9.9), 10.0)
1040 self.assertEqual(round(999999999.9), 1000000000.0)
1041
1042 self.assertEqual(round(-0.9), -1.0)
1043 self.assertEqual(round(-9.9), -10.0)
1044 self.assertEqual(round(-999999999.9), -1000000000.0)
1045
1046 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001047 self.assertEqual(type(round(-8.0, -1)), float)
1048
1049 self.assertEqual(type(round(-8.0, 0)), float)
1050 self.assertEqual(type(round(-8.0, 1)), float)
1051
1052 # Check even / odd rounding behaviour
1053 self.assertEqual(round(5.5), 6)
1054 self.assertEqual(round(6.5), 6)
1055 self.assertEqual(round(-5.5), -6)
1056 self.assertEqual(round(-6.5), -6)
1057
1058 # Check behavior on ints
1059 self.assertEqual(round(0), 0)
1060 self.assertEqual(round(8), 8)
1061 self.assertEqual(round(-8), -8)
1062 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001063 self.assertEqual(type(round(-8, -1)), int)
1064 self.assertEqual(type(round(-8, 0)), int)
1065 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001066
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001067 # test new kwargs
1068 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1069
Walter Dörwald919497e2003-01-19 16:23:59 +00001070 self.assertRaises(TypeError, round)
1071
Alex Martelliae211f92007-08-22 23:21:33 +00001072 # test generic rounding delegation for reals
1073 class TestRound:
1074 def __round__(self):
1075 return 23
1076
1077 class TestNoRound:
1078 pass
1079
1080 self.assertEqual(round(TestRound()), 23)
1081
1082 self.assertRaises(TypeError, round, 1, 2, 3)
1083 self.assertRaises(TypeError, round, TestNoRound())
1084
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001085 t = TestNoRound()
1086 t.__round__ = lambda *args: args
1087 self.assertRaises(TypeError, round, t)
1088 self.assertRaises(TypeError, round, t, 0)
1089
Mark Dickinsonad731b92009-11-09 17:12:30 +00001090 # Some versions of glibc for alpha have a bug that affects
1091 # float -> integer rounding (floor, ceil, rint, round) for
1092 # values in the range [2**52, 2**53). See:
1093 #
1094 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1095 #
1096 # We skip this test on Linux/alpha if it would fail.
1097 linux_alpha = (platform.system().startswith('Linux') and
1098 platform.machine().startswith('alpha'))
1099 system_round_bug = round(5e15+1) != 5e15+1
1100 @unittest.skipIf(linux_alpha and system_round_bug,
1101 "test will fail; failure is probably due to a "
1102 "buggy system round function")
1103 def test_round_large(self):
1104 # Issue #1869: integral floats should remain unchanged
1105 self.assertEqual(round(5e15-1), 5e15-1)
1106 self.assertEqual(round(5e15), 5e15)
1107 self.assertEqual(round(5e15+1), 5e15+1)
1108 self.assertEqual(round(5e15+2), 5e15+2)
1109 self.assertEqual(round(5e15+3), 5e15+3)
1110
Walter Dörwald919497e2003-01-19 16:23:59 +00001111 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001112 setattr(sys, 'spam', 1)
1113 self.assertEqual(sys.spam, 1)
1114 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1115 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001116
Walter Dörwald919497e2003-01-19 16:23:59 +00001117
Alex Martellia70b1912003-04-22 08:12:33 +00001118 def test_sum(self):
1119 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001120 self.assertEqual(sum(list(range(2,8))), 27)
1121 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001122 self.assertEqual(sum(Squares(10)), 285)
1123 self.assertEqual(sum(iter(Squares(10))), 285)
1124 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1125
1126 self.assertRaises(TypeError, sum)
1127 self.assertRaises(TypeError, sum, 42)
1128 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1129 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001130 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1131 values = [bytearray(b'a'), bytearray(b'b')]
1132 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001133 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1134 self.assertRaises(TypeError, sum, [{2:3}])
1135 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1136
1137 class BadSeq:
1138 def __getitem__(self, index):
1139 raise ValueError
1140 self.assertRaises(ValueError, sum, BadSeq())
1141
Mark Dickinson3a22b472009-10-17 21:48:16 +00001142 empty = []
1143 sum(([x] for x in range(10)), empty)
1144 self.assertEqual(empty, [])
1145
Walter Dörwald919497e2003-01-19 16:23:59 +00001146 def test_type(self):
1147 self.assertEqual(type(''), type('123'))
1148 self.assertNotEqual(type(''), type(()))
1149
Guido van Rossumfee7b932005-01-16 00:21:28 +00001150 # We don't want self in vars(), so these are static methods
1151
1152 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001153 def get_vars_f0():
1154 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001155
Guido van Rossumfee7b932005-01-16 00:21:28 +00001156 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001157 def get_vars_f2():
1158 BuiltinTest.get_vars_f0()
1159 a = 1
1160 b = 2
1161 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001162
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001163 class C_get_vars(object):
1164 def getDict(self):
1165 return {'a':2}
1166 __dict__ = property(fget=getDict)
1167
Walter Dörwald919497e2003-01-19 16:23:59 +00001168 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001169 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001170 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001171 self.assertEqual(self.get_vars_f0(), {})
1172 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1173 self.assertRaises(TypeError, vars, 42, 42)
1174 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001175 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001176
1177 def test_zip(self):
1178 a = (1, 2, 3)
1179 b = (4, 5, 6)
1180 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001181 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001182 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001183 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001184 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001185 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001186 class I:
1187 def __getitem__(self, i):
1188 if i < 0 or i > 2: raise IndexError
1189 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001190 self.assertEqual(list(zip(a, I())), t)
1191 self.assertEqual(list(zip()), [])
1192 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001193 self.assertRaises(TypeError, zip, None)
1194 class G:
1195 pass
1196 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001197 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001198
1199 # Make sure zip doesn't try to allocate a billion elements for the
1200 # result list when one of its arguments doesn't say how long it is.
1201 # A MemoryError is the most likely failure mode.
1202 class SequenceWithoutALength:
1203 def __getitem__(self, i):
1204 if i == 5:
1205 raise IndexError
1206 else:
1207 return i
1208 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001209 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001210 list(enumerate(range(5)))
1211 )
1212
1213 class BadSeq:
1214 def __getitem__(self, i):
1215 if i == 5:
1216 raise ValueError
1217 else:
1218 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001219 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001220
Eric Smithe4d63172010-09-13 20:48:43 +00001221 def test_format(self):
1222 # Test the basic machinery of the format() builtin. Don't test
1223 # the specifics of the various formatters
1224 self.assertEqual(format(3, ''), '3')
1225
1226 # Returns some classes to use for various tests. There's
1227 # an old-style version, and a new-style version
1228 def classes_new():
1229 class A(object):
1230 def __init__(self, x):
1231 self.x = x
1232 def __format__(self, format_spec):
1233 return str(self.x) + format_spec
1234 class DerivedFromA(A):
1235 pass
1236
1237 class Simple(object): pass
1238 class DerivedFromSimple(Simple):
1239 def __init__(self, x):
1240 self.x = x
1241 def __format__(self, format_spec):
1242 return str(self.x) + format_spec
1243 class DerivedFromSimple2(DerivedFromSimple): pass
1244 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1245
1246 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1247 self.assertEqual(format(A(3), 'spec'), '3spec')
1248 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1249 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1250 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1251 '10abcdef')
1252
1253 class_test(*classes_new())
1254
1255 def empty_format_spec(value):
1256 # test that:
1257 # format(x, '') == str(x)
1258 # format(x) == str(x)
1259 self.assertEqual(format(value, ""), str(value))
1260 self.assertEqual(format(value), str(value))
1261
1262 # for builtin types, format(x, "") == str(x)
1263 empty_format_spec(17**13)
1264 empty_format_spec(1.0)
1265 empty_format_spec(3.1415e104)
1266 empty_format_spec(-3.1415e104)
1267 empty_format_spec(3.1415e-104)
1268 empty_format_spec(-3.1415e-104)
1269 empty_format_spec(object)
1270 empty_format_spec(None)
1271
1272 # TypeError because self.__format__ returns the wrong type
1273 class BadFormatResult:
1274 def __format__(self, format_spec):
1275 return 1.0
1276 self.assertRaises(TypeError, format, BadFormatResult(), "")
1277
1278 # TypeError because format_spec is not unicode or str
1279 self.assertRaises(TypeError, format, object(), 4)
1280 self.assertRaises(TypeError, format, object(), object())
1281
1282 # tests for object.__format__ really belong elsewhere, but
1283 # there's no good place to put them
1284 x = object().__format__('')
1285 self.assertTrue(x.startswith('<object object at'))
1286
1287 # first argument to object.__format__ must be string
1288 self.assertRaises(TypeError, object().__format__, 3)
1289 self.assertRaises(TypeError, object().__format__, object())
1290 self.assertRaises(TypeError, object().__format__, None)
1291
1292 # --------------------------------------------------------------------
1293 # Issue #7994: object.__format__ with a non-empty format string is
Eric V. Smithb9cd3532011-03-12 10:08:48 -05001294 # deprecated
Eric Smithe4d63172010-09-13 20:48:43 +00001295 def test_deprecated_format_string(obj, fmt_str, should_raise_warning):
1296 with warnings.catch_warnings(record=True) as w:
Eric V. Smithb9cd3532011-03-12 10:08:48 -05001297 warnings.simplefilter("always", DeprecationWarning)
Eric Smithe4d63172010-09-13 20:48:43 +00001298 format(obj, fmt_str)
1299 if should_raise_warning:
1300 self.assertEqual(len(w), 1)
Eric V. Smithb9cd3532011-03-12 10:08:48 -05001301 self.assertIsInstance(w[0].message, DeprecationWarning)
Eric Smithe4d63172010-09-13 20:48:43 +00001302 self.assertIn('object.__format__ with a non-empty format '
1303 'string', str(w[0].message))
1304 else:
1305 self.assertEqual(len(w), 0)
1306
1307 fmt_strs = ['', 's']
1308
1309 class A:
1310 def __format__(self, fmt_str):
1311 return format('', fmt_str)
1312
1313 for fmt_str in fmt_strs:
1314 test_deprecated_format_string(A(), fmt_str, False)
1315
1316 class B:
1317 pass
1318
1319 class C(object):
1320 pass
1321
1322 for cls in [object, B, C]:
1323 for fmt_str in fmt_strs:
1324 test_deprecated_format_string(cls(), fmt_str, len(fmt_str) != 0)
1325 # --------------------------------------------------------------------
1326
1327 # make sure we can take a subclass of str as a format spec
1328 class DerivedFromStr(str): pass
1329 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1330
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001331 def test_bin(self):
1332 self.assertEqual(bin(0), '0b0')
1333 self.assertEqual(bin(1), '0b1')
1334 self.assertEqual(bin(-1), '-0b1')
1335 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1336 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1337 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1338 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1339
Georg Brandl953152f2009-07-22 12:03:59 +00001340 def test_bytearray_translate(self):
1341 x = bytearray(b"abc")
1342 self.assertRaises(ValueError, x.translate, b"1", 1)
1343 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1344
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001345 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001346 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001347 tp = type(const)
1348 self.assertIs(tp(), const)
1349 self.assertRaises(TypeError, tp, 1, 2)
1350 self.assertRaises(TypeError, tp, a=1, b=2)
1351
Raymond Hettinger64958a12003-12-17 20:43:33 +00001352class TestSorted(unittest.TestCase):
1353
1354 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001355 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001356 copy = data[:]
1357 random.shuffle(copy)
1358 self.assertEqual(data, sorted(copy))
1359 self.assertNotEqual(data, copy)
1360
1361 data.reverse()
1362 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001363 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1364 self.assertNotEqual(data, copy)
1365 random.shuffle(copy)
1366 self.assertEqual(data, sorted(copy, reverse=1))
1367 self.assertNotEqual(data, copy)
1368
1369 def test_inputtypes(self):
1370 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001371 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001372 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001373 self.assertEqual(sorted(s), sorted(T(s)))
1374
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001375 s = ''.join(set(s)) # unique letters only
1376 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001377 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001378 self.assertEqual(sorted(s), sorted(T(s)))
1379
1380 def test_baddecorator(self):
1381 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1382 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1383
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001384def test_main(verbose=None):
1385 test_classes = (BuiltinTest, TestSorted)
1386
1387 run_unittest(*test_classes)
1388
1389 # verify reference counting
1390 if verbose and hasattr(sys, "gettotalrefcount"):
1391 import gc
1392 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001393 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001394 run_unittest(*test_classes)
1395 gc.collect()
1396 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001397 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001398
Walter Dörwald919497e2003-01-19 16:23:59 +00001399
1400if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001401 test_main(verbose=True)