blob: 6613ca3a8ca5737de3ea8825e0d8d68c8298c83a [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
Victor Stinnerf86a5e82012-06-05 13:43:22 +02003import ast
4import builtins
Benjamin Peterson076e0312010-08-23 21:58:59 +00005import collections
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07006import decimal
7import fractions
Benjamin Peterson076e0312010-08-23 21:58:59 +00008import io
Victor Stinnerf86a5e82012-06-05 13:43:22 +02009import locale
Antoine Pitrou0d776b12011-11-06 00:34:26 +010010import os
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000011import pickle
Victor Stinnerf86a5e82012-06-05 13:43:22 +020012import platform
13import random
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +020014import re
Victor Stinnerf86a5e82012-06-05 13:43:22 +020015import sys
16import traceback
17import types
18import unittest
19import warnings
20from operator import neg
Victor Stinnerd6debb22017-03-27 16:05:26 +020021from test.support import TESTFN, unlink, check_warnings
Berker Peksagce643912015-05-06 06:33:17 +030022from test.support.script_helper import assert_python_ok
Antoine Pitrou0d776b12011-11-06 00:34:26 +010023try:
Antoine Pitrou772add72011-11-06 02:37:42 +010024 import pty, signal
Antoine Pitrou0d776b12011-11-06 00:34:26 +010025except ImportError:
Antoine Pitrou772add72011-11-06 02:37:42 +010026 pty = signal = None
Guido van Rossum3bead091992-01-27 17:00:37 +000027
Guido van Rossum3bead091992-01-27 17:00:37 +000028
Walter Dörwald919497e2003-01-19 16:23:59 +000029class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000030
Walter Dörwald919497e2003-01-19 16:23:59 +000031 def __init__(self, max):
32 self.max = max
33 self.sofar = []
34
35 def __len__(self): return len(self.sofar)
36
37 def __getitem__(self, i):
38 if not 0 <= i < self.max: raise IndexError
39 n = len(self.sofar)
40 while n <= i:
41 self.sofar.append(n*n)
42 n += 1
43 return self.sofar[i]
44
45class StrSquares:
46
47 def __init__(self, max):
48 self.max = max
49 self.sofar = []
50
51 def __len__(self):
52 return len(self.sofar)
53
54 def __getitem__(self, i):
55 if not 0 <= i < self.max:
56 raise IndexError
57 n = len(self.sofar)
58 while n <= i:
59 self.sofar.append(str(n*n))
60 n += 1
61 return self.sofar[i]
62
63class BitBucket:
64 def write(self, line):
65 pass
66
Facundo Batista2336bdd2008-01-19 19:12:01 +000067test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000068 ('0', 0),
69 ('1', 1),
70 ('9', 9),
71 ('10', 10),
72 ('99', 99),
73 ('100', 100),
74 ('314', 314),
75 (' 314', 314),
76 ('314 ', 314),
77 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000078 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000079 (' 1x', ValueError),
80 (' 1 ', 1),
81 (' 1\02 ', ValueError),
82 ('', ValueError),
83 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000084 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -040085 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000086 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000087]
88
Facundo Batista2336bdd2008-01-19 19:12:01 +000089test_conv_sign = [
90 ('0', 0),
91 ('1', 1),
92 ('9', 9),
93 ('10', 10),
94 ('99', 99),
95 ('100', 100),
96 ('314', 314),
97 (' 314', ValueError),
98 ('314 ', 314),
99 (' \t\t 314 \t\t ', ValueError),
100 (repr(sys.maxsize), sys.maxsize),
101 (' 1x', ValueError),
102 (' 1 ', ValueError),
103 (' 1\02 ', ValueError),
104 ('', ValueError),
105 (' ', ValueError),
106 (' \t\t ', ValueError),
R David Murray44b548d2016-09-08 13:59:53 -0400107 (str(br'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Facundo Batista2336bdd2008-01-19 19:12:01 +0000108 (chr(0x200), ValueError),
109]
110
Raymond Hettinger96229b12005-03-11 06:49:40 +0000111class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +0000112 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000113 raise RuntimeError
114
115class TestFailingIter:
116 def __iter__(self):
117 raise RuntimeError
118
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000119def filter_char(arg):
120 return ord(arg) > ord("d")
121
122def map_char(arg):
123 return chr(ord(arg)+1)
124
Walter Dörwald919497e2003-01-19 16:23:59 +0000125class BuiltinTest(unittest.TestCase):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000126 # Helper to check picklability
Serhiy Storchakabad12572014-12-15 14:03:42 +0200127 def check_iter_pickle(self, it, seq, proto):
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000128 itorg = it
Serhiy Storchakabad12572014-12-15 14:03:42 +0200129 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000130 it = pickle.loads(d)
131 self.assertEqual(type(itorg), type(it))
132 self.assertEqual(list(it), seq)
133
134 #test the iterator after dropping one from it
135 it = pickle.loads(d)
136 try:
137 next(it)
138 except StopIteration:
139 return
Serhiy Storchakabad12572014-12-15 14:03:42 +0200140 d = pickle.dumps(it, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000141 it = pickle.loads(d)
142 self.assertEqual(list(it), seq[1:])
Walter Dörwald919497e2003-01-19 16:23:59 +0000143
144 def test_import(self):
145 __import__('sys')
146 __import__('time')
147 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000148 __import__(name='sys')
149 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000150 self.assertRaises(ImportError, __import__, 'spamspam')
151 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000152 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000153 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +0000154
155 def test_abs(self):
156 # int
157 self.assertEqual(abs(0), 0)
158 self.assertEqual(abs(1234), 1234)
159 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000160 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000161 # float
162 self.assertEqual(abs(0.0), 0.0)
163 self.assertEqual(abs(3.14), 3.14)
164 self.assertEqual(abs(-3.14), 3.14)
Walter Dörwald919497e2003-01-19 16:23:59 +0000165 # str
166 self.assertRaises(TypeError, abs, 'a')
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000167 # bool
168 self.assertEqual(abs(True), 1)
169 self.assertEqual(abs(False), 0)
170 # other
171 self.assertRaises(TypeError, abs)
172 self.assertRaises(TypeError, abs, None)
173 class AbsClass(object):
174 def __abs__(self):
175 return -5
176 self.assertEqual(abs(AbsClass()), -5)
Walter Dörwald919497e2003-01-19 16:23:59 +0000177
Raymond Hettinger96229b12005-03-11 06:49:40 +0000178 def test_all(self):
179 self.assertEqual(all([2, 4, 6]), True)
180 self.assertEqual(all([2, None, 6]), False)
181 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
182 self.assertRaises(RuntimeError, all, TestFailingIter())
183 self.assertRaises(TypeError, all, 10) # Non-iterable
184 self.assertRaises(TypeError, all) # No args
185 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
186 self.assertEqual(all([]), True) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200187 self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000188 S = [50, 60]
189 self.assertEqual(all(x > 42 for x in S), True)
190 S = [50, 40, 60]
191 self.assertEqual(all(x > 42 for x in S), False)
192
193 def test_any(self):
194 self.assertEqual(any([None, None, None]), False)
195 self.assertEqual(any([None, 4, None]), True)
196 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
R David Murray1acaf0b2013-02-06 09:56:19 -0500197 self.assertRaises(RuntimeError, any, TestFailingIter())
Raymond Hettinger96229b12005-03-11 06:49:40 +0000198 self.assertRaises(TypeError, any, 10) # Non-iterable
199 self.assertRaises(TypeError, any) # No args
200 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
201 self.assertEqual(any([]), False) # Empty iterator
Ezio Melotti0f4377c2013-02-21 23:15:40 +0200202 self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
Raymond Hettinger96229b12005-03-11 06:49:40 +0000203 S = [40, 60, 30]
204 self.assertEqual(any(x > 42 for x in S), True)
205 S = [10, 20, 30]
206 self.assertEqual(any(x > 42 for x in S), False)
207
Georg Brandl559e5d72008-06-11 18:37:52 +0000208 def test_ascii(self):
209 self.assertEqual(ascii(''), '\'\'')
210 self.assertEqual(ascii(0), '0')
Georg Brandl559e5d72008-06-11 18:37:52 +0000211 self.assertEqual(ascii(()), '()')
212 self.assertEqual(ascii([]), '[]')
213 self.assertEqual(ascii({}), '{}')
214 a = []
215 a.append(a)
216 self.assertEqual(ascii(a), '[[...]]')
217 a = {}
218 a[0] = a
219 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitroue4a18922010-09-09 20:30:23 +0000220 # Advanced checks for unicode strings
221 def _check_uni(s):
222 self.assertEqual(ascii(s), repr(s))
223 _check_uni("'")
224 _check_uni('"')
225 _check_uni('"\'')
226 _check_uni('\0')
227 _check_uni('\r\n\t .')
228 # Unprintable non-ASCII characters
229 _check_uni('\x85')
230 _check_uni('\u1fff')
231 _check_uni('\U00012fff')
232 # Lone surrogates
233 _check_uni('\ud800')
234 _check_uni('\udfff')
235 # Issue #9804: surrogates should be joined even for printable
236 # wide characters (UCS-2 builds).
237 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
238 # All together
239 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
240 self.assertEqual(ascii(s),
241 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000242
Thomas Wouters89f507f2006-12-13 04:49:30 +0000243 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000244 x = -sys.maxsize-1
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000245 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000246 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000247
Walter Dörwald919497e2003-01-19 16:23:59 +0000248 def test_callable(self):
Antoine Pitroue71362d2010-11-27 22:00:11 +0000249 self.assertTrue(callable(len))
250 self.assertFalse(callable("a"))
251 self.assertTrue(callable(callable))
252 self.assertTrue(callable(lambda x, y: x + y))
253 self.assertFalse(callable(__builtins__))
Walter Dörwald919497e2003-01-19 16:23:59 +0000254 def f(): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000255 self.assertTrue(callable(f))
256
257 class C1:
Walter Dörwald919497e2003-01-19 16:23:59 +0000258 def meth(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000259 self.assertTrue(callable(C1))
260 c = C1()
261 self.assertTrue(callable(c.meth))
262 self.assertFalse(callable(c))
263
264 # __call__ is looked up on the class, not the instance
265 c.__call__ = None
266 self.assertFalse(callable(c))
267 c.__call__ = lambda self: 0
268 self.assertFalse(callable(c))
269 del c.__call__
270 self.assertFalse(callable(c))
271
272 class C2(object):
Walter Dörwald919497e2003-01-19 16:23:59 +0000273 def __call__(self): pass
Antoine Pitroue71362d2010-11-27 22:00:11 +0000274 c2 = C2()
275 self.assertTrue(callable(c2))
276 c2.__call__ = None
277 self.assertTrue(callable(c2))
278 class C3(C2): pass
279 c3 = C3()
280 self.assertTrue(callable(c3))
Walter Dörwald919497e2003-01-19 16:23:59 +0000281
282 def test_chr(self):
283 self.assertEqual(chr(32), ' ')
284 self.assertEqual(chr(65), 'A')
285 self.assertEqual(chr(97), 'a')
286 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000287 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000288 self.assertEqual(chr(sys.maxunicode),
Ezio Melottia9860ae2011-10-04 19:06:00 +0300289 str('\\U0010ffff'.encode("ascii"), 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000290 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000291 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
292 self.assertEqual(chr(0x00010000), "\U00010000")
293 self.assertEqual(chr(0x00010001), "\U00010001")
294 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
295 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
296 self.assertEqual(chr(0x00100000), "\U00100000")
297 self.assertEqual(chr(0x00100001), "\U00100001")
298 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
299 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
300 self.assertRaises(ValueError, chr, -1)
301 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000302 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000303
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000304 def test_cmp(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000305 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000306
Walter Dörwald919497e2003-01-19 16:23:59 +0000307 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000308 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000309 bom = b'\xef\xbb\xbf'
310 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000311 compile(source='pass', filename='?', mode='exec')
312 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
313 compile('pass', '?', dont_inherit=1, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000314 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000315 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000316 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
317 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300318 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000319 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
320 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000321 compile('print("\xe5")\n', '', 'exec')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300322 self.assertRaises(ValueError, compile, chr(0), 'f', 'exec')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000323 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000324
Georg Brandl8334fd92010-12-04 10:26:46 +0000325 # test the optimize argument
326
327 codestr = '''def f():
328 """doc"""
329 try:
330 assert False
331 except AssertionError:
332 return (True, f.__doc__)
333 else:
334 return (False, f.__doc__)
335 '''
336 def f(): """doc"""
337 values = [(-1, __debug__, f.__doc__),
338 (0, True, 'doc'),
339 (1, False, 'doc'),
340 (2, False, None)]
341 for optval, debugval, docstring in values:
342 # test both direct compilation and compilation via AST
343 codeobjs = []
344 codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
345 tree = ast.parse(codestr)
346 codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
347 for code in codeobjs:
348 ns = {}
349 exec(code, ns)
350 rv = ns['f']()
351 self.assertEqual(rv, (debugval, docstring))
352
Walter Dörwald919497e2003-01-19 16:23:59 +0000353 def test_delattr(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000354 sys.spam = 1
355 delattr(sys, 'spam')
356 self.assertRaises(TypeError, delattr)
357
358 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000359 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000360 self.assertRaises(TypeError, dir, 42, 42)
361
Georg Brandle32b4222007-03-10 22:13:27 +0000362 # dir() - local scope
363 local_var = 1
Benjamin Peterson577473f2010-01-19 00:09:57 +0000364 self.assertIn('local_var', dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000365
366 # dir(module)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000367 self.assertIn('exit', dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000368
369 # dir(module_with_invalid__dict__)
Georg Brandle32b4222007-03-10 22:13:27 +0000370 class Foo(types.ModuleType):
371 __dict__ = 8
372 f = Foo("foo")
373 self.assertRaises(TypeError, dir, f)
374
375 # dir(type)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000376 self.assertIn("strip", dir(str))
377 self.assertNotIn("__mro__", dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000378
379 # dir(obj)
380 class Foo(object):
381 def __init__(self):
382 self.x = 7
383 self.y = 8
384 self.z = 9
385 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000386 self.assertIn("y", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000387
388 # dir(obj_no__dict__)
389 class Foo(object):
390 __slots__ = []
391 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000392 self.assertIn("__repr__", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000393
394 # dir(obj_no__class__with__dict__)
395 # (an ugly trick to cause getattr(f, "__class__") to fail)
396 class Foo(object):
397 __slots__ = ["__class__", "__dict__"]
398 def __init__(self):
399 self.bar = "wow"
400 f = Foo()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000401 self.assertNotIn("__repr__", dir(f))
402 self.assertIn("bar", dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000403
404 # dir(obj_using __dir__)
405 class Foo(object):
406 def __dir__(self):
407 return ["kan", "ga", "roo"]
408 f = Foo()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000409 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000410
Benjamin Peterson3bbb7222011-06-11 16:12:08 -0500411 # dir(obj__dir__tuple)
412 class Foo(object):
413 def __dir__(self):
414 return ("b", "c", "a")
415 res = dir(Foo())
416 self.assertIsInstance(res, list)
417 self.assertTrue(res == ["a", "b", "c"])
418
419 # dir(obj__dir__not_sequence)
Georg Brandle32b4222007-03-10 22:13:27 +0000420 class Foo(object):
421 def __dir__(self):
422 return 7
423 f = Foo()
424 self.assertRaises(TypeError, dir, f)
425
Collin Winter3eed7652007-08-14 17:53:54 +0000426 # dir(traceback)
427 try:
428 raise IndexError
429 except:
430 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
431
Benjamin Petersondac9ace2011-05-25 09:33:37 -0500432 # test that object has a __dir__()
433 self.assertEqual(sorted([].__dir__()), dir([]))
Collin Winter3eed7652007-08-14 17:53:54 +0000434
Walter Dörwald919497e2003-01-19 16:23:59 +0000435 def test_divmod(self):
436 self.assertEqual(divmod(12, 7), (1, 5))
437 self.assertEqual(divmod(-12, 7), (-2, 2))
438 self.assertEqual(divmod(12, -7), (-2, -2))
439 self.assertEqual(divmod(-12, -7), (1, -5))
440
Mark Dickinson5c2db372009-12-05 20:28:34 +0000441 self.assertEqual(divmod(-sys.maxsize-1, -1), (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000442
Eli Bendersky67ebabd2011-02-25 10:14:17 +0000443 for num, denom, exp_result in [ (3.25, 1.0, (3.0, 0.25)),
444 (-3.25, 1.0, (-4.0, 0.75)),
445 (3.25, -1.0, (-4.0, -0.75)),
446 (-3.25, -1.0, (3.0, -0.25))]:
447 result = divmod(num, denom)
448 self.assertAlmostEqual(result[0], exp_result[0])
449 self.assertAlmostEqual(result[1], exp_result[1])
Walter Dörwald919497e2003-01-19 16:23:59 +0000450
451 self.assertRaises(TypeError, divmod)
452
453 def test_eval(self):
454 self.assertEqual(eval('1+1'), 2)
455 self.assertEqual(eval(' 1+1\n'), 2)
456 globals = {'a': 1, 'b': 2}
457 locals = {'b': 200, 'c': 300}
458 self.assertEqual(eval('a', globals) , 1)
459 self.assertEqual(eval('a', globals, locals), 1)
460 self.assertEqual(eval('b', globals, locals), 200)
461 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000462 globals = {'a': 1, 'b': 2}
463 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000464 bom = b'\xef\xbb\xbf'
465 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000466 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000467 self.assertRaises(TypeError, eval)
468 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000469 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000470
Benjamin Peterson92722792012-12-15 12:51:05 -0500471 class X:
472 def __getitem__(self, key):
473 raise ValueError
474 self.assertRaises(ValueError, eval, "foo", {}, X())
475
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000476 def test_general_eval(self):
477 # Tests that general mappings can be used for the locals argument
478
479 class M:
480 "Test mapping interface versus possible calls from eval()."
481 def __getitem__(self, key):
482 if key == 'a':
483 return 12
484 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000485 def keys(self):
486 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000487
488 m = M()
489 g = globals()
490 self.assertEqual(eval('a', g, m), 12)
491 self.assertRaises(NameError, eval, 'b', g, m)
492 self.assertEqual(eval('dir()', g, m), list('xyz'))
493 self.assertEqual(eval('globals()', g, m), g)
494 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000495 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000496 class A:
497 "Non-mapping"
498 pass
499 m = A()
500 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000501
502 # Verify that dict subclasses work as well
503 class D(dict):
504 def __getitem__(self, key):
505 if key == 'a':
506 return 12
507 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000508 def keys(self):
509 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000510
511 d = D()
512 self.assertEqual(eval('a', g, d), 12)
513 self.assertRaises(NameError, eval, 'b', g, d)
514 self.assertEqual(eval('dir()', g, d), list('xyz'))
515 self.assertEqual(eval('globals()', g, d), g)
516 self.assertEqual(eval('locals()', g, d), d)
517
518 # Verify locals stores (used by list comps)
519 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000520 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000521
522 class SpreadSheet:
523 "Sample application showing nested, calculated lookups."
524 _cells = {}
525 def __setitem__(self, key, formula):
526 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000527 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000528 return eval(self._cells[key], globals(), self)
529
530 ss = SpreadSheet()
531 ss['a1'] = '5'
532 ss['a2'] = 'a1*6'
533 ss['a3'] = 'a2*7'
534 self.assertEqual(ss['a3'], 210)
535
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000536 # Verify that dir() catches a non-list returned by eval
537 # SF bug #1004669
538 class C:
539 def __getitem__(self, item):
540 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000541 def keys(self):
542 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000543 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
544
Georg Brandl7cae87c2006-09-06 06:51:57 +0000545 def test_exec(self):
546 g = {}
547 exec('z = 1', g)
548 if '__builtins__' in g:
549 del g['__builtins__']
550 self.assertEqual(g, {'z': 1})
551
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000552 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000553 if '__builtins__' in g:
554 del g['__builtins__']
555 self.assertEqual(g, {'z': 2})
556 g = {}
557 l = {}
558
Brett Cannon77628992010-03-20 20:59:33 +0000559 with check_warnings():
560 warnings.filterwarnings("ignore", "global statement",
561 module="<string>")
562 exec('global a; a = 1; b = 2', g, l)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000563 if '__builtins__' in g:
564 del g['__builtins__']
565 if '__builtins__' in l:
566 del l['__builtins__']
567 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
568
Victor Stinnerb0b22422012-04-19 00:57:45 +0200569 def test_exec_globals(self):
570 code = compile("print('Hello World!')", "", "exec")
571 # no builtin function
572 self.assertRaisesRegex(NameError, "name 'print' is not defined",
573 exec, code, {'__builtins__': {}})
574 # __builtins__ must be a mapping type
575 self.assertRaises(TypeError,
576 exec, code, {'__builtins__': 123})
577
578 # no __build_class__ function
579 code = compile("class A: pass", "", "exec")
580 self.assertRaisesRegex(NameError, "__build_class__ not found",
581 exec, code, {'__builtins__': {}})
582
583 class frozendict_error(Exception):
584 pass
585
586 class frozendict(dict):
587 def __setitem__(self, key, value):
588 raise frozendict_error("frozendict is readonly")
589
590 # read-only builtins
Brett Cannon2f9f0562013-06-15 23:24:11 -0400591 if isinstance(__builtins__, types.ModuleType):
592 frozen_builtins = frozendict(__builtins__.__dict__)
593 else:
594 frozen_builtins = frozendict(__builtins__)
Victor Stinnerb0b22422012-04-19 00:57:45 +0200595 code = compile("__builtins__['superglobal']=2; print(superglobal)", "test", "exec")
596 self.assertRaises(frozendict_error,
597 exec, code, {'__builtins__': frozen_builtins})
598
599 # read-only globals
600 namespace = frozendict({})
601 code = compile("x=1", "test", "exec")
602 self.assertRaises(frozendict_error,
603 exec, code, namespace)
604
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000605 def test_exec_redirected(self):
606 savestdout = sys.stdout
607 sys.stdout = None # Whatever that cannot flush()
608 try:
609 # Used to raise SystemError('error return without exception set')
610 exec('a')
611 except NameError:
612 pass
613 finally:
614 sys.stdout = savestdout
615
Walter Dörwald919497e2003-01-19 16:23:59 +0000616 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000617 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
618 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
619 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
620 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
621 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000622 def identity(item):
623 return 1
624 filter(identity, Squares(5))
625 self.assertRaises(TypeError, filter)
626 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000627 def __getitem__(self, index):
628 if index<4:
629 return 42
630 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000631 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000632 def badfunc():
633 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000634 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000635
Walter Dörwaldbf517072003-01-27 15:57:14 +0000636 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000637 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
638 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
639 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000640
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000641 def test_filter_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200642 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
643 f1 = filter(filter_char, "abcdeabcde")
644 f2 = filter(filter_char, "abcdeabcde")
645 self.check_iter_pickle(f1, list(f2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000646
Walter Dörwald919497e2003-01-19 16:23:59 +0000647 def test_getattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000648 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000649 self.assertRaises(TypeError, getattr, sys, 1)
650 self.assertRaises(TypeError, getattr, sys, 1, "foo")
651 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000652 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner624dbf62010-03-12 17:17:58 +0000653 # unicode surrogates are not encodable to the default encoding (utf8)
654 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000655
656 def test_hasattr(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000657 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000658 self.assertRaises(TypeError, hasattr, sys, 1)
659 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000660 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000661
Benjamin Peterson17689992010-08-24 03:26:23 +0000662 # Check that hasattr propagates all exceptions outside of
663 # AttributeError.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000664 class A:
665 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000666 raise SystemExit
667 self.assertRaises(SystemExit, hasattr, A(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000668 class B:
669 def __getattr__(self, what):
Benjamin Peterson17689992010-08-24 03:26:23 +0000670 raise ValueError
671 self.assertRaises(ValueError, hasattr, B(), "b")
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000672
Walter Dörwald919497e2003-01-19 16:23:59 +0000673 def test_hash(self):
674 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000675 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000676 self.assertEqual(hash(1), hash(1.0))
677 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000678 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000679 hash((0,1,2,3))
680 def f(): pass
681 self.assertRaises(TypeError, hash, [])
682 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000683 # Bug 1536021: Allow hash to return long objects
684 class X:
685 def __hash__(self):
686 return 2**100
Ezio Melottib3aedd42010-11-20 19:04:17 +0000687 self.assertEqual(type(hash(X())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000688 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000689 def __hash__(self):
690 return self
Ezio Melottib3aedd42010-11-20 19:04:17 +0000691 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000692
693 def test_hex(self):
694 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000695 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000696 self.assertRaises(TypeError, hex, {})
697
698 def test_id(self):
699 id(None)
700 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000701 id(1.0)
702 id('spam')
703 id((0,1,2,3))
704 id([0,1,2,3])
705 id({'spam': 1, 'eggs': 2, 'ham': 3})
706
Guido van Rossuma88a0332007-02-26 16:59:55 +0000707 # Test input() later, alphabetized as if it were raw_input
708
Walter Dörwald919497e2003-01-19 16:23:59 +0000709 def test_iter(self):
710 self.assertRaises(TypeError, iter)
711 self.assertRaises(TypeError, iter, 42, 42)
712 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000713 for l in lists:
714 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000715 self.assertEqual(next(i), '1')
716 self.assertEqual(next(i), '2')
717 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000718
719 def test_isinstance(self):
720 class C:
721 pass
722 class D(C):
723 pass
724 class E:
725 pass
726 c = C()
727 d = D()
728 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000729 self.assertTrue(isinstance(c, C))
730 self.assertTrue(isinstance(d, C))
731 self.assertTrue(not isinstance(e, C))
732 self.assertTrue(not isinstance(c, D))
733 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000734 self.assertRaises(TypeError, isinstance, E, 'foo')
735 self.assertRaises(TypeError, isinstance)
736
737 def test_issubclass(self):
738 class C:
739 pass
740 class D(C):
741 pass
742 class E:
743 pass
744 c = C()
745 d = D()
746 e = E()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000747 self.assertTrue(issubclass(D, C))
748 self.assertTrue(issubclass(C, C))
749 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000750 self.assertRaises(TypeError, issubclass, 'foo', E)
751 self.assertRaises(TypeError, issubclass, E, 'foo')
752 self.assertRaises(TypeError, issubclass)
753
754 def test_len(self):
755 self.assertEqual(len('123'), 3)
756 self.assertEqual(len(()), 0)
757 self.assertEqual(len((1, 2, 3, 4)), 4)
758 self.assertEqual(len([1, 2, 3, 4]), 4)
759 self.assertEqual(len({}), 0)
760 self.assertEqual(len({'a':1, 'b': 2}), 2)
761 class BadSeq:
762 def __len__(self):
763 raise ValueError
764 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000765 class InvalidLen:
766 def __len__(self):
767 return None
768 self.assertRaises(TypeError, len, InvalidLen())
769 class FloatLen:
770 def __len__(self):
771 return 4.5
772 self.assertRaises(TypeError, len, FloatLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300773 class NegativeLen:
774 def __len__(self):
775 return -10
776 self.assertRaises(ValueError, len, NegativeLen())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000777 class HugeLen:
778 def __len__(self):
779 return sys.maxsize + 1
780 self.assertRaises(OverflowError, len, HugeLen())
Serhiy Storchakabaf9f292017-04-16 09:37:18 +0300781 class HugeNegativeLen:
782 def __len__(self):
783 return -sys.maxsize-10
784 self.assertRaises(ValueError, len, HugeNegativeLen())
Mark Dickinsonfb3dc942010-05-25 19:06:24 +0000785 class NoLenMethod(object): pass
786 self.assertRaises(TypeError, len, NoLenMethod())
Walter Dörwald919497e2003-01-19 16:23:59 +0000787
Walter Dörwald919497e2003-01-19 16:23:59 +0000788 def test_map(self):
789 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000790 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000791 [1, 4, 9]
792 )
793 try:
794 from math import sqrt
795 except ImportError:
796 def sqrt(x):
797 return pow(x, 0.5)
798 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000799 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000800 [[4.0, 2.0], [9.0, 3.0]]
801 )
802 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000803 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000804 [10, 4, 6]
805 )
806
807 def plus(*v):
808 accu = 0
809 for i in v: accu = accu + i
810 return accu
811 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000812 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000813 [1, 3, 7]
814 )
815 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000816 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000817 [1+4, 3+9, 7+2]
818 )
819 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000820 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000821 [1+4+1, 3+9+1, 7+2+0]
822 )
823 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000824 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000825 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
826 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000827 def Max(a, b):
828 if a is None:
829 return b
830 if b is None:
831 return a
832 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000833 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000834 list(map(Max, Squares(3), Squares(2))),
835 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000836 )
837 self.assertRaises(TypeError, map)
838 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000839 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000840 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000841 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000842 yield None
843 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000844 def badfunc(x):
845 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000846 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000847
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000848 def test_map_pickle(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200849 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
850 m1 = map(map_char, "Is this the real life?")
851 m2 = map(map_char, "Is this the real life?")
852 self.check_iter_pickle(m1, list(m2), proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000853
Walter Dörwald919497e2003-01-19 16:23:59 +0000854 def test_max(self):
855 self.assertEqual(max('123123'), '3')
856 self.assertEqual(max(1, 2, 3), 3)
857 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
858 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
859
Guido van Rossume2a383d2007-01-15 16:59:06 +0000860 self.assertEqual(max(1, 2, 3.0), 3.0)
861 self.assertEqual(max(1, 2.0, 3), 3)
862 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000863
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700864 self.assertRaises(TypeError, max)
865 self.assertRaises(TypeError, max, 42)
866 self.assertRaises(ValueError, max, ())
867 class BadSeq:
868 def __getitem__(self, index):
869 raise ValueError
870 self.assertRaises(ValueError, max, BadSeq())
871
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000872 for stmt in (
873 "max(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700874 "max(default=None)",
875 "max(1, 2, default=None)", # require container for default
876 "max(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000877 "max(1, key=int)", # single arg not iterable
878 "max(1, 2, keystone=int)", # wrong keyword
879 "max(1, 2, key=int, abc=int)", # two many keywords
880 "max(1, 2, key=1)", # keyfunc is not callable
881 ):
Tim Peters7f061872004-12-07 21:17:46 +0000882 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000883 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000884 except TypeError:
885 pass
886 else:
887 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000888
889 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
890 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
891 self.assertEqual(max(1, 2, key=neg), 1) # two elems
892
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700893 self.assertEqual(max((), default=None), None) # zero elem iterable
894 self.assertEqual(max((1,), default=None), 1) # one elem iterable
895 self.assertEqual(max((1,2), default=None), 2) # two elem iterable
896
897 self.assertEqual(max((), default=1, key=neg), 1)
898 self.assertEqual(max((1, 2), default=3, key=neg), 1)
899
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000900 data = [random.randrange(200) for i in range(100)]
901 keys = dict((elem, random.randrange(50)) for elem in data)
902 f = keys.__getitem__
903 self.assertEqual(max(data, key=f),
904 sorted(reversed(data), key=f)[-1])
905
Walter Dörwald919497e2003-01-19 16:23:59 +0000906 def test_min(self):
907 self.assertEqual(min('123123'), '1')
908 self.assertEqual(min(1, 2, 3), 1)
909 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
910 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
911
Guido van Rossume2a383d2007-01-15 16:59:06 +0000912 self.assertEqual(min(1, 2, 3.0), 1)
913 self.assertEqual(min(1, 2.0, 3), 1)
914 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000915
916 self.assertRaises(TypeError, min)
917 self.assertRaises(TypeError, min, 42)
918 self.assertRaises(ValueError, min, ())
919 class BadSeq:
920 def __getitem__(self, index):
921 raise ValueError
922 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000923
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000924 for stmt in (
925 "min(key=int)", # no args
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700926 "min(default=None)",
927 "min(1, 2, default=None)", # require container for default
928 "min(default=None, key=int)",
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000929 "min(1, key=int)", # single arg not iterable
930 "min(1, 2, keystone=int)", # wrong keyword
931 "min(1, 2, key=int, abc=int)", # two many keywords
932 "min(1, 2, key=1)", # keyfunc is not callable
933 ):
Tim Peters7f061872004-12-07 21:17:46 +0000934 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000935 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000936 except TypeError:
937 pass
938 else:
939 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000940
941 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
942 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
943 self.assertEqual(min(1, 2, key=neg), 2) # two elems
944
Raymond Hettinger4d6018f2013-06-24 22:43:02 -0700945 self.assertEqual(min((), default=None), None) # zero elem iterable
946 self.assertEqual(min((1,), default=None), 1) # one elem iterable
947 self.assertEqual(min((1,2), default=None), 1) # two elem iterable
948
949 self.assertEqual(min((), default=1, key=neg), 1)
950 self.assertEqual(min((1, 2), default=1, key=neg), 2)
951
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000952 data = [random.randrange(200) for i in range(100)]
953 keys = dict((elem, random.randrange(50)) for elem in data)
954 f = keys.__getitem__
955 self.assertEqual(min(data, key=f),
956 sorted(data, key=f)[0])
957
Georg Brandla18af4e2007-04-21 15:47:16 +0000958 def test_next(self):
959 it = iter(range(2))
960 self.assertEqual(next(it), 0)
961 self.assertEqual(next(it), 1)
962 self.assertRaises(StopIteration, next, it)
963 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000964 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000965
966 class Iter(object):
967 def __iter__(self):
968 return self
969 def __next__(self):
970 raise StopIteration
971
972 it = iter(Iter())
Ezio Melottib3aedd42010-11-20 19:04:17 +0000973 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000974 self.assertRaises(StopIteration, next, it)
975
976 def gen():
977 yield 1
978 return
979
980 it = gen()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000981 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +0000982 self.assertRaises(StopIteration, next, it)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000983 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000984
Walter Dörwald919497e2003-01-19 16:23:59 +0000985 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000986 self.assertEqual(oct(100), '0o144')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000987 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000988 self.assertRaises(TypeError, oct, ())
989
990 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000991 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000992 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +0200993 self.addCleanup(unlink, TESTFN)
994 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +0000995 fp.write('1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +0000996 fp.write('The quick brown fox jumps over the lazy dog')
997 fp.write('.\n')
998 fp.write('Dear John\n')
999 fp.write('XXX'*100)
1000 fp.write('YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001001
1002 def test_open(self):
1003 self.write_testfile()
1004 fp = open(TESTFN, 'r')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001005 with fp:
Walter Dörwald919497e2003-01-19 16:23:59 +00001006 self.assertEqual(fp.readline(4), '1+1\n')
Walter Dörwald919497e2003-01-19 16:23:59 +00001007 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1008 self.assertEqual(fp.readline(4), 'Dear')
1009 self.assertEqual(fp.readline(100), ' John\n')
1010 self.assertEqual(fp.read(300), 'XXX'*100)
1011 self.assertEqual(fp.read(1000), 'YYY'*100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001012
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001013 def test_open_default_encoding(self):
1014 old_environ = dict(os.environ)
1015 try:
1016 # try to get a user preferred encoding different than the current
1017 # locale encoding to check that open() uses the current locale
1018 # encoding and not the user preferred encoding
1019 for key in ('LC_ALL', 'LANG', 'LC_CTYPE'):
1020 if key in os.environ:
1021 del os.environ[key]
1022
1023 self.write_testfile()
1024 current_locale_encoding = locale.getpreferredencoding(False)
1025 fp = open(TESTFN, 'w')
Victor Stinner82fb71d2013-08-22 01:58:12 +02001026 with fp:
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001027 self.assertEqual(fp.encoding, current_locale_encoding)
Victor Stinnerf86a5e82012-06-05 13:43:22 +02001028 finally:
1029 os.environ.clear()
1030 os.environ.update(old_environ)
1031
Victor Stinnerdaf45552013-08-28 00:53:59 +02001032 def test_open_non_inheritable(self):
1033 fileobj = open(__file__)
1034 with fileobj:
1035 self.assertFalse(os.get_inheritable(fileobj.fileno()))
1036
Walter Dörwald919497e2003-01-19 16:23:59 +00001037 def test_ord(self):
1038 self.assertEqual(ord(' '), 32)
1039 self.assertEqual(ord('A'), 65)
1040 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001041 self.assertEqual(ord('\x80'), 128)
1042 self.assertEqual(ord('\xff'), 255)
1043
1044 self.assertEqual(ord(b' '), 32)
1045 self.assertEqual(ord(b'A'), 65)
1046 self.assertEqual(ord(b'a'), 97)
1047 self.assertEqual(ord(b'\x80'), 128)
1048 self.assertEqual(ord(b'\xff'), 255)
1049
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001050 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001051 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001052
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001053 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1054 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1055 self.assertEqual(ord("\U00010000"), 0x00010000)
1056 self.assertEqual(ord("\U00010001"), 0x00010001)
1057 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1058 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1059 self.assertEqual(ord("\U00100000"), 0x00100000)
1060 self.assertEqual(ord("\U00100001"), 0x00100001)
1061 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1062 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1063
Walter Dörwald919497e2003-01-19 16:23:59 +00001064 def test_pow(self):
1065 self.assertEqual(pow(0,0), 1)
1066 self.assertEqual(pow(0,1), 0)
1067 self.assertEqual(pow(1,0), 1)
1068 self.assertEqual(pow(1,1), 1)
1069
1070 self.assertEqual(pow(2,0), 1)
1071 self.assertEqual(pow(2,10), 1024)
1072 self.assertEqual(pow(2,20), 1024*1024)
1073 self.assertEqual(pow(2,30), 1024*1024*1024)
1074
1075 self.assertEqual(pow(-2,0), 1)
1076 self.assertEqual(pow(-2,1), -2)
1077 self.assertEqual(pow(-2,2), 4)
1078 self.assertEqual(pow(-2,3), -8)
1079
Walter Dörwald919497e2003-01-19 16:23:59 +00001080 self.assertAlmostEqual(pow(0.,0), 1.)
1081 self.assertAlmostEqual(pow(0.,1), 0.)
1082 self.assertAlmostEqual(pow(1.,0), 1.)
1083 self.assertAlmostEqual(pow(1.,1), 1.)
1084
1085 self.assertAlmostEqual(pow(2.,0), 1.)
1086 self.assertAlmostEqual(pow(2.,10), 1024.)
1087 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1088 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1089
1090 self.assertAlmostEqual(pow(-2.,0), 1.)
1091 self.assertAlmostEqual(pow(-2.,1), -2.)
1092 self.assertAlmostEqual(pow(-2.,2), 4.)
1093 self.assertAlmostEqual(pow(-2.,3), -8.)
1094
Mark Dickinson5c2db372009-12-05 20:28:34 +00001095 for x in 2, 2.0:
1096 for y in 10, 10.0:
1097 for z in 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001098 if isinstance(x, float) or \
1099 isinstance(y, float) or \
1100 isinstance(z, float):
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001101 self.assertRaises(TypeError, pow, x, y, z)
Walter Dörwald919497e2003-01-19 16:23:59 +00001102 else:
1103 self.assertAlmostEqual(pow(x, y, z), 24.0)
1104
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001105 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1106 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1107
Benjamin Petersonf84200f2014-04-11 15:37:18 -04001108 self.assertRaises(ValueError, pow, -1, -2, 3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001109 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001110
1111 self.assertRaises(TypeError, pow)
1112
Guido van Rossuma88a0332007-02-26 16:59:55 +00001113 def test_input(self):
1114 self.write_testfile()
1115 fp = open(TESTFN, 'r')
1116 savestdin = sys.stdin
1117 savestdout = sys.stdout # Eats the echo
1118 try:
1119 sys.stdin = fp
1120 sys.stdout = BitBucket()
1121 self.assertEqual(input(), "1+1")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001122 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1123 self.assertEqual(input('testing\n'), 'Dear John')
1124
1125 # SF 1535165: don't segfault on closed stdin
1126 # sys.stdout must be a regular file for triggering
1127 sys.stdout = savestdout
1128 sys.stdin.close()
1129 self.assertRaises(ValueError, input)
1130
1131 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001132 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001133 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001134 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001135 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001136 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001137 self.assertRaises(EOFError, input)
1138
1139 del sys.stdout
1140 self.assertRaises(RuntimeError, input, 'prompt')
1141 del sys.stdin
1142 self.assertRaises(RuntimeError, input, 'prompt')
1143 finally:
1144 sys.stdin = savestdin
1145 sys.stdout = savestdout
1146 fp.close()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001147
Andrew Svetlov8e42e8a2012-12-23 12:49:33 +02001148 # test_int(): see test_int.py for tests of built-in function int().
1149
Walter Dörwald919497e2003-01-19 16:23:59 +00001150 def test_repr(self):
1151 self.assertEqual(repr(''), '\'\'')
1152 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001153 self.assertEqual(repr(()), '()')
1154 self.assertEqual(repr([]), '[]')
1155 self.assertEqual(repr({}), '{}')
1156 a = []
1157 a.append(a)
1158 self.assertEqual(repr(a), '[[...]]')
1159 a = {}
1160 a[0] = a
1161 self.assertEqual(repr(a), '{0: {...}}')
1162
1163 def test_round(self):
1164 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001165 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001166 self.assertEqual(round(1.0), 1.0)
1167 self.assertEqual(round(10.0), 10.0)
1168 self.assertEqual(round(1000000000.0), 1000000000.0)
1169 self.assertEqual(round(1e20), 1e20)
1170
1171 self.assertEqual(round(-1.0), -1.0)
1172 self.assertEqual(round(-10.0), -10.0)
1173 self.assertEqual(round(-1000000000.0), -1000000000.0)
1174 self.assertEqual(round(-1e20), -1e20)
1175
1176 self.assertEqual(round(0.1), 0.0)
1177 self.assertEqual(round(1.1), 1.0)
1178 self.assertEqual(round(10.1), 10.0)
1179 self.assertEqual(round(1000000000.1), 1000000000.0)
1180
1181 self.assertEqual(round(-1.1), -1.0)
1182 self.assertEqual(round(-10.1), -10.0)
1183 self.assertEqual(round(-1000000000.1), -1000000000.0)
1184
1185 self.assertEqual(round(0.9), 1.0)
1186 self.assertEqual(round(9.9), 10.0)
1187 self.assertEqual(round(999999999.9), 1000000000.0)
1188
1189 self.assertEqual(round(-0.9), -1.0)
1190 self.assertEqual(round(-9.9), -10.0)
1191 self.assertEqual(round(-999999999.9), -1000000000.0)
1192
1193 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001194 self.assertEqual(type(round(-8.0, -1)), float)
1195
1196 self.assertEqual(type(round(-8.0, 0)), float)
1197 self.assertEqual(type(round(-8.0, 1)), float)
1198
1199 # Check even / odd rounding behaviour
1200 self.assertEqual(round(5.5), 6)
1201 self.assertEqual(round(6.5), 6)
1202 self.assertEqual(round(-5.5), -6)
1203 self.assertEqual(round(-6.5), -6)
1204
1205 # Check behavior on ints
1206 self.assertEqual(round(0), 0)
1207 self.assertEqual(round(8), 8)
1208 self.assertEqual(round(-8), -8)
1209 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001210 self.assertEqual(type(round(-8, -1)), int)
1211 self.assertEqual(type(round(-8, 0)), int)
1212 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001213
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001214 # test new kwargs
1215 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1216
Walter Dörwald919497e2003-01-19 16:23:59 +00001217 self.assertRaises(TypeError, round)
1218
Alex Martelliae211f92007-08-22 23:21:33 +00001219 # test generic rounding delegation for reals
1220 class TestRound:
1221 def __round__(self):
1222 return 23
1223
1224 class TestNoRound:
1225 pass
1226
1227 self.assertEqual(round(TestRound()), 23)
1228
1229 self.assertRaises(TypeError, round, 1, 2, 3)
1230 self.assertRaises(TypeError, round, TestNoRound())
1231
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001232 t = TestNoRound()
1233 t.__round__ = lambda *args: args
1234 self.assertRaises(TypeError, round, t)
1235 self.assertRaises(TypeError, round, t, 0)
1236
Mark Dickinsonad731b92009-11-09 17:12:30 +00001237 # Some versions of glibc for alpha have a bug that affects
1238 # float -> integer rounding (floor, ceil, rint, round) for
1239 # values in the range [2**52, 2**53). See:
1240 #
1241 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1242 #
1243 # We skip this test on Linux/alpha if it would fail.
1244 linux_alpha = (platform.system().startswith('Linux') and
1245 platform.machine().startswith('alpha'))
1246 system_round_bug = round(5e15+1) != 5e15+1
1247 @unittest.skipIf(linux_alpha and system_round_bug,
1248 "test will fail; failure is probably due to a "
1249 "buggy system round function")
1250 def test_round_large(self):
1251 # Issue #1869: integral floats should remain unchanged
1252 self.assertEqual(round(5e15-1), 5e15-1)
1253 self.assertEqual(round(5e15), 5e15)
1254 self.assertEqual(round(5e15+1), 5e15+1)
1255 self.assertEqual(round(5e15+2), 5e15+2)
1256 self.assertEqual(round(5e15+3), 5e15+3)
1257
Raymond Hettingerf0f1c232016-09-03 01:55:11 -07001258 def test_bug_27936(self):
1259 # Verify that ndigits=None means the same as passing in no argument
1260 for x in [1234,
1261 1234.56,
1262 decimal.Decimal('1234.56'),
1263 fractions.Fraction(123456, 100)]:
1264 self.assertEqual(round(x, None), round(x))
1265 self.assertEqual(type(round(x, None)), type(round(x)))
1266
Walter Dörwald919497e2003-01-19 16:23:59 +00001267 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001268 setattr(sys, 'spam', 1)
1269 self.assertEqual(sys.spam, 1)
1270 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1271 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001272
Chris Jerdonek5fae0e52012-11-20 17:45:51 -08001273 # test_str(): see test_unicode.py and test_bytes.py for str() tests.
Walter Dörwald919497e2003-01-19 16:23:59 +00001274
Alex Martellia70b1912003-04-22 08:12:33 +00001275 def test_sum(self):
1276 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001277 self.assertEqual(sum(list(range(2,8))), 27)
1278 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001279 self.assertEqual(sum(Squares(10)), 285)
1280 self.assertEqual(sum(iter(Squares(10))), 285)
1281 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1282
1283 self.assertRaises(TypeError, sum)
1284 self.assertRaises(TypeError, sum, 42)
1285 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1286 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
Benjamin Petersonce071ca2011-07-29 14:23:47 -05001287 self.assertRaises(TypeError, sum, [b'a', b'c'], b'')
1288 values = [bytearray(b'a'), bytearray(b'b')]
1289 self.assertRaises(TypeError, sum, values, bytearray(b''))
Alex Martellia70b1912003-04-22 08:12:33 +00001290 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1291 self.assertRaises(TypeError, sum, [{2:3}])
1292 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1293
1294 class BadSeq:
1295 def __getitem__(self, index):
1296 raise ValueError
1297 self.assertRaises(ValueError, sum, BadSeq())
1298
Mark Dickinson3a22b472009-10-17 21:48:16 +00001299 empty = []
1300 sum(([x] for x in range(10)), empty)
1301 self.assertEqual(empty, [])
1302
Walter Dörwald919497e2003-01-19 16:23:59 +00001303 def test_type(self):
1304 self.assertEqual(type(''), type('123'))
1305 self.assertNotEqual(type(''), type(()))
1306
Guido van Rossumfee7b932005-01-16 00:21:28 +00001307 # We don't want self in vars(), so these are static methods
1308
1309 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001310 def get_vars_f0():
1311 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001312
Guido van Rossumfee7b932005-01-16 00:21:28 +00001313 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001314 def get_vars_f2():
1315 BuiltinTest.get_vars_f0()
1316 a = 1
1317 b = 2
1318 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001319
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001320 class C_get_vars(object):
1321 def getDict(self):
1322 return {'a':2}
1323 __dict__ = property(fget=getDict)
1324
Walter Dörwald919497e2003-01-19 16:23:59 +00001325 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001326 self.assertEqual(set(vars()), set(dir()))
Raymond Hettingera690a992003-11-16 16:17:49 +00001327 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001328 self.assertEqual(self.get_vars_f0(), {})
1329 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1330 self.assertRaises(TypeError, vars, 42, 42)
1331 self.assertRaises(TypeError, vars, 42)
Mark Dickinsonfb3dc942010-05-25 19:06:24 +00001332 self.assertEqual(vars(self.C_get_vars()), {'a':2})
Walter Dörwald919497e2003-01-19 16:23:59 +00001333
1334 def test_zip(self):
1335 a = (1, 2, 3)
1336 b = (4, 5, 6)
1337 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001338 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001339 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001340 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001341 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001342 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001343 class I:
1344 def __getitem__(self, i):
1345 if i < 0 or i > 2: raise IndexError
1346 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001347 self.assertEqual(list(zip(a, I())), t)
1348 self.assertEqual(list(zip()), [])
1349 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001350 self.assertRaises(TypeError, zip, None)
1351 class G:
1352 pass
1353 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolskye29e6bf2010-08-16 18:55:46 +00001354 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001355
1356 # Make sure zip doesn't try to allocate a billion elements for the
1357 # result list when one of its arguments doesn't say how long it is.
1358 # A MemoryError is the most likely failure mode.
1359 class SequenceWithoutALength:
1360 def __getitem__(self, i):
1361 if i == 5:
1362 raise IndexError
1363 else:
1364 return i
1365 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001366 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001367 list(enumerate(range(5)))
1368 )
1369
1370 class BadSeq:
1371 def __getitem__(self, i):
1372 if i == 5:
1373 raise ValueError
1374 else:
1375 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001376 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001377
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001378 def test_zip_pickle(self):
1379 a = (1, 2, 3)
1380 b = (4, 5, 6)
1381 t = [(1, 4), (2, 5), (3, 6)]
Serhiy Storchakabad12572014-12-15 14:03:42 +02001382 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1383 z1 = zip(a, b)
1384 self.check_iter_pickle(z1, t, proto)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001385
Eric Smithe4d63172010-09-13 20:48:43 +00001386 def test_format(self):
1387 # Test the basic machinery of the format() builtin. Don't test
1388 # the specifics of the various formatters
1389 self.assertEqual(format(3, ''), '3')
1390
1391 # Returns some classes to use for various tests. There's
1392 # an old-style version, and a new-style version
1393 def classes_new():
1394 class A(object):
1395 def __init__(self, x):
1396 self.x = x
1397 def __format__(self, format_spec):
1398 return str(self.x) + format_spec
1399 class DerivedFromA(A):
1400 pass
1401
1402 class Simple(object): pass
1403 class DerivedFromSimple(Simple):
1404 def __init__(self, x):
1405 self.x = x
1406 def __format__(self, format_spec):
1407 return str(self.x) + format_spec
1408 class DerivedFromSimple2(DerivedFromSimple): pass
1409 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1410
1411 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1412 self.assertEqual(format(A(3), 'spec'), '3spec')
1413 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1414 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1415 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1416 '10abcdef')
1417
1418 class_test(*classes_new())
1419
1420 def empty_format_spec(value):
1421 # test that:
1422 # format(x, '') == str(x)
1423 # format(x) == str(x)
1424 self.assertEqual(format(value, ""), str(value))
1425 self.assertEqual(format(value), str(value))
1426
1427 # for builtin types, format(x, "") == str(x)
1428 empty_format_spec(17**13)
1429 empty_format_spec(1.0)
1430 empty_format_spec(3.1415e104)
1431 empty_format_spec(-3.1415e104)
1432 empty_format_spec(3.1415e-104)
1433 empty_format_spec(-3.1415e-104)
1434 empty_format_spec(object)
1435 empty_format_spec(None)
1436
1437 # TypeError because self.__format__ returns the wrong type
1438 class BadFormatResult:
1439 def __format__(self, format_spec):
1440 return 1.0
1441 self.assertRaises(TypeError, format, BadFormatResult(), "")
1442
1443 # TypeError because format_spec is not unicode or str
1444 self.assertRaises(TypeError, format, object(), 4)
1445 self.assertRaises(TypeError, format, object(), object())
1446
1447 # tests for object.__format__ really belong elsewhere, but
1448 # there's no good place to put them
1449 x = object().__format__('')
1450 self.assertTrue(x.startswith('<object object at'))
1451
1452 # first argument to object.__format__ must be string
1453 self.assertRaises(TypeError, object().__format__, 3)
1454 self.assertRaises(TypeError, object().__format__, object())
1455 self.assertRaises(TypeError, object().__format__, None)
1456
1457 # --------------------------------------------------------------------
1458 # Issue #7994: object.__format__ with a non-empty format string is
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001459 # disallowed
Eric Smithe4d63172010-09-13 20:48:43 +00001460 class A:
1461 def __format__(self, fmt_str):
1462 return format('', fmt_str)
1463
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001464 self.assertEqual(format(A()), '')
1465 self.assertEqual(format(A(), ''), '')
1466 self.assertEqual(format(A(), 's'), '')
Eric Smithe4d63172010-09-13 20:48:43 +00001467
1468 class B:
1469 pass
1470
1471 class C(object):
1472 pass
1473
1474 for cls in [object, B, C]:
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001475 obj = cls()
1476 self.assertEqual(format(obj), str(obj))
1477 self.assertEqual(format(obj, ''), str(obj))
1478 with self.assertRaisesRegex(TypeError,
1479 r'\b%s\b' % re.escape(cls.__name__)):
1480 format(obj, 's')
Eric Smithe4d63172010-09-13 20:48:43 +00001481 # --------------------------------------------------------------------
1482
1483 # make sure we can take a subclass of str as a format spec
1484 class DerivedFromStr(str): pass
1485 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
1486
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001487 def test_bin(self):
1488 self.assertEqual(bin(0), '0b0')
1489 self.assertEqual(bin(1), '0b1')
1490 self.assertEqual(bin(-1), '-0b1')
1491 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1492 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1493 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1494 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1495
Georg Brandl953152f2009-07-22 12:03:59 +00001496 def test_bytearray_translate(self):
1497 x = bytearray(b"abc")
1498 self.assertRaises(ValueError, x.translate, b"1", 1)
1499 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1500
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001501 def test_construct_singletons(self):
Benjamin Peterson18d7d7a2011-07-29 18:27:44 -05001502 for const in None, Ellipsis, NotImplemented:
Benjamin Petersonc4607ae2011-07-29 18:19:43 -05001503 tp = type(const)
1504 self.assertIs(tp(), const)
1505 self.assertRaises(TypeError, tp, 1, 2)
1506 self.assertRaises(TypeError, tp, a=1, b=2)
1507
Martin Panterc9a6ab52015-10-10 01:25:38 +00001508@unittest.skipUnless(pty, "the pty and signal modules must be available")
1509class PtyTests(unittest.TestCase):
1510 """Tests that use a pseudo terminal to guarantee stdin and stdout are
1511 terminals in the test environment"""
1512
Martin Pantere44dba32015-10-10 05:27:15 +00001513 def run_child(self, child, terminal_input):
1514 r, w = os.pipe() # Pipe test results from child back to parent
Martin Panterc9a6ab52015-10-10 01:25:38 +00001515 try:
Martin Pantere44dba32015-10-10 05:27:15 +00001516 pid, fd = pty.fork()
Martin Panterc9a6ab52015-10-10 01:25:38 +00001517 except (OSError, AttributeError) as e:
Martin Panterc9a6ab52015-10-10 01:25:38 +00001518 os.close(r)
1519 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001520 self.skipTest("pty.fork() raised {}".format(e))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001521 raise
1522 if pid == 0:
1523 # Child
1524 try:
1525 # Make sure we don't get stuck if there's a problem
1526 signal.alarm(2)
1527 os.close(r)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001528 with open(w, "w") as wpipe:
Martin Pantere44dba32015-10-10 05:27:15 +00001529 child(wpipe)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001530 except:
1531 traceback.print_exc()
1532 finally:
1533 # We don't want to return to unittest...
1534 os._exit(0)
1535 # Parent
1536 os.close(w)
Martin Pantere44dba32015-10-10 05:27:15 +00001537 os.write(fd, terminal_input)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001538 # Get results from the pipe
1539 with open(r, "r") as rpipe:
1540 lines = []
1541 while True:
1542 line = rpipe.readline().strip()
1543 if line == "":
1544 # The other end was closed => the child exited
1545 break
1546 lines.append(line)
1547 # Check the result was got and corresponds to the user's terminal input
1548 if len(lines) != 2:
1549 # Something went wrong, try to get at stderr
Martin Pantere44dba32015-10-10 05:27:15 +00001550 # Beware of Linux raising EIO when the slave is closed
1551 child_output = bytearray()
1552 while True:
1553 try:
1554 chunk = os.read(fd, 3000)
1555 except OSError: # Assume EIO
1556 break
1557 if not chunk:
1558 break
1559 child_output.extend(chunk)
1560 os.close(fd)
1561 child_output = child_output.decode("ascii", "ignore")
1562 self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
1563 % (len(lines), child_output))
Martin Panterc9a6ab52015-10-10 01:25:38 +00001564 os.close(fd)
Martin Pantere44dba32015-10-10 05:27:15 +00001565 return lines
1566
1567 def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
1568 if not sys.stdin.isatty() or not sys.stdout.isatty():
1569 self.skipTest("stdin and stdout must be ttys")
1570 def child(wpipe):
1571 # Check the error handlers are accounted for
1572 if stdio_encoding:
1573 sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
1574 encoding=stdio_encoding,
1575 errors='surrogateescape')
1576 sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
1577 encoding=stdio_encoding,
1578 errors='replace')
1579 print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
1580 print(ascii(input(prompt)), file=wpipe)
1581 lines = self.run_child(child, terminal_input + b"\r\n")
Martin Panterc9a6ab52015-10-10 01:25:38 +00001582 # Check we did exercise the GNU readline path
1583 self.assertIn(lines[0], {'tty = True', 'tty = False'})
1584 if lines[0] != 'tty = True':
1585 self.skipTest("standard IO in should have been a tty")
1586 input_result = eval(lines[1]) # ascii() -> eval() roundtrip
1587 if stdio_encoding:
1588 expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
1589 else:
1590 expected = terminal_input.decode(sys.stdin.encoding) # what else?
1591 self.assertEqual(input_result, expected)
1592
1593 def test_input_tty(self):
1594 # Test input() functionality when wired to a tty (the code path
1595 # is different and invokes GNU readline if available).
1596 self.check_input_tty("prompt", b"quux")
1597
1598 def test_input_tty_non_ascii(self):
1599 # Check stdin/stdout encoding is used when invoking GNU readline
1600 self.check_input_tty("prompté", b"quux\xe9", "utf-8")
1601
1602 def test_input_tty_non_ascii_unicode_errors(self):
1603 # Check stdin/stdout error handler is used when invoking GNU readline
1604 self.check_input_tty("prompté", b"quux\xe9", "ascii")
1605
1606 def test_input_no_stdout_fileno(self):
1607 # Issue #24402: If stdin is the original terminal but stdout.fileno()
1608 # fails, do not use the original stdout file descriptor
Martin Pantere44dba32015-10-10 05:27:15 +00001609 def child(wpipe):
1610 print("stdin.isatty():", sys.stdin.isatty(), file=wpipe)
1611 sys.stdout = io.StringIO() # Does not support fileno()
1612 input("prompt")
1613 print("captured:", ascii(sys.stdout.getvalue()), file=wpipe)
1614 lines = self.run_child(child, b"quux\r")
1615 expected = (
1616 "stdin.isatty(): True",
1617 "captured: 'prompt'",
1618 )
1619 self.assertSequenceEqual(lines, expected)
Martin Panterc9a6ab52015-10-10 01:25:38 +00001620
Raymond Hettinger64958a12003-12-17 20:43:33 +00001621class TestSorted(unittest.TestCase):
1622
1623 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001624 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001625 copy = data[:]
1626 random.shuffle(copy)
1627 self.assertEqual(data, sorted(copy))
1628 self.assertNotEqual(data, copy)
1629
1630 data.reverse()
1631 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001632 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1633 self.assertNotEqual(data, copy)
1634 random.shuffle(copy)
1635 self.assertEqual(data, sorted(copy, reverse=1))
1636 self.assertNotEqual(data, copy)
1637
Serhiy Storchaka398ef5c2017-01-20 08:33:06 +02001638 def test_bad_arguments(self):
1639 # Issue #29327: The first argument is positional-only.
1640 sorted([])
1641 with self.assertRaises(TypeError):
1642 sorted(iterable=[])
1643 # Other arguments are keyword-only
1644 sorted([], key=None)
1645 with self.assertRaises(TypeError):
1646 sorted([], None)
1647
Raymond Hettinger64958a12003-12-17 20:43:33 +00001648 def test_inputtypes(self):
1649 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001650 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001651 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001652 self.assertEqual(sorted(s), sorted(T(s)))
1653
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001654 s = ''.join(set(s)) # unique letters only
1655 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001656 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001657 self.assertEqual(sorted(s), sorted(T(s)))
1658
1659 def test_baddecorator(self):
1660 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1661 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1662
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001663
1664class ShutdownTest(unittest.TestCase):
1665
1666 def test_cleanup(self):
1667 # Issue #19255: builtins are still available at shutdown
1668 code = """if 1:
1669 import builtins
1670 import sys
1671
1672 class C:
1673 def __del__(self):
Victor Stinner8da4fb52014-02-12 18:27:55 +01001674 print("before")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001675 # Check that builtins still exist
1676 len(())
Victor Stinner8da4fb52014-02-12 18:27:55 +01001677 print("after")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001678
1679 c = C()
1680 # Make this module survive until builtins and sys are cleaned
1681 builtins.here = sys.modules[__name__]
1682 sys.here = sys.modules[__name__]
1683 # Create a reference loop so that this module needs to go
1684 # through a GC phase.
1685 here = sys.modules[__name__]
1686 """
Victor Stinner8da4fb52014-02-12 18:27:55 +01001687 # Issue #20599: Force ASCII encoding to get a codec implemented in C,
1688 # otherwise the codec may be unloaded before C.__del__() is called, and
1689 # so print("before") fails because the codec cannot be used to encode
1690 # "before" to sys.stdout.encoding. For example, on Windows,
1691 # sys.stdout.encoding is the OEM code page and these code pages are
1692 # implemented in Python
1693 rc, out, err = assert_python_ok("-c", code,
Victor Stinnere755fba2014-02-13 10:54:32 +01001694 PYTHONIOENCODING="ascii")
Serhiy Storchaka87a5c512014-02-10 18:21:34 +02001695 self.assertEqual(["before", "after"], out.decode().splitlines())
1696
1697
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001698class TestType(unittest.TestCase):
1699 def test_new_type(self):
1700 A = type('A', (), {})
1701 self.assertEqual(A.__name__, 'A')
1702 self.assertEqual(A.__qualname__, 'A')
1703 self.assertEqual(A.__module__, __name__)
1704 self.assertEqual(A.__bases__, (object,))
1705 self.assertIs(A.__base__, object)
1706 x = A()
1707 self.assertIs(type(x), A)
1708 self.assertIs(x.__class__, A)
1709
1710 class B:
1711 def ham(self):
1712 return 'ham%d' % self
1713 C = type('C', (B, int), {'spam': lambda self: 'spam%s' % self})
1714 self.assertEqual(C.__name__, 'C')
1715 self.assertEqual(C.__qualname__, 'C')
1716 self.assertEqual(C.__module__, __name__)
1717 self.assertEqual(C.__bases__, (B, int))
1718 self.assertIs(C.__base__, int)
1719 self.assertIn('spam', C.__dict__)
1720 self.assertNotIn('ham', C.__dict__)
1721 x = C(42)
1722 self.assertEqual(x, 42)
1723 self.assertIs(type(x), C)
1724 self.assertIs(x.__class__, C)
1725 self.assertEqual(x.ham(), 'ham42')
1726 self.assertEqual(x.spam(), 'spam42')
1727 self.assertEqual(x.to_bytes(2, 'little'), b'\x2a\x00')
1728
Nick Coghland78448e2016-07-30 16:26:03 +10001729 def test_type_nokwargs(self):
1730 with self.assertRaises(TypeError):
1731 type('a', (), {}, x=5)
1732 with self.assertRaises(TypeError):
1733 type('a', (), dict={})
Serhiy Storchaka763f9f02016-02-08 20:28:03 +02001734
1735 def test_type_name(self):
1736 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1737 with self.subTest(name=name):
1738 A = type(name, (), {})
1739 self.assertEqual(A.__name__, name)
1740 self.assertEqual(A.__qualname__, name)
1741 self.assertEqual(A.__module__, __name__)
1742 with self.assertRaises(ValueError):
1743 type('A\x00B', (), {})
1744 with self.assertRaises(ValueError):
1745 type('A\udcdcB', (), {})
1746 with self.assertRaises(TypeError):
1747 type(b'A', (), {})
1748
1749 C = type('C', (), {})
1750 for name in 'A', '\xc4', '\U0001f40d', 'B.A', '42', '':
1751 with self.subTest(name=name):
1752 C.__name__ = name
1753 self.assertEqual(C.__name__, name)
1754 self.assertEqual(C.__qualname__, 'C')
1755 self.assertEqual(C.__module__, __name__)
1756
1757 A = type('C', (), {})
1758 with self.assertRaises(ValueError):
1759 A.__name__ = 'A\x00B'
1760 self.assertEqual(A.__name__, 'C')
1761 with self.assertRaises(ValueError):
1762 A.__name__ = 'A\udcdcB'
1763 self.assertEqual(A.__name__, 'C')
1764 with self.assertRaises(TypeError):
1765 A.__name__ = b'A'
1766 self.assertEqual(A.__name__, 'C')
1767
1768 def test_type_qualname(self):
1769 A = type('A', (), {'__qualname__': 'B.C'})
1770 self.assertEqual(A.__name__, 'A')
1771 self.assertEqual(A.__qualname__, 'B.C')
1772 self.assertEqual(A.__module__, __name__)
1773 with self.assertRaises(TypeError):
1774 type('A', (), {'__qualname__': b'B'})
1775 self.assertEqual(A.__qualname__, 'B.C')
1776
1777 A.__qualname__ = 'D.E'
1778 self.assertEqual(A.__name__, 'A')
1779 self.assertEqual(A.__qualname__, 'D.E')
1780 with self.assertRaises(TypeError):
1781 A.__qualname__ = b'B'
1782 self.assertEqual(A.__qualname__, 'D.E')
1783
1784 def test_type_doc(self):
1785 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', b'x', 42, None:
1786 A = type('A', (), {'__doc__': doc})
1787 self.assertEqual(A.__doc__, doc)
1788 with self.assertRaises(UnicodeEncodeError):
1789 type('A', (), {'__doc__': 'x\udcdcy'})
1790
1791 A = type('A', (), {})
1792 self.assertEqual(A.__doc__, None)
1793 for doc in 'x', '\xc4', '\U0001f40d', 'x\x00y', 'x\udcdcy', b'x', 42, None:
1794 A.__doc__ = doc
1795 self.assertEqual(A.__doc__, doc)
1796
1797 def test_bad_args(self):
1798 with self.assertRaises(TypeError):
1799 type()
1800 with self.assertRaises(TypeError):
1801 type('A', ())
1802 with self.assertRaises(TypeError):
1803 type('A', (), {}, ())
1804 with self.assertRaises(TypeError):
1805 type('A', (), dict={})
1806 with self.assertRaises(TypeError):
1807 type('A', [], {})
1808 with self.assertRaises(TypeError):
1809 type('A', (), types.MappingProxyType({}))
1810 with self.assertRaises(TypeError):
1811 type('A', (None,), {})
1812 with self.assertRaises(TypeError):
1813 type('A', (bool,), {})
1814 with self.assertRaises(TypeError):
1815 type('A', (int, str), {})
1816
1817 def test_bad_slots(self):
1818 with self.assertRaises(TypeError):
1819 type('A', (), {'__slots__': b'x'})
1820 with self.assertRaises(TypeError):
1821 type('A', (int,), {'__slots__': 'x'})
1822 with self.assertRaises(TypeError):
1823 type('A', (), {'__slots__': ''})
1824 with self.assertRaises(TypeError):
1825 type('A', (), {'__slots__': '42'})
1826 with self.assertRaises(TypeError):
1827 type('A', (), {'__slots__': 'x\x00y'})
1828 with self.assertRaises(ValueError):
1829 type('A', (), {'__slots__': 'x', 'x': 0})
1830 with self.assertRaises(TypeError):
1831 type('A', (), {'__slots__': ('__dict__', '__dict__')})
1832 with self.assertRaises(TypeError):
1833 type('A', (), {'__slots__': ('__weakref__', '__weakref__')})
1834
1835 class B:
1836 pass
1837 with self.assertRaises(TypeError):
1838 type('A', (B,), {'__slots__': '__dict__'})
1839 with self.assertRaises(TypeError):
1840 type('A', (B,), {'__slots__': '__weakref__'})
1841
1842
Zachary Warea4b7a752013-11-24 01:19:09 -06001843def load_tests(loader, tests, pattern):
1844 from doctest import DocTestSuite
1845 tests.addTest(DocTestSuite(builtins))
1846 return tests
Walter Dörwald919497e2003-01-19 16:23:59 +00001847
1848if __name__ == "__main__":
Zachary Warea4b7a752013-11-24 01:19:09 -06001849 unittest.main()