blob: 420a17f20174e23e249f039f6ac7a25c2e11ccb8 [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 Dickinson94882db2009-11-09 17:14:18 +00003import platform
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004import test.support, unittest
5from test.support import fcmp, TESTFN, unlink, run_unittest, \
Walter Dörwald1f5947b2007-05-22 16:52:54 +00006 run_with_locale
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00007from operator import neg
Guido van Rossum3bead091992-01-27 17:00:37 +00008
Raymond Hettinger53dbe392008-02-12 20:03:09 +00009import sys, warnings, random, collections, io, fractions
Walter Dörwald919497e2003-01-19 16:23:59 +000010warnings.filterwarnings("ignore", "hex../oct.. of negative int",
11 FutureWarning, __name__)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +000012warnings.filterwarnings("ignore", "integer argument expected",
13 DeprecationWarning, "unittest")
Mark Dickinsona56c4672009-01-27 18:17:45 +000014import builtins
Guido van Rossum3bead091992-01-27 17:00:37 +000015
Walter Dörwald919497e2003-01-19 16:23:59 +000016class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000017
Walter Dörwald919497e2003-01-19 16:23:59 +000018 def __init__(self, max):
19 self.max = max
20 self.sofar = []
21
22 def __len__(self): return len(self.sofar)
23
24 def __getitem__(self, i):
25 if not 0 <= i < self.max: raise IndexError
26 n = len(self.sofar)
27 while n <= i:
28 self.sofar.append(n*n)
29 n += 1
30 return self.sofar[i]
31
32class StrSquares:
33
34 def __init__(self, max):
35 self.max = max
36 self.sofar = []
37
38 def __len__(self):
39 return len(self.sofar)
40
41 def __getitem__(self, i):
42 if not 0 <= i < self.max:
43 raise IndexError
44 n = len(self.sofar)
45 while n <= i:
46 self.sofar.append(str(n*n))
47 n += 1
48 return self.sofar[i]
49
50class BitBucket:
51 def write(self, line):
52 pass
53
Facundo Batista2336bdd2008-01-19 19:12:01 +000054test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000055 ('0', 0),
56 ('1', 1),
57 ('9', 9),
58 ('10', 10),
59 ('99', 99),
60 ('100', 100),
61 ('314', 314),
62 (' 314', 314),
63 ('314 ', 314),
64 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000065 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000066 (' 1x', ValueError),
67 (' 1 ', 1),
68 (' 1\02 ', ValueError),
69 ('', ValueError),
70 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000071 (' \t\t ', ValueError),
Guido van Rossumef87d6e2007-05-02 19:09:54 +000072 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000073 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000074]
75
Facundo Batista2336bdd2008-01-19 19:12:01 +000076test_conv_sign = [
77 ('0', 0),
78 ('1', 1),
79 ('9', 9),
80 ('10', 10),
81 ('99', 99),
82 ('100', 100),
83 ('314', 314),
84 (' 314', ValueError),
85 ('314 ', 314),
86 (' \t\t 314 \t\t ', ValueError),
87 (repr(sys.maxsize), sys.maxsize),
88 (' 1x', ValueError),
89 (' 1 ', ValueError),
90 (' 1\02 ', ValueError),
91 ('', ValueError),
92 (' ', ValueError),
93 (' \t\t ', ValueError),
94 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
95 (chr(0x200), ValueError),
96]
97
Raymond Hettinger96229b12005-03-11 06:49:40 +000098class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +000099 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +0000100 raise RuntimeError
101
102class TestFailingIter:
103 def __iter__(self):
104 raise RuntimeError
105
Walter Dörwald919497e2003-01-19 16:23:59 +0000106class BuiltinTest(unittest.TestCase):
107
108 def test_import(self):
109 __import__('sys')
110 __import__('time')
111 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000112 __import__(name='sys')
113 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000114 self.assertRaises(ImportError, __import__, 'spamspam')
115 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000116 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000117 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +0000118
119 def test_abs(self):
120 # int
121 self.assertEqual(abs(0), 0)
122 self.assertEqual(abs(1234), 1234)
123 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000124 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000125 # float
126 self.assertEqual(abs(0.0), 0.0)
127 self.assertEqual(abs(3.14), 3.14)
128 self.assertEqual(abs(-3.14), 3.14)
129 # long
Guido van Rossume2a383d2007-01-15 16:59:06 +0000130 self.assertEqual(abs(0), 0)
131 self.assertEqual(abs(1234), 1234)
132 self.assertEqual(abs(-1234), 1234)
Walter Dörwald919497e2003-01-19 16:23:59 +0000133 # str
134 self.assertRaises(TypeError, abs, 'a')
135
Raymond Hettinger96229b12005-03-11 06:49:40 +0000136 def test_all(self):
137 self.assertEqual(all([2, 4, 6]), True)
138 self.assertEqual(all([2, None, 6]), False)
139 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
140 self.assertRaises(RuntimeError, all, TestFailingIter())
141 self.assertRaises(TypeError, all, 10) # Non-iterable
142 self.assertRaises(TypeError, all) # No args
143 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
144 self.assertEqual(all([]), True) # Empty iterator
145 S = [50, 60]
146 self.assertEqual(all(x > 42 for x in S), True)
147 S = [50, 40, 60]
148 self.assertEqual(all(x > 42 for x in S), False)
149
150 def test_any(self):
151 self.assertEqual(any([None, None, None]), False)
152 self.assertEqual(any([None, 4, None]), True)
153 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
154 self.assertRaises(RuntimeError, all, TestFailingIter())
155 self.assertRaises(TypeError, any, 10) # Non-iterable
156 self.assertRaises(TypeError, any) # No args
157 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
158 self.assertEqual(any([]), False) # Empty iterator
159 S = [40, 60, 30]
160 self.assertEqual(any(x > 42 for x in S), True)
161 S = [10, 20, 30]
162 self.assertEqual(any(x > 42 for x in S), False)
163
Georg Brandl559e5d72008-06-11 18:37:52 +0000164 def test_ascii(self):
165 self.assertEqual(ascii(''), '\'\'')
166 self.assertEqual(ascii(0), '0')
167 self.assertEqual(ascii(0), '0')
168 self.assertEqual(ascii(()), '()')
169 self.assertEqual(ascii([]), '[]')
170 self.assertEqual(ascii({}), '{}')
171 a = []
172 a.append(a)
173 self.assertEqual(ascii(a), '[[...]]')
174 a = {}
175 a[0] = a
176 self.assertEqual(ascii(a), '{0: {...}}')
Antoine Pitrouc9a8df22010-09-09 20:33:43 +0000177 # Advanced checks for unicode strings
178 def _check_uni(s):
179 self.assertEqual(ascii(s), repr(s))
180 _check_uni("'")
181 _check_uni('"')
182 _check_uni('"\'')
183 _check_uni('\0')
184 _check_uni('\r\n\t .')
185 # Unprintable non-ASCII characters
186 _check_uni('\x85')
187 _check_uni('\u1fff')
188 _check_uni('\U00012fff')
189 # Lone surrogates
190 _check_uni('\ud800')
191 _check_uni('\udfff')
192 # Issue #9804: surrogates should be joined even for printable
193 # wide characters (UCS-2 builds).
194 self.assertEqual(ascii('\U0001d121'), "'\\U0001d121'")
195 # All together
196 s = "'\0\"\n\r\t abcd\x85é\U00012fff\uD800\U0001D121xxx."
197 self.assertEqual(ascii(s),
198 r"""'\'\x00"\n\r\t abcd\x85\xe9\U00012fff\ud800\U0001d121xxx.'""")
Georg Brandl559e5d72008-06-11 18:37:52 +0000199
Thomas Wouters89f507f2006-12-13 04:49:30 +0000200 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000201 x = -sys.maxsize-1
Georg Brandlab91fde2009-08-13 08:51:18 +0000202 self.assertTrue(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000203 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000204
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000205 # XXX(nnorwitz): This test case for callable should probably be removed.
Walter Dörwald919497e2003-01-19 16:23:59 +0000206 def test_callable(self):
Georg Brandlab91fde2009-08-13 08:51:18 +0000207 self.assertTrue(hasattr(len, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000208 def f(): pass
Georg Brandlab91fde2009-08-13 08:51:18 +0000209 self.assertTrue(hasattr(f, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000210 class C:
211 def meth(self): pass
Georg Brandlab91fde2009-08-13 08:51:18 +0000212 self.assertTrue(hasattr(C, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000213 x = C()
Georg Brandlab91fde2009-08-13 08:51:18 +0000214 self.assertTrue(hasattr(x.meth, '__call__'))
215 self.assertTrue(not hasattr(x, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000216 class D(C):
217 def __call__(self): pass
218 y = D()
Georg Brandlab91fde2009-08-13 08:51:18 +0000219 self.assertTrue(hasattr(y, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000220 y()
221
222 def test_chr(self):
223 self.assertEqual(chr(32), ' ')
224 self.assertEqual(chr(65), 'A')
225 self.assertEqual(chr(97), 'a')
226 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000227 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000228 self.assertEqual(chr(sys.maxunicode),
229 str(('\\U%08x' % (sys.maxunicode)).encode("ascii"),
230 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000231 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000232 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
233 self.assertEqual(chr(0x00010000), "\U00010000")
234 self.assertEqual(chr(0x00010001), "\U00010001")
235 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
236 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
237 self.assertEqual(chr(0x00100000), "\U00100000")
238 self.assertEqual(chr(0x00100001), "\U00100001")
239 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
240 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
241 self.assertRaises(ValueError, chr, -1)
242 self.assertRaises(ValueError, chr, 0x00110000)
Amaury Forgeot d'Arc7888d082008-08-01 01:06:32 +0000243 self.assertRaises((OverflowError, ValueError), chr, 2**32)
Walter Dörwald919497e2003-01-19 16:23:59 +0000244
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000245 def test_cmp(self):
Georg Brandlab91fde2009-08-13 08:51:18 +0000246 self.assertTrue(not hasattr(builtins, "cmp"))
Walter Dörwald919497e2003-01-19 16:23:59 +0000247
Walter Dörwald919497e2003-01-19 16:23:59 +0000248 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000249 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000250 bom = b'\xef\xbb\xbf'
251 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000252 compile(source='pass', filename='?', mode='exec')
253 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
254 compile('pass', '?', dont_inherit=1, mode='exec')
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000255 compile(memoryview(b"text"), "name", "exec")
Walter Dörwald919497e2003-01-19 16:23:59 +0000256 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000257 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
258 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000259 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000260 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
261 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000262 compile('print("\xe5")\n', '', 'exec')
263 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
264 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000265
Walter Dörwald919497e2003-01-19 16:23:59 +0000266 def test_delattr(self):
267 import sys
268 sys.spam = 1
269 delattr(sys, 'spam')
270 self.assertRaises(TypeError, delattr)
271
272 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000273 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000274 self.assertRaises(TypeError, dir, 42, 42)
275
Georg Brandle32b4222007-03-10 22:13:27 +0000276 # dir() - local scope
277 local_var = 1
Georg Brandlab91fde2009-08-13 08:51:18 +0000278 self.assertTrue('local_var' in dir())
Georg Brandle32b4222007-03-10 22:13:27 +0000279
280 # dir(module)
281 import sys
Georg Brandlab91fde2009-08-13 08:51:18 +0000282 self.assertTrue('exit' in dir(sys))
Georg Brandle32b4222007-03-10 22:13:27 +0000283
284 # dir(module_with_invalid__dict__)
285 import types
286 class Foo(types.ModuleType):
287 __dict__ = 8
288 f = Foo("foo")
289 self.assertRaises(TypeError, dir, f)
290
291 # dir(type)
Georg Brandlab91fde2009-08-13 08:51:18 +0000292 self.assertTrue("strip" in dir(str))
293 self.assertTrue("__mro__" not in dir(str))
Georg Brandle32b4222007-03-10 22:13:27 +0000294
295 # dir(obj)
296 class Foo(object):
297 def __init__(self):
298 self.x = 7
299 self.y = 8
300 self.z = 9
301 f = Foo()
Georg Brandlab91fde2009-08-13 08:51:18 +0000302 self.assertTrue("y" in dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000303
304 # dir(obj_no__dict__)
305 class Foo(object):
306 __slots__ = []
307 f = Foo()
Georg Brandlab91fde2009-08-13 08:51:18 +0000308 self.assertTrue("__repr__" in dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000309
310 # dir(obj_no__class__with__dict__)
311 # (an ugly trick to cause getattr(f, "__class__") to fail)
312 class Foo(object):
313 __slots__ = ["__class__", "__dict__"]
314 def __init__(self):
315 self.bar = "wow"
316 f = Foo()
Georg Brandlab91fde2009-08-13 08:51:18 +0000317 self.assertTrue("__repr__" not in dir(f))
318 self.assertTrue("bar" in dir(f))
Georg Brandle32b4222007-03-10 22:13:27 +0000319
320 # dir(obj_using __dir__)
321 class Foo(object):
322 def __dir__(self):
323 return ["kan", "ga", "roo"]
324 f = Foo()
Georg Brandlab91fde2009-08-13 08:51:18 +0000325 self.assertTrue(dir(f) == ["ga", "kan", "roo"])
Georg Brandle32b4222007-03-10 22:13:27 +0000326
327 # dir(obj__dir__not_list)
328 class Foo(object):
329 def __dir__(self):
330 return 7
331 f = Foo()
332 self.assertRaises(TypeError, dir, f)
333
Collin Winter3eed7652007-08-14 17:53:54 +0000334 # dir(traceback)
335 try:
336 raise IndexError
337 except:
338 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
339
340
Walter Dörwald919497e2003-01-19 16:23:59 +0000341 def test_divmod(self):
342 self.assertEqual(divmod(12, 7), (1, 5))
343 self.assertEqual(divmod(-12, 7), (-2, 2))
344 self.assertEqual(divmod(12, -7), (-2, -2))
345 self.assertEqual(divmod(-12, -7), (1, -5))
346
Guido van Rossume2a383d2007-01-15 16:59:06 +0000347 self.assertEqual(divmod(12, 7), (1, 5))
348 self.assertEqual(divmod(-12, 7), (-2, 2))
349 self.assertEqual(divmod(12, -7), (-2, -2))
350 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000351
Guido van Rossume2a383d2007-01-15 16:59:06 +0000352 self.assertEqual(divmod(12, 7), (1, 5))
353 self.assertEqual(divmod(-12, 7), (-2, 2))
354 self.assertEqual(divmod(12, -7), (-2, -2))
355 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000356
Christian Heimesa37d4c62007-12-04 23:02:19 +0000357 self.assertEqual(divmod(-sys.maxsize-1, -1),
358 (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000359
Georg Brandlab91fde2009-08-13 08:51:18 +0000360 self.assertTrue(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
361 self.assertTrue(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
362 self.assertTrue(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
363 self.assertTrue(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000364
365 self.assertRaises(TypeError, divmod)
366
367 def test_eval(self):
368 self.assertEqual(eval('1+1'), 2)
369 self.assertEqual(eval(' 1+1\n'), 2)
370 globals = {'a': 1, 'b': 2}
371 locals = {'b': 200, 'c': 300}
372 self.assertEqual(eval('a', globals) , 1)
373 self.assertEqual(eval('a', globals, locals), 1)
374 self.assertEqual(eval('b', globals, locals), 200)
375 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000376 globals = {'a': 1, 'b': 2}
377 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000378 bom = b'\xef\xbb\xbf'
379 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000380 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000381 self.assertRaises(TypeError, eval)
382 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000383 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000384
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000385 def test_general_eval(self):
386 # Tests that general mappings can be used for the locals argument
387
388 class M:
389 "Test mapping interface versus possible calls from eval()."
390 def __getitem__(self, key):
391 if key == 'a':
392 return 12
393 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000394 def keys(self):
395 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000396
397 m = M()
398 g = globals()
399 self.assertEqual(eval('a', g, m), 12)
400 self.assertRaises(NameError, eval, 'b', g, m)
401 self.assertEqual(eval('dir()', g, m), list('xyz'))
402 self.assertEqual(eval('globals()', g, m), g)
403 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000404 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000405 class A:
406 "Non-mapping"
407 pass
408 m = A()
409 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000410
411 # Verify that dict subclasses work as well
412 class D(dict):
413 def __getitem__(self, key):
414 if key == 'a':
415 return 12
416 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000417 def keys(self):
418 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000419
420 d = D()
421 self.assertEqual(eval('a', g, d), 12)
422 self.assertRaises(NameError, eval, 'b', g, d)
423 self.assertEqual(eval('dir()', g, d), list('xyz'))
424 self.assertEqual(eval('globals()', g, d), g)
425 self.assertEqual(eval('locals()', g, d), d)
426
427 # Verify locals stores (used by list comps)
428 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000429 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000430
431 class SpreadSheet:
432 "Sample application showing nested, calculated lookups."
433 _cells = {}
434 def __setitem__(self, key, formula):
435 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000436 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000437 return eval(self._cells[key], globals(), self)
438
439 ss = SpreadSheet()
440 ss['a1'] = '5'
441 ss['a2'] = 'a1*6'
442 ss['a3'] = 'a2*7'
443 self.assertEqual(ss['a3'], 210)
444
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000445 # Verify that dir() catches a non-list returned by eval
446 # SF bug #1004669
447 class C:
448 def __getitem__(self, item):
449 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000450 def keys(self):
451 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000452 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
453
Georg Brandl7cae87c2006-09-06 06:51:57 +0000454 def test_exec(self):
455 g = {}
456 exec('z = 1', g)
457 if '__builtins__' in g:
458 del g['__builtins__']
459 self.assertEqual(g, {'z': 1})
460
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000461 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000462 if '__builtins__' in g:
463 del g['__builtins__']
464 self.assertEqual(g, {'z': 2})
465 g = {}
466 l = {}
467
468 import warnings
469 warnings.filterwarnings("ignore", "global statement", module="<string>")
470 exec('global a; a = 1; b = 2', g, l)
471 if '__builtins__' in g:
472 del g['__builtins__']
473 if '__builtins__' in l:
474 del l['__builtins__']
475 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
476
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +0000477 def test_exec_redirected(self):
478 savestdout = sys.stdout
479 sys.stdout = None # Whatever that cannot flush()
480 try:
481 # Used to raise SystemError('error return without exception set')
482 exec('a')
483 except NameError:
484 pass
485 finally:
486 sys.stdout = savestdout
487
Walter Dörwald919497e2003-01-19 16:23:59 +0000488 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000489 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
490 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
491 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
492 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
493 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000494 def identity(item):
495 return 1
496 filter(identity, Squares(5))
497 self.assertRaises(TypeError, filter)
498 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000499 def __getitem__(self, index):
500 if index<4:
501 return 42
502 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000503 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000504 def badfunc():
505 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000506 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000507
Walter Dörwaldbf517072003-01-27 15:57:14 +0000508 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000509 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
510 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
511 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000512
Walter Dörwald919497e2003-01-19 16:23:59 +0000513 def test_getattr(self):
514 import sys
Georg Brandlab91fde2009-08-13 08:51:18 +0000515 self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
Walter Dörwald919497e2003-01-19 16:23:59 +0000516 self.assertRaises(TypeError, getattr, sys, 1)
517 self.assertRaises(TypeError, getattr, sys, 1, "foo")
518 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000519 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Victor Stinner7f045cf2010-03-21 21:07:44 +0000520 # unicode surrogates are not encodable to the default encoding (utf8)
521 self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
Walter Dörwald919497e2003-01-19 16:23:59 +0000522
523 def test_hasattr(self):
524 import sys
Georg Brandlab91fde2009-08-13 08:51:18 +0000525 self.assertTrue(hasattr(sys, 'stdout'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000526 self.assertRaises(TypeError, hasattr, sys, 1)
527 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000528 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000529
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000530 # Check that hasattr allows SystemExit and KeyboardInterrupts by
531 class A:
532 def __getattr__(self, what):
533 raise KeyboardInterrupt
534 self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
535 class B:
536 def __getattr__(self, what):
537 raise SystemExit
538 self.assertRaises(SystemExit, hasattr, B(), "b")
539
Walter Dörwald919497e2003-01-19 16:23:59 +0000540 def test_hash(self):
541 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000542 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000543 self.assertEqual(hash(1), hash(1.0))
544 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000545 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000546 hash((0,1,2,3))
547 def f(): pass
548 self.assertRaises(TypeError, hash, [])
549 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000550 # Bug 1536021: Allow hash to return long objects
551 class X:
552 def __hash__(self):
553 return 2**100
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000554 self.assertEqual(type(hash(X())), int)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000555 class Y(object):
556 def __hash__(self):
557 return 2**100
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000558 self.assertEqual(type(hash(Y())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000559 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000560 def __hash__(self):
561 return self
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000562 self.assertEqual(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000563
564 def test_hex(self):
565 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000566 self.assertEqual(hex(16), '0x10')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000567 self.assertEqual(hex(-16), '-0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000568 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000569 self.assertRaises(TypeError, hex, {})
570
571 def test_id(self):
572 id(None)
573 id(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000574 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000575 id(1.0)
576 id('spam')
577 id((0,1,2,3))
578 id([0,1,2,3])
579 id({'spam': 1, 'eggs': 2, 'ham': 3})
580
Guido van Rossuma88a0332007-02-26 16:59:55 +0000581 # Test input() later, alphabetized as if it were raw_input
582
Walter Dörwald919497e2003-01-19 16:23:59 +0000583 def test_iter(self):
584 self.assertRaises(TypeError, iter)
585 self.assertRaises(TypeError, iter, 42, 42)
586 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000587 for l in lists:
588 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000589 self.assertEqual(next(i), '1')
590 self.assertEqual(next(i), '2')
591 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000592
593 def test_isinstance(self):
594 class C:
595 pass
596 class D(C):
597 pass
598 class E:
599 pass
600 c = C()
601 d = D()
602 e = E()
Georg Brandlab91fde2009-08-13 08:51:18 +0000603 self.assertTrue(isinstance(c, C))
604 self.assertTrue(isinstance(d, C))
605 self.assertTrue(not isinstance(e, C))
606 self.assertTrue(not isinstance(c, D))
607 self.assertTrue(not isinstance('foo', E))
Walter Dörwald919497e2003-01-19 16:23:59 +0000608 self.assertRaises(TypeError, isinstance, E, 'foo')
609 self.assertRaises(TypeError, isinstance)
610
611 def test_issubclass(self):
612 class C:
613 pass
614 class D(C):
615 pass
616 class E:
617 pass
618 c = C()
619 d = D()
620 e = E()
Georg Brandlab91fde2009-08-13 08:51:18 +0000621 self.assertTrue(issubclass(D, C))
622 self.assertTrue(issubclass(C, C))
623 self.assertTrue(not issubclass(C, D))
Walter Dörwald919497e2003-01-19 16:23:59 +0000624 self.assertRaises(TypeError, issubclass, 'foo', E)
625 self.assertRaises(TypeError, issubclass, E, 'foo')
626 self.assertRaises(TypeError, issubclass)
627
628 def test_len(self):
629 self.assertEqual(len('123'), 3)
630 self.assertEqual(len(()), 0)
631 self.assertEqual(len((1, 2, 3, 4)), 4)
632 self.assertEqual(len([1, 2, 3, 4]), 4)
633 self.assertEqual(len({}), 0)
634 self.assertEqual(len({'a':1, 'b': 2}), 2)
635 class BadSeq:
636 def __len__(self):
637 raise ValueError
638 self.assertRaises(ValueError, len, BadSeq())
Benjamin Petersonee1ae7c2009-02-08 21:07:20 +0000639 class InvalidLen:
640 def __len__(self):
641 return None
642 self.assertRaises(TypeError, len, InvalidLen())
643 class FloatLen:
644 def __len__(self):
645 return 4.5
646 self.assertRaises(TypeError, len, FloatLen())
647 class HugeLen:
648 def __len__(self):
649 return sys.maxsize + 1
650 self.assertRaises(OverflowError, len, HugeLen())
Walter Dörwald919497e2003-01-19 16:23:59 +0000651
Walter Dörwald919497e2003-01-19 16:23:59 +0000652 def test_map(self):
653 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000654 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000655 [1, 4, 9]
656 )
657 try:
658 from math import sqrt
659 except ImportError:
660 def sqrt(x):
661 return pow(x, 0.5)
662 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000663 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000664 [[4.0, 2.0], [9.0, 3.0]]
665 )
666 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000667 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000668 [10, 4, 6]
669 )
670
671 def plus(*v):
672 accu = 0
673 for i in v: accu = accu + i
674 return accu
675 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000676 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000677 [1, 3, 7]
678 )
679 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000680 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000681 [1+4, 3+9, 7+2]
682 )
683 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000684 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +0000685 [1+4+1, 3+9+1, 7+2+0]
686 )
687 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000688 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +0000689 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
690 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000691 def Max(a, b):
692 if a is None:
693 return b
694 if b is None:
695 return a
696 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +0000697 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000698 list(map(Max, Squares(3), Squares(2))),
699 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +0000700 )
701 self.assertRaises(TypeError, map)
702 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000703 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000704 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000705 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000706 yield None
707 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +0000708 def badfunc(x):
709 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000710 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000711
712 def test_max(self):
713 self.assertEqual(max('123123'), '3')
714 self.assertEqual(max(1, 2, 3), 3)
715 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
716 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
717
Guido van Rossume2a383d2007-01-15 16:59:06 +0000718 self.assertEqual(max(1, 2, 3.0), 3.0)
719 self.assertEqual(max(1, 2.0, 3), 3)
720 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000721
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000722 for stmt in (
723 "max(key=int)", # no args
724 "max(1, key=int)", # single arg not iterable
725 "max(1, 2, keystone=int)", # wrong keyword
726 "max(1, 2, key=int, abc=int)", # two many keywords
727 "max(1, 2, key=1)", # keyfunc is not callable
728 ):
Tim Peters7f061872004-12-07 21:17:46 +0000729 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000730 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000731 except TypeError:
732 pass
733 else:
734 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000735
736 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
737 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
738 self.assertEqual(max(1, 2, key=neg), 1) # two elems
739
740 data = [random.randrange(200) for i in range(100)]
741 keys = dict((elem, random.randrange(50)) for elem in data)
742 f = keys.__getitem__
743 self.assertEqual(max(data, key=f),
744 sorted(reversed(data), key=f)[-1])
745
Walter Dörwald919497e2003-01-19 16:23:59 +0000746 def test_min(self):
747 self.assertEqual(min('123123'), '1')
748 self.assertEqual(min(1, 2, 3), 1)
749 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
750 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
751
Guido van Rossume2a383d2007-01-15 16:59:06 +0000752 self.assertEqual(min(1, 2, 3.0), 1)
753 self.assertEqual(min(1, 2.0, 3), 1)
754 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000755
756 self.assertRaises(TypeError, min)
757 self.assertRaises(TypeError, min, 42)
758 self.assertRaises(ValueError, min, ())
759 class BadSeq:
760 def __getitem__(self, index):
761 raise ValueError
762 self.assertRaises(ValueError, min, BadSeq())
Walter Dörwald919497e2003-01-19 16:23:59 +0000763
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000764 for stmt in (
765 "min(key=int)", # no args
766 "min(1, key=int)", # single arg not iterable
767 "min(1, 2, keystone=int)", # wrong keyword
768 "min(1, 2, key=int, abc=int)", # two many keywords
769 "min(1, 2, key=1)", # keyfunc is not callable
770 ):
Tim Peters7f061872004-12-07 21:17:46 +0000771 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000772 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +0000773 except TypeError:
774 pass
775 else:
776 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000777
778 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
779 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
780 self.assertEqual(min(1, 2, key=neg), 2) # two elems
781
782 data = [random.randrange(200) for i in range(100)]
783 keys = dict((elem, random.randrange(50)) for elem in data)
784 f = keys.__getitem__
785 self.assertEqual(min(data, key=f),
786 sorted(data, key=f)[0])
787
Georg Brandla18af4e2007-04-21 15:47:16 +0000788 def test_next(self):
789 it = iter(range(2))
790 self.assertEqual(next(it), 0)
791 self.assertEqual(next(it), 1)
792 self.assertRaises(StopIteration, next, it)
793 self.assertRaises(StopIteration, next, it)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000794 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000795
796 class Iter(object):
797 def __iter__(self):
798 return self
799 def __next__(self):
800 raise StopIteration
801
802 it = iter(Iter())
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000803 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000804 self.assertRaises(StopIteration, next, it)
805
806 def gen():
807 yield 1
808 return
809
810 it = gen()
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000811 self.assertEqual(next(it), 1)
Georg Brandla18af4e2007-04-21 15:47:16 +0000812 self.assertRaises(StopIteration, next, it)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000813 self.assertEqual(next(it, 42), 42)
Georg Brandla18af4e2007-04-21 15:47:16 +0000814
Walter Dörwald919497e2003-01-19 16:23:59 +0000815 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000816 self.assertEqual(oct(100), '0o144')
817 self.assertEqual(oct(100), '0o144')
818 self.assertEqual(oct(-100), '-0o144')
819 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000820 self.assertRaises(TypeError, oct, ())
821
822 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +0000823 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +0000824 fp = open(TESTFN, 'w')
825 try:
826 fp.write('1+1\n')
827 fp.write('1+1\n')
828 fp.write('The quick brown fox jumps over the lazy dog')
829 fp.write('.\n')
830 fp.write('Dear John\n')
831 fp.write('XXX'*100)
832 fp.write('YYY'*100)
833 finally:
834 fp.close()
835
836 def test_open(self):
837 self.write_testfile()
838 fp = open(TESTFN, 'r')
839 try:
840 self.assertEqual(fp.readline(4), '1+1\n')
841 self.assertEqual(fp.readline(4), '1+1\n')
842 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
843 self.assertEqual(fp.readline(4), 'Dear')
844 self.assertEqual(fp.readline(100), ' John\n')
845 self.assertEqual(fp.read(300), 'XXX'*100)
846 self.assertEqual(fp.read(1000), 'YYY'*100)
847 finally:
848 fp.close()
849 unlink(TESTFN)
850
851 def test_ord(self):
852 self.assertEqual(ord(' '), 32)
853 self.assertEqual(ord('A'), 65)
854 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000855 self.assertEqual(ord('\x80'), 128)
856 self.assertEqual(ord('\xff'), 255)
857
858 self.assertEqual(ord(b' '), 32)
859 self.assertEqual(ord(b'A'), 65)
860 self.assertEqual(ord(b'a'), 97)
861 self.assertEqual(ord(b'\x80'), 128)
862 self.assertEqual(ord(b'\xff'), 255)
863
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000864 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +0000865 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +0000866
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000867 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
868 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
869 self.assertEqual(ord("\U00010000"), 0x00010000)
870 self.assertEqual(ord("\U00010001"), 0x00010001)
871 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
872 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
873 self.assertEqual(ord("\U00100000"), 0x00100000)
874 self.assertEqual(ord("\U00100001"), 0x00100001)
875 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
876 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
877
Walter Dörwald919497e2003-01-19 16:23:59 +0000878 def test_pow(self):
879 self.assertEqual(pow(0,0), 1)
880 self.assertEqual(pow(0,1), 0)
881 self.assertEqual(pow(1,0), 1)
882 self.assertEqual(pow(1,1), 1)
883
884 self.assertEqual(pow(2,0), 1)
885 self.assertEqual(pow(2,10), 1024)
886 self.assertEqual(pow(2,20), 1024*1024)
887 self.assertEqual(pow(2,30), 1024*1024*1024)
888
889 self.assertEqual(pow(-2,0), 1)
890 self.assertEqual(pow(-2,1), -2)
891 self.assertEqual(pow(-2,2), 4)
892 self.assertEqual(pow(-2,3), -8)
893
Guido van Rossume2a383d2007-01-15 16:59:06 +0000894 self.assertEqual(pow(0,0), 1)
895 self.assertEqual(pow(0,1), 0)
896 self.assertEqual(pow(1,0), 1)
897 self.assertEqual(pow(1,1), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000898
Guido van Rossume2a383d2007-01-15 16:59:06 +0000899 self.assertEqual(pow(2,0), 1)
900 self.assertEqual(pow(2,10), 1024)
901 self.assertEqual(pow(2,20), 1024*1024)
902 self.assertEqual(pow(2,30), 1024*1024*1024)
Walter Dörwald919497e2003-01-19 16:23:59 +0000903
Guido van Rossume2a383d2007-01-15 16:59:06 +0000904 self.assertEqual(pow(-2,0), 1)
905 self.assertEqual(pow(-2,1), -2)
906 self.assertEqual(pow(-2,2), 4)
907 self.assertEqual(pow(-2,3), -8)
Walter Dörwald919497e2003-01-19 16:23:59 +0000908
909 self.assertAlmostEqual(pow(0.,0), 1.)
910 self.assertAlmostEqual(pow(0.,1), 0.)
911 self.assertAlmostEqual(pow(1.,0), 1.)
912 self.assertAlmostEqual(pow(1.,1), 1.)
913
914 self.assertAlmostEqual(pow(2.,0), 1.)
915 self.assertAlmostEqual(pow(2.,10), 1024.)
916 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
917 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
918
919 self.assertAlmostEqual(pow(-2.,0), 1.)
920 self.assertAlmostEqual(pow(-2.,1), -2.)
921 self.assertAlmostEqual(pow(-2.,2), 4.)
922 self.assertAlmostEqual(pow(-2.,3), -8.)
923
Guido van Rossume2a383d2007-01-15 16:59:06 +0000924 for x in 2, 2, 2.0:
925 for y in 10, 10, 10.0:
926 for z in 1000, 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +0000927 if isinstance(x, float) or \
928 isinstance(y, float) or \
929 isinstance(z, float):
930 self.assertRaises(TypeError, pow, x, y, z)
931 else:
932 self.assertAlmostEqual(pow(x, y, z), 24.0)
933
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +0000934 self.assertAlmostEqual(pow(-1, 0.5), 1j)
935 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
936
Walter Dörwald919497e2003-01-19 16:23:59 +0000937 self.assertRaises(TypeError, pow, -1, -2, 3)
938 self.assertRaises(ValueError, pow, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000939 self.assertRaises(TypeError, pow, -1, -2, 3)
940 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000941
942 self.assertRaises(TypeError, pow)
943
944 def test_range(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000945 self.assertEqual(list(range(3)), [0, 1, 2])
946 self.assertEqual(list(range(1, 5)), [1, 2, 3, 4])
947 self.assertEqual(list(range(0)), [])
948 self.assertEqual(list(range(-3)), [])
949 self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
950 #self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
Walter Dörwald919497e2003-01-19 16:23:59 +0000951
Mark Dickinsoneb36d312009-06-24 18:36:46 +0000952 #issue 6334: the internal stored range length was being
953 #computed incorrectly in some cases involving large arguments.
954 x = range(10**20, 10**20+10, 3)
955 self.assertEqual(len(x), 4)
956 self.assertEqual(len(list(x)), 4)
957
958 x = range(10**20+10, 10**20, 3)
959 self.assertEqual(len(x), 0)
960 self.assertEqual(len(list(x)), 0)
961
962 x = range(10**20, 10**20+10, -3)
963 self.assertEqual(len(x), 0)
964 self.assertEqual(len(list(x)), 0)
965
966 x = range(10**20+10, 10**20, -3)
967 self.assertEqual(len(x), 4)
968 self.assertEqual(len(list(x)), 4)
969
Guido van Rossum805365e2007-05-07 22:24:25 +0000970 """ XXX(nnorwitz):
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000971 # Now test range() with longs
Guido van Rossum805365e2007-05-07 22:24:25 +0000972 self.assertEqual(list(range(-2**100)), [])
973 self.assertEqual(list(range(0, -2**100)), [])
974 self.assertEqual(list(range(0, 2**100, -1)), [])
975 self.assertEqual(list(range(0, 2**100, -1)), [])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000976
Christian Heimesa37d4c62007-12-04 23:02:19 +0000977 a = int(10 * sys.maxsize)
978 b = int(100 * sys.maxsize)
979 c = int(50 * sys.maxsize)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000980
Guido van Rossum805365e2007-05-07 22:24:25 +0000981 self.assertEqual(list(range(a, a+2)), [a, a+1])
982 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
983 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000984
Guido van Rossum805365e2007-05-07 22:24:25 +0000985 seq = list(range(a, b, c))
Georg Brandlab91fde2009-08-13 08:51:18 +0000986 self.assertTrue(a in seq)
987 self.assertTrue(b not in seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000988 self.assertEqual(len(seq), 2)
989
Guido van Rossum805365e2007-05-07 22:24:25 +0000990 seq = list(range(b, a, -c))
Georg Brandlab91fde2009-08-13 08:51:18 +0000991 self.assertTrue(b in seq)
992 self.assertTrue(a not in seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000993 self.assertEqual(len(seq), 2)
994
Guido van Rossum805365e2007-05-07 22:24:25 +0000995 seq = list(range(-a, -b, -c))
Georg Brandlab91fde2009-08-13 08:51:18 +0000996 self.assertTrue(-a in seq)
997 self.assertTrue(-b not in seq)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000998 self.assertEqual(len(seq), 2)
999
Walter Dörwald919497e2003-01-19 16:23:59 +00001000 self.assertRaises(TypeError, range)
1001 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1002 self.assertRaises(ValueError, range, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001003 self.assertRaises(ValueError, range, a, a + 1, int(0))
Neal Norwitzfcf44352005-11-27 20:37:43 +00001004
1005 class badzero(int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001006 def __eq__(self, other):
Neal Norwitzfcf44352005-11-27 20:37:43 +00001007 raise RuntimeError
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001008 __ne__ = __lt__ = __gt__ = __le__ = __ge__ = __eq__
1009
1010 # XXX This won't (but should!) raise RuntimeError if a is an int...
Neal Norwitzfcf44352005-11-27 20:37:43 +00001011 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Guido van Rossum805365e2007-05-07 22:24:25 +00001012 """
Walter Dörwald919497e2003-01-19 16:23:59 +00001013
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001014 # Reject floats when it would require PyLongs to represent.
1015 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001016 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001017
Walter Dörwald357981e2003-04-15 18:59:28 +00001018 self.assertRaises(TypeError, range, 0, "spam")
1019 self.assertRaises(TypeError, range, 0, 42, "spam")
1020
Christian Heimesa37d4c62007-12-04 23:02:19 +00001021 #NEAL self.assertRaises(OverflowError, range, -sys.maxsize, sys.maxsize)
1022 #NEAL self.assertRaises(OverflowError, range, 0, 2*sys.maxsize)
Guido van Rossum805365e2007-05-07 22:24:25 +00001023
Christian Heimesa37d4c62007-12-04 23:02:19 +00001024 self.assertRaises(OverflowError, len, range(0, sys.maxsize**10))
Walter Dörwald357981e2003-04-15 18:59:28 +00001025
Guido van Rossuma88a0332007-02-26 16:59:55 +00001026 def test_input(self):
1027 self.write_testfile()
1028 fp = open(TESTFN, 'r')
1029 savestdin = sys.stdin
1030 savestdout = sys.stdout # Eats the echo
1031 try:
1032 sys.stdin = fp
1033 sys.stdout = BitBucket()
1034 self.assertEqual(input(), "1+1")
1035 self.assertEqual(input('testing\n'), "1+1")
1036 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1037 self.assertEqual(input('testing\n'), 'Dear John')
1038
1039 # SF 1535165: don't segfault on closed stdin
1040 # sys.stdout must be a regular file for triggering
1041 sys.stdout = savestdout
1042 sys.stdin.close()
1043 self.assertRaises(ValueError, input)
1044
1045 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001046 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001047 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001048 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001049 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001050 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001051 self.assertRaises(EOFError, input)
1052
1053 del sys.stdout
1054 self.assertRaises(RuntimeError, input, 'prompt')
1055 del sys.stdin
1056 self.assertRaises(RuntimeError, input, 'prompt')
1057 finally:
1058 sys.stdin = savestdin
1059 sys.stdout = savestdout
1060 fp.close()
1061 unlink(TESTFN)
1062
Walter Dörwald919497e2003-01-19 16:23:59 +00001063 def test_repr(self):
1064 self.assertEqual(repr(''), '\'\'')
1065 self.assertEqual(repr(0), '0')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001066 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001067 self.assertEqual(repr(()), '()')
1068 self.assertEqual(repr([]), '[]')
1069 self.assertEqual(repr({}), '{}')
1070 a = []
1071 a.append(a)
1072 self.assertEqual(repr(a), '[[...]]')
1073 a = {}
1074 a[0] = a
1075 self.assertEqual(repr(a), '{0: {...}}')
1076
1077 def test_round(self):
1078 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001079 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001080 self.assertEqual(round(1.0), 1.0)
1081 self.assertEqual(round(10.0), 10.0)
1082 self.assertEqual(round(1000000000.0), 1000000000.0)
1083 self.assertEqual(round(1e20), 1e20)
1084
1085 self.assertEqual(round(-1.0), -1.0)
1086 self.assertEqual(round(-10.0), -10.0)
1087 self.assertEqual(round(-1000000000.0), -1000000000.0)
1088 self.assertEqual(round(-1e20), -1e20)
1089
1090 self.assertEqual(round(0.1), 0.0)
1091 self.assertEqual(round(1.1), 1.0)
1092 self.assertEqual(round(10.1), 10.0)
1093 self.assertEqual(round(1000000000.1), 1000000000.0)
1094
1095 self.assertEqual(round(-1.1), -1.0)
1096 self.assertEqual(round(-10.1), -10.0)
1097 self.assertEqual(round(-1000000000.1), -1000000000.0)
1098
1099 self.assertEqual(round(0.9), 1.0)
1100 self.assertEqual(round(9.9), 10.0)
1101 self.assertEqual(round(999999999.9), 1000000000.0)
1102
1103 self.assertEqual(round(-0.9), -1.0)
1104 self.assertEqual(round(-9.9), -10.0)
1105 self.assertEqual(round(-999999999.9), -1000000000.0)
1106
1107 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001108 self.assertEqual(type(round(-8.0, -1)), float)
1109
1110 self.assertEqual(type(round(-8.0, 0)), float)
1111 self.assertEqual(type(round(-8.0, 1)), float)
1112
1113 # Check even / odd rounding behaviour
1114 self.assertEqual(round(5.5), 6)
1115 self.assertEqual(round(6.5), 6)
1116 self.assertEqual(round(-5.5), -6)
1117 self.assertEqual(round(-6.5), -6)
1118
1119 # Check behavior on ints
1120 self.assertEqual(round(0), 0)
1121 self.assertEqual(round(8), 8)
1122 self.assertEqual(round(-8), -8)
1123 self.assertEqual(type(round(0)), int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001124 self.assertEqual(type(round(-8, -1)), int)
1125 self.assertEqual(type(round(-8, 0)), int)
1126 self.assertEqual(type(round(-8, 1)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001127
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001128 # test new kwargs
1129 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1130
Walter Dörwald919497e2003-01-19 16:23:59 +00001131 self.assertRaises(TypeError, round)
1132
Alex Martelliae211f92007-08-22 23:21:33 +00001133 # test generic rounding delegation for reals
1134 class TestRound:
1135 def __round__(self):
1136 return 23
1137
1138 class TestNoRound:
1139 pass
1140
1141 self.assertEqual(round(TestRound()), 23)
1142
1143 self.assertRaises(TypeError, round, 1, 2, 3)
1144 self.assertRaises(TypeError, round, TestNoRound())
1145
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001146 t = TestNoRound()
1147 t.__round__ = lambda *args: args
1148 self.assertRaises(TypeError, round, t)
1149 self.assertRaises(TypeError, round, t, 0)
1150
Mark Dickinson94882db2009-11-09 17:14:18 +00001151 # Some versions of glibc for alpha have a bug that affects
1152 # float -> integer rounding (floor, ceil, rint, round) for
1153 # values in the range [2**52, 2**53). See:
1154 #
1155 # http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1156 #
1157 # We skip this test on Linux/alpha if it would fail.
1158 linux_alpha = (platform.system().startswith('Linux') and
1159 platform.machine().startswith('alpha'))
1160 system_round_bug = round(5e15+1) != 5e15+1
1161 @unittest.skipIf(linux_alpha and system_round_bug,
1162 "test will fail; failure is probably due to a "
1163 "buggy system round function")
1164 def test_round_large(self):
1165 # Issue #1869: integral floats should remain unchanged
1166 self.assertEqual(round(5e15-1), 5e15-1)
1167 self.assertEqual(round(5e15), 5e15)
1168 self.assertEqual(round(5e15+1), 5e15+1)
1169 self.assertEqual(round(5e15+2), 5e15+2)
1170 self.assertEqual(round(5e15+3), 5e15+3)
1171
Walter Dörwald919497e2003-01-19 16:23:59 +00001172 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001173 setattr(sys, 'spam', 1)
1174 self.assertEqual(sys.spam, 1)
1175 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1176 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001177
Walter Dörwald919497e2003-01-19 16:23:59 +00001178
Alex Martellia70b1912003-04-22 08:12:33 +00001179 def test_sum(self):
1180 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001181 self.assertEqual(sum(list(range(2,8))), 27)
1182 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001183 self.assertEqual(sum(Squares(10)), 285)
1184 self.assertEqual(sum(iter(Squares(10))), 285)
1185 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1186
1187 self.assertRaises(TypeError, sum)
1188 self.assertRaises(TypeError, sum, 42)
1189 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1190 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1191 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1192 self.assertRaises(TypeError, sum, [{2:3}])
1193 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1194
1195 class BadSeq:
1196 def __getitem__(self, index):
1197 raise ValueError
1198 self.assertRaises(ValueError, sum, BadSeq())
1199
Walter Dörwald919497e2003-01-19 16:23:59 +00001200 def test_type(self):
1201 self.assertEqual(type(''), type('123'))
1202 self.assertNotEqual(type(''), type(()))
1203
Guido van Rossumfee7b932005-01-16 00:21:28 +00001204 # We don't want self in vars(), so these are static methods
1205
1206 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001207 def get_vars_f0():
1208 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001209
Guido van Rossumfee7b932005-01-16 00:21:28 +00001210 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001211 def get_vars_f2():
1212 BuiltinTest.get_vars_f0()
1213 a = 1
1214 b = 2
1215 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001216
1217 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001218 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001219 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001220 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001221 self.assertEqual(self.get_vars_f0(), {})
1222 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1223 self.assertRaises(TypeError, vars, 42, 42)
1224 self.assertRaises(TypeError, vars, 42)
1225
1226 def test_zip(self):
1227 a = (1, 2, 3)
1228 b = (4, 5, 6)
1229 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001230 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001231 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001232 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001233 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001234 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001235 class I:
1236 def __getitem__(self, i):
1237 if i < 0 or i > 2: raise IndexError
1238 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001239 self.assertEqual(list(zip(a, I())), t)
1240 self.assertEqual(list(zip()), [])
1241 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001242 self.assertRaises(TypeError, zip, None)
1243 class G:
1244 pass
1245 self.assertRaises(TypeError, zip, a, G())
Alexander Belopolsky7a9bdbc2010-08-16 19:46:32 +00001246 self.assertRaises(RuntimeError, zip, a, TestFailingIter())
Walter Dörwald919497e2003-01-19 16:23:59 +00001247
1248 # Make sure zip doesn't try to allocate a billion elements for the
1249 # result list when one of its arguments doesn't say how long it is.
1250 # A MemoryError is the most likely failure mode.
1251 class SequenceWithoutALength:
1252 def __getitem__(self, i):
1253 if i == 5:
1254 raise IndexError
1255 else:
1256 return i
1257 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001258 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001259 list(enumerate(range(5)))
1260 )
1261
1262 class BadSeq:
1263 def __getitem__(self, i):
1264 if i == 5:
1265 raise ValueError
1266 else:
1267 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001268 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001269
Christian Heimes90c3d9b2008-02-23 13:18:03 +00001270 def test_bin(self):
1271 self.assertEqual(bin(0), '0b0')
1272 self.assertEqual(bin(1), '0b1')
1273 self.assertEqual(bin(-1), '-0b1')
1274 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1275 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1276 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1277 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1278
Georg Brandl069bcc32009-07-22 12:06:11 +00001279 def test_bytearray_translate(self):
1280 x = bytearray(b"abc")
1281 self.assertRaises(ValueError, x.translate, b"1", 1)
1282 self.assertRaises(TypeError, x.translate, b"1"*256, 1)
1283
Raymond Hettinger64958a12003-12-17 20:43:33 +00001284class TestSorted(unittest.TestCase):
1285
1286 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001287 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001288 copy = data[:]
1289 random.shuffle(copy)
1290 self.assertEqual(data, sorted(copy))
1291 self.assertNotEqual(data, copy)
1292
1293 data.reverse()
1294 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001295 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1296 self.assertNotEqual(data, copy)
1297 random.shuffle(copy)
1298 self.assertEqual(data, sorted(copy, reverse=1))
1299 self.assertNotEqual(data, copy)
1300
1301 def test_inputtypes(self):
1302 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001303 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001304 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001305 self.assertEqual(sorted(s), sorted(T(s)))
1306
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001307 s = ''.join(set(s)) # unique letters only
1308 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001309 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001310 self.assertEqual(sorted(s), sorted(T(s)))
1311
1312 def test_baddecorator(self):
1313 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1314 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1315
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001316def test_main(verbose=None):
1317 test_classes = (BuiltinTest, TestSorted)
1318
1319 run_unittest(*test_classes)
1320
1321 # verify reference counting
1322 if verbose and hasattr(sys, "gettotalrefcount"):
1323 import gc
1324 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001325 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001326 run_unittest(*test_classes)
1327 gc.collect()
1328 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001329 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001330
Walter Dörwald919497e2003-01-19 16:23:59 +00001331
1332if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001333 test_main(verbose=True)