blob: b17133a1cebbf9286188d40103b95b7f1df74d3b [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
Walter Dörwald919497e2003-01-19 16:23:59 +00003import test.test_support, unittest
Walter Dörwald1f5947b2007-05-22 16:52:54 +00004from test.test_support import fcmp, TESTFN, unlink, run_unittest, \
5 run_with_locale
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00006from operator import neg
Guido van Rossum3bead091992-01-27 17:00:37 +00007
Raymond Hettingerf80680d2008-02-06 00:07:11 +00008import sys, warnings, random, collections, io, rational
Walter Dörwald919497e2003-01-19 16:23:59 +00009warnings.filterwarnings("ignore", "hex../oct.. of negative int",
10 FutureWarning, __name__)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +000011warnings.filterwarnings("ignore", "integer argument expected",
12 DeprecationWarning, "unittest")
Guido van Rossum3bead091992-01-27 17:00:37 +000013
Walter Dörwald919497e2003-01-19 16:23:59 +000014class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000015
Walter Dörwald919497e2003-01-19 16:23:59 +000016 def __init__(self, max):
17 self.max = max
18 self.sofar = []
19
20 def __len__(self): return len(self.sofar)
21
22 def __getitem__(self, i):
23 if not 0 <= i < self.max: raise IndexError
24 n = len(self.sofar)
25 while n <= i:
26 self.sofar.append(n*n)
27 n += 1
28 return self.sofar[i]
29
30class StrSquares:
31
32 def __init__(self, max):
33 self.max = max
34 self.sofar = []
35
36 def __len__(self):
37 return len(self.sofar)
38
39 def __getitem__(self, i):
40 if not 0 <= i < self.max:
41 raise IndexError
42 n = len(self.sofar)
43 while n <= i:
44 self.sofar.append(str(n*n))
45 n += 1
46 return self.sofar[i]
47
48class BitBucket:
49 def write(self, line):
50 pass
51
Facundo Batista2336bdd2008-01-19 19:12:01 +000052test_conv_no_sign = [
Walter Dörwald919497e2003-01-19 16:23:59 +000053 ('0', 0),
54 ('1', 1),
55 ('9', 9),
56 ('10', 10),
57 ('99', 99),
58 ('100', 100),
59 ('314', 314),
60 (' 314', 314),
61 ('314 ', 314),
62 (' \t\t 314 \t\t ', 314),
Christian Heimesa37d4c62007-12-04 23:02:19 +000063 (repr(sys.maxsize), sys.maxsize),
Walter Dörwald919497e2003-01-19 16:23:59 +000064 (' 1x', ValueError),
65 (' 1 ', 1),
66 (' 1\02 ', ValueError),
67 ('', ValueError),
68 (' ', ValueError),
Walter Dörwald1f5947b2007-05-22 16:52:54 +000069 (' \t\t ', ValueError),
Guido van Rossumef87d6e2007-05-02 19:09:54 +000070 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
Guido van Rossum84fc66d2007-05-03 17:18:26 +000071 (chr(0x200), ValueError),
Walter Dörwald919497e2003-01-19 16:23:59 +000072]
73
Facundo Batista2336bdd2008-01-19 19:12:01 +000074test_conv_sign = [
75 ('0', 0),
76 ('1', 1),
77 ('9', 9),
78 ('10', 10),
79 ('99', 99),
80 ('100', 100),
81 ('314', 314),
82 (' 314', ValueError),
83 ('314 ', 314),
84 (' \t\t 314 \t\t ', ValueError),
85 (repr(sys.maxsize), sys.maxsize),
86 (' 1x', ValueError),
87 (' 1 ', ValueError),
88 (' 1\02 ', ValueError),
89 ('', ValueError),
90 (' ', ValueError),
91 (' \t\t ', ValueError),
92 (str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
93 (chr(0x200), ValueError),
94]
95
Raymond Hettinger96229b12005-03-11 06:49:40 +000096class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +000097 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +000098 raise RuntimeError
99
100class TestFailingIter:
101 def __iter__(self):
102 raise RuntimeError
103
Walter Dörwald919497e2003-01-19 16:23:59 +0000104class BuiltinTest(unittest.TestCase):
105
106 def test_import(self):
107 __import__('sys')
108 __import__('time')
109 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000110 __import__(name='sys')
111 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000112 self.assertRaises(ImportError, __import__, 'spamspam')
113 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000114 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000115 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +0000116
117 def test_abs(self):
118 # int
119 self.assertEqual(abs(0), 0)
120 self.assertEqual(abs(1234), 1234)
121 self.assertEqual(abs(-1234), 1234)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000122 self.assertTrue(abs(-sys.maxsize-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000123 # float
124 self.assertEqual(abs(0.0), 0.0)
125 self.assertEqual(abs(3.14), 3.14)
126 self.assertEqual(abs(-3.14), 3.14)
127 # long
Guido van Rossume2a383d2007-01-15 16:59:06 +0000128 self.assertEqual(abs(0), 0)
129 self.assertEqual(abs(1234), 1234)
130 self.assertEqual(abs(-1234), 1234)
Walter Dörwald919497e2003-01-19 16:23:59 +0000131 # str
132 self.assertRaises(TypeError, abs, 'a')
133
Raymond Hettinger96229b12005-03-11 06:49:40 +0000134 def test_all(self):
135 self.assertEqual(all([2, 4, 6]), True)
136 self.assertEqual(all([2, None, 6]), False)
137 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
138 self.assertRaises(RuntimeError, all, TestFailingIter())
139 self.assertRaises(TypeError, all, 10) # Non-iterable
140 self.assertRaises(TypeError, all) # No args
141 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
142 self.assertEqual(all([]), True) # Empty iterator
143 S = [50, 60]
144 self.assertEqual(all(x > 42 for x in S), True)
145 S = [50, 40, 60]
146 self.assertEqual(all(x > 42 for x in S), False)
147
148 def test_any(self):
149 self.assertEqual(any([None, None, None]), False)
150 self.assertEqual(any([None, 4, None]), True)
151 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
152 self.assertRaises(RuntimeError, all, TestFailingIter())
153 self.assertRaises(TypeError, any, 10) # Non-iterable
154 self.assertRaises(TypeError, any) # No args
155 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
156 self.assertEqual(any([]), False) # Empty iterator
157 S = [40, 60, 30]
158 self.assertEqual(any(x > 42 for x in S), True)
159 S = [10, 20, 30]
160 self.assertEqual(any(x > 42 for x in S), False)
161
Thomas Wouters89f507f2006-12-13 04:49:30 +0000162 def test_neg(self):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000163 x = -sys.maxsize-1
Thomas Wouters89f507f2006-12-13 04:49:30 +0000164 self.assert_(isinstance(x, int))
Christian Heimesa37d4c62007-12-04 23:02:19 +0000165 self.assertEqual(-x, sys.maxsize+1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000166
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000167 # XXX(nnorwitz): This test case for callable should probably be removed.
Walter Dörwald919497e2003-01-19 16:23:59 +0000168 def test_callable(self):
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000169 self.assert_(hasattr(len, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000170 def f(): pass
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000171 self.assert_(hasattr(f, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000172 class C:
173 def meth(self): pass
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000174 self.assert_(hasattr(C, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000175 x = C()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000176 self.assert_(hasattr(x.meth, '__call__'))
177 self.assert_(not hasattr(x, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000178 class D(C):
179 def __call__(self): pass
180 y = D()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000181 self.assert_(hasattr(y, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000182 y()
183
184 def test_chr(self):
185 self.assertEqual(chr(32), ' ')
186 self.assertEqual(chr(65), 'A')
187 self.assertEqual(chr(97), 'a')
188 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000189 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000190 self.assertEqual(chr(sys.maxunicode),
191 str(('\\U%08x' % (sys.maxunicode)).encode("ascii"),
192 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000193 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000194 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
195 self.assertEqual(chr(0x00010000), "\U00010000")
196 self.assertEqual(chr(0x00010001), "\U00010001")
197 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
198 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
199 self.assertEqual(chr(0x00100000), "\U00100000")
200 self.assertEqual(chr(0x00100001), "\U00100001")
201 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
202 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
203 self.assertRaises(ValueError, chr, -1)
204 self.assertRaises(ValueError, chr, 0x00110000)
Walter Dörwald919497e2003-01-19 16:23:59 +0000205
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000206 def test_cmp(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000207 self.assertEqual(cmp(-1, 1), -1)
208 self.assertEqual(cmp(1, -1), 1)
209 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000210 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000211 a = []; a.append(a)
212 b = []; b.append(b)
213 from UserList import UserList
214 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000215 self.assertRaises(RuntimeError, cmp, a, b)
216 self.assertRaises(RuntimeError, cmp, b, c)
217 self.assertRaises(RuntimeError, cmp, c, a)
218 self.assertRaises(RuntimeError, cmp, a, c)
219 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000220 a.pop(); b.pop(); c.pop()
221 self.assertRaises(TypeError, cmp)
222
Walter Dörwald919497e2003-01-19 16:23:59 +0000223 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000224 compile('print(1)\n', '', 'exec')
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000225 bom = b'\xef\xbb\xbf'
226 compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000227 compile(source='pass', filename='?', mode='exec')
228 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
229 compile('pass', '?', dont_inherit=1, mode='exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000230 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000231 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
232 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000233 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000234 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
235 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000236 compile('print("\xe5")\n', '', 'exec')
237 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
238 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000239
Walter Dörwald919497e2003-01-19 16:23:59 +0000240 def test_delattr(self):
241 import sys
242 sys.spam = 1
243 delattr(sys, 'spam')
244 self.assertRaises(TypeError, delattr)
245
246 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000247 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000248 self.assertRaises(TypeError, dir, 42, 42)
249
Georg Brandle32b4222007-03-10 22:13:27 +0000250 # dir() - local scope
251 local_var = 1
252 self.assert_('local_var' in dir())
253
254 # dir(module)
255 import sys
256 self.assert_('exit' in dir(sys))
257
258 # dir(module_with_invalid__dict__)
259 import types
260 class Foo(types.ModuleType):
261 __dict__ = 8
262 f = Foo("foo")
263 self.assertRaises(TypeError, dir, f)
264
265 # dir(type)
266 self.assert_("strip" in dir(str))
267 self.assert_("__mro__" not in dir(str))
268
269 # dir(obj)
270 class Foo(object):
271 def __init__(self):
272 self.x = 7
273 self.y = 8
274 self.z = 9
275 f = Foo()
276 self.assert_("y" in dir(f))
277
278 # dir(obj_no__dict__)
279 class Foo(object):
280 __slots__ = []
281 f = Foo()
282 self.assert_("__repr__" in dir(f))
283
284 # dir(obj_no__class__with__dict__)
285 # (an ugly trick to cause getattr(f, "__class__") to fail)
286 class Foo(object):
287 __slots__ = ["__class__", "__dict__"]
288 def __init__(self):
289 self.bar = "wow"
290 f = Foo()
291 self.assert_("__repr__" not in dir(f))
292 self.assert_("bar" in dir(f))
293
294 # dir(obj_using __dir__)
295 class Foo(object):
296 def __dir__(self):
297 return ["kan", "ga", "roo"]
298 f = Foo()
299 self.assert_(dir(f) == ["ga", "kan", "roo"])
300
301 # dir(obj__dir__not_list)
302 class Foo(object):
303 def __dir__(self):
304 return 7
305 f = Foo()
306 self.assertRaises(TypeError, dir, f)
307
Collin Winter3eed7652007-08-14 17:53:54 +0000308 # dir(traceback)
309 try:
310 raise IndexError
311 except:
312 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
313
314
Walter Dörwald919497e2003-01-19 16:23:59 +0000315 def test_divmod(self):
316 self.assertEqual(divmod(12, 7), (1, 5))
317 self.assertEqual(divmod(-12, 7), (-2, 2))
318 self.assertEqual(divmod(12, -7), (-2, -2))
319 self.assertEqual(divmod(-12, -7), (1, -5))
320
Guido van Rossume2a383d2007-01-15 16:59:06 +0000321 self.assertEqual(divmod(12, 7), (1, 5))
322 self.assertEqual(divmod(-12, 7), (-2, 2))
323 self.assertEqual(divmod(12, -7), (-2, -2))
324 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000325
Guido van Rossume2a383d2007-01-15 16:59:06 +0000326 self.assertEqual(divmod(12, 7), (1, 5))
327 self.assertEqual(divmod(-12, 7), (-2, 2))
328 self.assertEqual(divmod(12, -7), (-2, -2))
329 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000330
Christian Heimesa37d4c62007-12-04 23:02:19 +0000331 self.assertEqual(divmod(-sys.maxsize-1, -1),
332 (sys.maxsize+1, 0))
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000333
Walter Dörwald919497e2003-01-19 16:23:59 +0000334 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
335 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
336 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
337 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
338
339 self.assertRaises(TypeError, divmod)
340
341 def test_eval(self):
342 self.assertEqual(eval('1+1'), 2)
343 self.assertEqual(eval(' 1+1\n'), 2)
344 globals = {'a': 1, 'b': 2}
345 locals = {'b': 200, 'c': 300}
346 self.assertEqual(eval('a', globals) , 1)
347 self.assertEqual(eval('a', globals, locals), 1)
348 self.assertEqual(eval('b', globals, locals), 200)
349 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000350 globals = {'a': 1, 'b': 2}
351 locals = {'b': 200, 'c': 300}
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000352 bom = b'\xef\xbb\xbf'
353 self.assertEqual(eval(bom + b'a', globals, locals), 1)
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000354 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000355 self.assertRaises(TypeError, eval)
356 self.assertRaises(TypeError, eval, ())
Amaury Forgeot d'Arcaf593462007-11-22 20:53:01 +0000357 self.assertRaises(SyntaxError, eval, bom[:2] + b'a')
Walter Dörwald919497e2003-01-19 16:23:59 +0000358
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000359 def test_general_eval(self):
360 # Tests that general mappings can be used for the locals argument
361
362 class M:
363 "Test mapping interface versus possible calls from eval()."
364 def __getitem__(self, key):
365 if key == 'a':
366 return 12
367 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000368 def keys(self):
369 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000370
371 m = M()
372 g = globals()
373 self.assertEqual(eval('a', g, m), 12)
374 self.assertRaises(NameError, eval, 'b', g, m)
375 self.assertEqual(eval('dir()', g, m), list('xyz'))
376 self.assertEqual(eval('globals()', g, m), g)
377 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000378 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000379 class A:
380 "Non-mapping"
381 pass
382 m = A()
383 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000384
385 # Verify that dict subclasses work as well
386 class D(dict):
387 def __getitem__(self, key):
388 if key == 'a':
389 return 12
390 return dict.__getitem__(self, key)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000391 def keys(self):
392 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000393
394 d = D()
395 self.assertEqual(eval('a', g, d), 12)
396 self.assertRaises(NameError, eval, 'b', g, d)
397 self.assertEqual(eval('dir()', g, d), list('xyz'))
398 self.assertEqual(eval('globals()', g, d), g)
399 self.assertEqual(eval('locals()', g, d), d)
400
401 # Verify locals stores (used by list comps)
402 eval('[locals() for i in (2,3)]', g, d)
Raymond Hettingerf80680d2008-02-06 00:07:11 +0000403 eval('[locals() for i in (2,3)]', g, collections.UserDict())
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000404
405 class SpreadSheet:
406 "Sample application showing nested, calculated lookups."
407 _cells = {}
408 def __setitem__(self, key, formula):
409 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000410 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000411 return eval(self._cells[key], globals(), self)
412
413 ss = SpreadSheet()
414 ss['a1'] = '5'
415 ss['a2'] = 'a1*6'
416 ss['a3'] = 'a2*7'
417 self.assertEqual(ss['a3'], 210)
418
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000419 # Verify that dir() catches a non-list returned by eval
420 # SF bug #1004669
421 class C:
422 def __getitem__(self, item):
423 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000424 def keys(self):
425 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000426 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
427
Georg Brandl7cae87c2006-09-06 06:51:57 +0000428 def test_exec(self):
429 g = {}
430 exec('z = 1', g)
431 if '__builtins__' in g:
432 del g['__builtins__']
433 self.assertEqual(g, {'z': 1})
434
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000435 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000436 if '__builtins__' in g:
437 del g['__builtins__']
438 self.assertEqual(g, {'z': 2})
439 g = {}
440 l = {}
441
442 import warnings
443 warnings.filterwarnings("ignore", "global statement", module="<string>")
444 exec('global a; a = 1; b = 2', g, l)
445 if '__builtins__' in g:
446 del g['__builtins__']
447 if '__builtins__' in l:
448 del l['__builtins__']
449 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
450
Walter Dörwald919497e2003-01-19 16:23:59 +0000451 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000452 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
453 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
454 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
455 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
456 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000457 def identity(item):
458 return 1
459 filter(identity, Squares(5))
460 self.assertRaises(TypeError, filter)
461 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000462 def __getitem__(self, index):
463 if index<4:
464 return 42
465 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000466 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000467 def badfunc():
468 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000469 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000470
Walter Dörwaldbf517072003-01-27 15:57:14 +0000471 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000472 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
473 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
474 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000475
Walter Dörwald919497e2003-01-19 16:23:59 +0000476 def test_float(self):
477 self.assertEqual(float(3.14), 3.14)
478 self.assertEqual(float(314), 314.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000479 self.assertEqual(float(314), 314.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000480 self.assertEqual(float(" 3.14 "), 3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000481 self.assertRaises(ValueError, float, " 0x3.1 ")
482 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000483 self.assertEqual(float(str(b" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
484 self.assertEqual(float("1"*10000), 1e10000) # Inf on both sides
Walter Dörwald919497e2003-01-19 16:23:59 +0000485
Thomas Wouters477c8d52006-05-27 19:21:47 +0000486 @run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
Neal Norwitz5898fa22005-11-22 05:17:40 +0000487 def test_float_with_comma(self):
488 # set locale to something that doesn't use '.' for the decimal point
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000489 # float must not accept the locale specific decimal point but
490 # it still has to accept the normal python syntac
Thomas Wouters477c8d52006-05-27 19:21:47 +0000491 import locale
492 if not locale.localeconv()['decimal_point'] == ',':
Neal Norwitz5898fa22005-11-22 05:17:40 +0000493 return
494
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000495 self.assertEqual(float(" 3.14 "), 3.14)
496 self.assertEqual(float("+3.14 "), 3.14)
497 self.assertEqual(float("-3.14 "), -3.14)
498 self.assertEqual(float(".14 "), .14)
499 self.assertEqual(float("3. "), 3.0)
500 self.assertEqual(float("3.e3 "), 3000.0)
501 self.assertEqual(float("3.2e3 "), 3200.0)
502 self.assertEqual(float("2.5e-1 "), 0.25)
503 self.assertEqual(float("5e-1"), 0.5)
504 self.assertRaises(ValueError, float, " 3,14 ")
505 self.assertRaises(ValueError, float, " +3,14 ")
506 self.assertRaises(ValueError, float, " -3,14 ")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000507 self.assertRaises(ValueError, float, " 0x3.1 ")
508 self.assertRaises(ValueError, float, " -0x3.p-1 ")
509 self.assertEqual(float(" 25.e-1 "), 2.5)
510 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000511
Brett Cannonc3647ac2005-04-26 03:45:26 +0000512 def test_floatconversion(self):
513 # Make sure that calls to __float__() work properly
514 class Foo0:
515 def __float__(self):
516 return 42.
517
518 class Foo1(object):
519 def __float__(self):
520 return 42.
521
522 class Foo2(float):
523 def __float__(self):
524 return 42.
525
526 class Foo3(float):
527 def __new__(cls, value=0.):
528 return float.__new__(cls, 2*value)
529
530 def __float__(self):
531 return self
532
533 class Foo4(float):
534 def __float__(self):
535 return 42
536
537 self.assertAlmostEqual(float(Foo0()), 42.)
538 self.assertAlmostEqual(float(Foo1()), 42.)
539 self.assertAlmostEqual(float(Foo2()), 42.)
540 self.assertAlmostEqual(float(Foo3(21)), 42.)
541 self.assertRaises(TypeError, float, Foo4(42))
542
Eric Smith8c663262007-08-25 02:26:07 +0000543 def test_format(self):
544 class A:
545 def __init__(self, x):
546 self.x = x
547 def __format__(self, format_spec):
548 return str(self.x) + format_spec
549
550 # class that returns a bad type from __format__
Eric Smith37f10382007-09-01 10:56:01 +0000551 class B:
Eric Smith8c663262007-08-25 02:26:07 +0000552 def __format__(self, format_spec):
553 return 1.0
554
Eric Smith37f10382007-09-01 10:56:01 +0000555 # class that is derived from string, used
556 # as a format spec
557 class C(str):
558 pass
559
Eric Smith8c663262007-08-25 02:26:07 +0000560 self.assertEqual(format(3, ''), '3')
561 self.assertEqual(format(A(3), 'spec'), '3spec')
562
Eric Smith81936692007-08-31 01:14:01 +0000563 def empty_format_spec(value):
564 # test that:
565 # format(x, '') == str(x)
566 # format(x) == str(x)
567 self.assertEqual(format(value, ""), str(value))
568 self.assertEqual(format(value), str(value))
569
Eric Smith8c663262007-08-25 02:26:07 +0000570 # for builtin types, format(x, "") == str(x)
Eric Smith81936692007-08-31 01:14:01 +0000571 empty_format_spec(17**13)
572 empty_format_spec(1.0)
573 empty_format_spec(3.1415e104)
574 empty_format_spec(-3.1415e104)
575 empty_format_spec(3.1415e-104)
576 empty_format_spec(-3.1415e-104)
577 empty_format_spec(object)
578 empty_format_spec(None)
Eric Smith8c663262007-08-25 02:26:07 +0000579
Eric Smith739e2ad2007-08-27 19:07:22 +0000580 # TypeError because self.__format__ returns the wrong type
Eric Smith37f10382007-09-01 10:56:01 +0000581 self.assertRaises(TypeError, format, B(), "")
582
Eric Smithfc6e8fe2008-01-11 00:17:22 +0000583 # TypeError because format_spec is not unicode
584 self.assertRaises(TypeError, format, object(), 4)
585 self.assertRaises(TypeError, format, object(), object())
586
Eric Smith61ecb772008-01-11 00:32:16 +0000587 # first argument to object.__format__ must be string
588 self.assertRaises(TypeError, object().__format__, 3)
589 self.assertRaises(TypeError, object().__format__, object())
590 self.assertRaises(TypeError, object().__format__, None)
591
Eric Smith37f10382007-09-01 10:56:01 +0000592 # make sure we can take a subclass of str as a format spec
593 self.assertEqual(format(0, C('10')), ' 0')
Eric Smith8c663262007-08-25 02:26:07 +0000594
Christian Heimes26855632008-01-27 23:50:43 +0000595 def test_floatasratio(self):
Christian Heimes292d3512008-02-03 16:51:08 +0000596 for f, ratio in [
597 (0.875, (7, 8)),
598 (-0.875, (-7, 8)),
599 (0.0, (0, 1)),
600 (11.5, (23, 2)),
601 ]:
602 self.assertEqual(f.as_integer_ratio(), ratio)
603
604 for i in range(10000):
605 f = random.random()
606 f *= 10 ** random.randint(-100, 100)
607 n, d = f.as_integer_ratio()
608 self.assertEqual(float(n).__truediv__(d), f)
609
Christian Heimes26855632008-01-27 23:50:43 +0000610 R = rational.Rational
611 self.assertEqual(R(0, 1),
612 R(*float(0.0).as_integer_ratio()))
613 self.assertEqual(R(5, 2),
614 R(*float(2.5).as_integer_ratio()))
615 self.assertEqual(R(1, 2),
616 R(*float(0.5).as_integer_ratio()))
617 self.assertEqual(R(4728779608739021, 2251799813685248),
618 R(*float(2.1).as_integer_ratio()))
619 self.assertEqual(R(-4728779608739021, 2251799813685248),
620 R(*float(-2.1).as_integer_ratio()))
621 self.assertEqual(R(-2100, 1),
622 R(*float(-2100.0).as_integer_ratio()))
623
624 self.assertRaises(OverflowError, float('inf').as_integer_ratio)
625 self.assertRaises(OverflowError, float('-inf').as_integer_ratio)
626 self.assertRaises(ValueError, float('nan').as_integer_ratio)
627
Walter Dörwald919497e2003-01-19 16:23:59 +0000628 def test_getattr(self):
629 import sys
630 self.assert_(getattr(sys, 'stdout') is sys.stdout)
631 self.assertRaises(TypeError, getattr, sys, 1)
632 self.assertRaises(TypeError, getattr, sys, 1, "foo")
633 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000634 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000635
636 def test_hasattr(self):
637 import sys
638 self.assert_(hasattr(sys, 'stdout'))
639 self.assertRaises(TypeError, hasattr, sys, 1)
640 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000641 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000642
643 def test_hash(self):
644 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000645 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000646 self.assertEqual(hash(1), hash(1.0))
647 hash('spam')
Guido van Rossum98297ee2007-11-06 21:34:58 +0000648 self.assertEqual(hash('spam'), hash(b'spam'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000649 hash((0,1,2,3))
650 def f(): pass
651 self.assertRaises(TypeError, hash, [])
652 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000653 # Bug 1536021: Allow hash to return long objects
654 class X:
655 def __hash__(self):
656 return 2**100
657 self.assertEquals(type(hash(X())), int)
658 class Y(object):
659 def __hash__(self):
660 return 2**100
661 self.assertEquals(type(hash(Y())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000662 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000663 def __hash__(self):
664 return self
Guido van Rossume2a383d2007-01-15 16:59:06 +0000665 self.assertEquals(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000666
667 def test_hex(self):
668 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000669 self.assertEqual(hex(16), '0x10')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000670 self.assertEqual(hex(-16), '-0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000671 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000672 self.assertRaises(TypeError, hex, {})
673
674 def test_id(self):
675 id(None)
676 id(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000677 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000678 id(1.0)
679 id('spam')
680 id((0,1,2,3))
681 id([0,1,2,3])
682 id({'spam': 1, 'eggs': 2, 'ham': 3})
683
Guido van Rossuma88a0332007-02-26 16:59:55 +0000684 # Test input() later, alphabetized as if it were raw_input
685
Walter Dörwald919497e2003-01-19 16:23:59 +0000686 def test_int(self):
687 self.assertEqual(int(314), 314)
688 self.assertEqual(int(3.14), 3)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000689 self.assertEqual(int(314), 314)
Walter Dörwald919497e2003-01-19 16:23:59 +0000690 # Check that conversion from float truncates towards zero
691 self.assertEqual(int(-3.14), -3)
692 self.assertEqual(int(3.9), 3)
693 self.assertEqual(int(-3.9), -3)
694 self.assertEqual(int(3.5), 3)
695 self.assertEqual(int(-3.5), -3)
696 # Different base:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000697 self.assertEqual(int("10",16), 16)
Walter Dörwald919497e2003-01-19 16:23:59 +0000698 # Test conversion from strings and various anomalies
Facundo Batista2336bdd2008-01-19 19:12:01 +0000699 # Testing with no sign at front
700 for s, v in test_conv_no_sign:
701 for prefix in "", " ", "\t", " \t\t ":
702 ss = prefix + s
703 vv = v
704 try:
705 self.assertEqual(int(ss), vv)
706 except v:
707 pass
708 # No whitespaces allowed between + or - sign and the number
709 for s, v in test_conv_sign:
710 for sign in "+", "-":
Walter Dörwald919497e2003-01-19 16:23:59 +0000711 for prefix in "", " ", "\t", " \t\t ":
712 ss = prefix + sign + s
713 vv = v
714 if sign == "-" and v is not ValueError:
715 vv = -v
716 try:
717 self.assertEqual(int(ss), vv)
718 except v:
719 pass
720
Christian Heimesa37d4c62007-12-04 23:02:19 +0000721 s = repr(-1-sys.maxsize)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000722 x = int(s)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000723 self.assertEqual(x+1, -sys.maxsize)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000724 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000725 # should return long
Christian Heimesa37d4c62007-12-04 23:02:19 +0000726 self.assertEqual(int(s[1:]), sys.maxsize+1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000727
728 # should return long
729 x = int(1e100)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000730 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000731 x = int(-1e100)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000732 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000733
734
735 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
736 # Worked by accident in Windows release build, but failed in debug build.
737 # Failed in all Linux builds.
Christian Heimesa37d4c62007-12-04 23:02:19 +0000738 x = -1-sys.maxsize
Walter Dörwald919497e2003-01-19 16:23:59 +0000739 self.assertEqual(x >> 1, x//2)
740
741 self.assertRaises(ValueError, int, '123\0')
742 self.assertRaises(ValueError, int, '53', 40)
743
Thomas Wouters89f507f2006-12-13 04:49:30 +0000744 # SF bug 1545497: embedded NULs were not detected with
745 # explicit base
746 self.assertRaises(ValueError, int, '123\0', 10)
747 self.assertRaises(ValueError, int, '123\x00 245', 20)
748
Walter Dörwald919497e2003-01-19 16:23:59 +0000749 x = int('1' * 600)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000750 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000751
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000752 x = int(chr(0x661) * 600)
753 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000754
755 self.assertRaises(TypeError, int, 1, 12)
756
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000757 # tests with base 0
758 self.assertRaises(ValueError, int, ' 0123 ', 0) # old octal syntax
759 self.assertEqual(int('000', 0), 0)
760 self.assertEqual(int('0o123', 0), 83)
761 self.assertEqual(int('0x123', 0), 291)
762 self.assertEqual(int('0b100', 0), 4)
763 self.assertEqual(int(' 0O123 ', 0), 83)
764 self.assertEqual(int(' 0X123 ', 0), 291)
765 self.assertEqual(int(' 0B100 ', 0), 4)
766
767 # without base still base 10
768 self.assertEqual(int('0123'), 123)
769 self.assertEqual(int('0123', 10), 123)
770
771 # tests with prefix and base != 0
Neal Norwitz5898fa22005-11-22 05:17:40 +0000772 self.assertEqual(int('0x123', 16), 291)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000773 self.assertEqual(int('0o123', 8), 83)
774 self.assertEqual(int('0b100', 2), 4)
775 self.assertEqual(int('0X123', 16), 291)
776 self.assertEqual(int('0O123', 8), 83)
777 self.assertEqual(int('0B100', 2), 4)
Walter Dörwald919497e2003-01-19 16:23:59 +0000778
Georg Brandlfceab5a2008-01-19 20:08:23 +0000779 # Bug 1679: "0x" is not a valid hex literal
780 self.assertRaises(ValueError, int, "0x", 16)
781 self.assertRaises(ValueError, int, "0x", 0)
782
783
Thomas Wouters477c8d52006-05-27 19:21:47 +0000784 # SF bug 1334662: int(string, base) wrong answers
785 # Various representations of 2**32 evaluated to 0
786 # rather than 2**32 in previous versions
787
Guido van Rossume2a383d2007-01-15 16:59:06 +0000788 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296)
789 self.assertEqual(int('102002022201221111211', 3), 4294967296)
790 self.assertEqual(int('10000000000000000', 4), 4294967296)
791 self.assertEqual(int('32244002423141', 5), 4294967296)
792 self.assertEqual(int('1550104015504', 6), 4294967296)
793 self.assertEqual(int('211301422354', 7), 4294967296)
794 self.assertEqual(int('40000000000', 8), 4294967296)
795 self.assertEqual(int('12068657454', 9), 4294967296)
796 self.assertEqual(int('4294967296', 10), 4294967296)
797 self.assertEqual(int('1904440554', 11), 4294967296)
798 self.assertEqual(int('9ba461594', 12), 4294967296)
799 self.assertEqual(int('535a79889', 13), 4294967296)
800 self.assertEqual(int('2ca5b7464', 14), 4294967296)
801 self.assertEqual(int('1a20dcd81', 15), 4294967296)
802 self.assertEqual(int('100000000', 16), 4294967296)
803 self.assertEqual(int('a7ffda91', 17), 4294967296)
804 self.assertEqual(int('704he7g4', 18), 4294967296)
805 self.assertEqual(int('4f5aff66', 19), 4294967296)
806 self.assertEqual(int('3723ai4g', 20), 4294967296)
807 self.assertEqual(int('281d55i4', 21), 4294967296)
808 self.assertEqual(int('1fj8b184', 22), 4294967296)
809 self.assertEqual(int('1606k7ic', 23), 4294967296)
810 self.assertEqual(int('mb994ag', 24), 4294967296)
811 self.assertEqual(int('hek2mgl', 25), 4294967296)
812 self.assertEqual(int('dnchbnm', 26), 4294967296)
813 self.assertEqual(int('b28jpdm', 27), 4294967296)
814 self.assertEqual(int('8pfgih4', 28), 4294967296)
815 self.assertEqual(int('76beigg', 29), 4294967296)
816 self.assertEqual(int('5qmcpqg', 30), 4294967296)
817 self.assertEqual(int('4q0jto4', 31), 4294967296)
818 self.assertEqual(int('4000000', 32), 4294967296)
819 self.assertEqual(int('3aokq94', 33), 4294967296)
820 self.assertEqual(int('2qhxjli', 34), 4294967296)
821 self.assertEqual(int('2br45qb', 35), 4294967296)
822 self.assertEqual(int('1z141z4', 36), 4294967296)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000823
824 # SF bug 1334662: int(string, base) wrong answers
825 # Checks for proper evaluation of 2**32 + 1
Guido van Rossume2a383d2007-01-15 16:59:06 +0000826 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297)
827 self.assertEqual(int('102002022201221111212', 3), 4294967297)
828 self.assertEqual(int('10000000000000001', 4), 4294967297)
829 self.assertEqual(int('32244002423142', 5), 4294967297)
830 self.assertEqual(int('1550104015505', 6), 4294967297)
831 self.assertEqual(int('211301422355', 7), 4294967297)
832 self.assertEqual(int('40000000001', 8), 4294967297)
833 self.assertEqual(int('12068657455', 9), 4294967297)
834 self.assertEqual(int('4294967297', 10), 4294967297)
835 self.assertEqual(int('1904440555', 11), 4294967297)
836 self.assertEqual(int('9ba461595', 12), 4294967297)
837 self.assertEqual(int('535a7988a', 13), 4294967297)
838 self.assertEqual(int('2ca5b7465', 14), 4294967297)
839 self.assertEqual(int('1a20dcd82', 15), 4294967297)
840 self.assertEqual(int('100000001', 16), 4294967297)
841 self.assertEqual(int('a7ffda92', 17), 4294967297)
842 self.assertEqual(int('704he7g5', 18), 4294967297)
843 self.assertEqual(int('4f5aff67', 19), 4294967297)
844 self.assertEqual(int('3723ai4h', 20), 4294967297)
845 self.assertEqual(int('281d55i5', 21), 4294967297)
846 self.assertEqual(int('1fj8b185', 22), 4294967297)
847 self.assertEqual(int('1606k7id', 23), 4294967297)
848 self.assertEqual(int('mb994ah', 24), 4294967297)
849 self.assertEqual(int('hek2mgm', 25), 4294967297)
850 self.assertEqual(int('dnchbnn', 26), 4294967297)
851 self.assertEqual(int('b28jpdn', 27), 4294967297)
852 self.assertEqual(int('8pfgih5', 28), 4294967297)
853 self.assertEqual(int('76beigh', 29), 4294967297)
854 self.assertEqual(int('5qmcpqh', 30), 4294967297)
855 self.assertEqual(int('4q0jto5', 31), 4294967297)
856 self.assertEqual(int('4000001', 32), 4294967297)
857 self.assertEqual(int('3aokq95', 33), 4294967297)
858 self.assertEqual(int('2qhxjlj', 34), 4294967297)
859 self.assertEqual(int('2br45qc', 35), 4294967297)
860 self.assertEqual(int('1z141z5', 36), 4294967297)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000861
Brett Cannonc3647ac2005-04-26 03:45:26 +0000862 def test_intconversion(self):
863 # Test __int__()
Christian Heimes15ebc882008-02-04 18:48:49 +0000864 class ClassicMissingMethods:
865 pass
866 self.assertRaises(TypeError, int, ClassicMissingMethods())
867
868 class MissingMethods(object):
869 pass
870 self.assertRaises(TypeError, int, MissingMethods())
871
Brett Cannonc3647ac2005-04-26 03:45:26 +0000872 class Foo0:
873 def __int__(self):
874 return 42
875
876 class Foo1(object):
877 def __int__(self):
878 return 42
879
880 class Foo2(int):
881 def __int__(self):
882 return 42
883
884 class Foo3(int):
885 def __int__(self):
886 return self
887
888 class Foo4(int):
889 def __int__(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000890 return 42
Brett Cannonc3647ac2005-04-26 03:45:26 +0000891
892 class Foo5(int):
893 def __int__(self):
894 return 42.
895
896 self.assertEqual(int(Foo0()), 42)
897 self.assertEqual(int(Foo1()), 42)
898 self.assertEqual(int(Foo2()), 42)
899 self.assertEqual(int(Foo3()), 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000900 self.assertEqual(int(Foo4()), 42)
Brett Cannonc3647ac2005-04-26 03:45:26 +0000901 self.assertRaises(TypeError, int, Foo5())
902
Christian Heimes15ebc882008-02-04 18:48:49 +0000903 class Classic:
904 pass
905 for base in (object, Classic):
906 class IntOverridesTrunc(base):
907 def __int__(self):
908 return 42
909 def __trunc__(self):
910 return -12
911 self.assertEqual(int(IntOverridesTrunc()), 42)
912
913 class JustTrunc(base):
914 def __trunc__(self):
915 return 42
916 self.assertEqual(int(JustTrunc()), 42)
917
918 for trunc_result_base in (object, Classic):
919 class Integral(trunc_result_base):
920 def __int__(self):
921 return 42
922
923 class TruncReturnsNonInt(base):
924 def __trunc__(self):
925 return Integral()
926 self.assertEqual(int(TruncReturnsNonInt()), 42)
927
928 class NonIntegral(trunc_result_base):
929 def __trunc__(self):
930 # Check that we avoid infinite recursion.
931 return NonIntegral()
932
933 class TruncReturnsNonIntegral(base):
934 def __trunc__(self):
935 return NonIntegral()
936 try:
937 int(TruncReturnsNonIntegral())
938 except TypeError as e:
939 self.assertEquals(str(e),
940 "__trunc__ returned non-Integral"
941 " (type NonIntegral)")
942 else:
943 self.fail("Failed to raise TypeError with %s" %
944 ((base, trunc_result_base),))
945
Walter Dörwald919497e2003-01-19 16:23:59 +0000946 def test_iter(self):
947 self.assertRaises(TypeError, iter)
948 self.assertRaises(TypeError, iter, 42, 42)
949 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000950 for l in lists:
951 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000952 self.assertEqual(next(i), '1')
953 self.assertEqual(next(i), '2')
954 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000955
956 def test_isinstance(self):
957 class C:
958 pass
959 class D(C):
960 pass
961 class E:
962 pass
963 c = C()
964 d = D()
965 e = E()
966 self.assert_(isinstance(c, C))
967 self.assert_(isinstance(d, C))
968 self.assert_(not isinstance(e, C))
969 self.assert_(not isinstance(c, D))
970 self.assert_(not isinstance('foo', E))
971 self.assertRaises(TypeError, isinstance, E, 'foo')
972 self.assertRaises(TypeError, isinstance)
973
974 def test_issubclass(self):
975 class C:
976 pass
977 class D(C):
978 pass
979 class E:
980 pass
981 c = C()
982 d = D()
983 e = E()
984 self.assert_(issubclass(D, C))
985 self.assert_(issubclass(C, C))
986 self.assert_(not issubclass(C, D))
987 self.assertRaises(TypeError, issubclass, 'foo', E)
988 self.assertRaises(TypeError, issubclass, E, 'foo')
989 self.assertRaises(TypeError, issubclass)
990
991 def test_len(self):
992 self.assertEqual(len('123'), 3)
993 self.assertEqual(len(()), 0)
994 self.assertEqual(len((1, 2, 3, 4)), 4)
995 self.assertEqual(len([1, 2, 3, 4]), 4)
996 self.assertEqual(len({}), 0)
997 self.assertEqual(len({'a':1, 'b': 2}), 2)
998 class BadSeq:
999 def __len__(self):
1000 raise ValueError
1001 self.assertRaises(ValueError, len, BadSeq())
1002
1003 def test_list(self):
1004 self.assertEqual(list([]), [])
1005 l0_3 = [0, 1, 2, 3]
1006 l0_3_bis = list(l0_3)
1007 self.assertEqual(l0_3, l0_3_bis)
1008 self.assert_(l0_3 is not l0_3_bis)
1009 self.assertEqual(list(()), [])
1010 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
1011 self.assertEqual(list(''), [])
1012 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
1013
Christian Heimesa37d4c62007-12-04 23:02:19 +00001014 if sys.maxsize == 0x7fffffff:
Walter Dörwald919497e2003-01-19 16:23:59 +00001015 # This test can currently only work on 32-bit machines.
1016 # XXX If/when PySequence_Length() returns a ssize_t, it should be
1017 # XXX re-enabled.
1018 # Verify clearing of bug #556025.
Christian Heimesa37d4c62007-12-04 23:02:19 +00001019 # This assumes that the max data size (sys.maxsize) == max
Walter Dörwald919497e2003-01-19 16:23:59 +00001020 # address size this also assumes that the address size is at
1021 # least 4 bytes with 8 byte addresses, the bug is not well
1022 # tested
1023 #
1024 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
1025 # earlier due to a newlib bug. See the following mailing list
1026 # thread for the details:
1027
1028 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
Christian Heimesa37d4c62007-12-04 23:02:19 +00001029 self.assertRaises(MemoryError, list, range(sys.maxsize // 2))
Walter Dörwald919497e2003-01-19 16:23:59 +00001030
Raymond Hettingeraa241e02004-09-26 19:24:20 +00001031 # This code used to segfault in Py2.4a3
1032 x = []
1033 x.extend(-y for y in x)
1034 self.assertEqual(x, [])
1035
Walter Dörwald919497e2003-01-19 16:23:59 +00001036 def test_long(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +00001037 self.assertEqual(int(314), 314)
1038 self.assertEqual(int(3.14), 3)
1039 self.assertEqual(int(314), 314)
Walter Dörwald919497e2003-01-19 16:23:59 +00001040 # Check that conversion from float truncates towards zero
Guido van Rossume2a383d2007-01-15 16:59:06 +00001041 self.assertEqual(int(-3.14), -3)
1042 self.assertEqual(int(3.9), 3)
1043 self.assertEqual(int(-3.9), -3)
1044 self.assertEqual(int(3.5), 3)
1045 self.assertEqual(int(-3.5), -3)
1046 self.assertEqual(int("-3"), -3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001047 # Different base:
Guido van Rossume2a383d2007-01-15 16:59:06 +00001048 self.assertEqual(int("10",16), 16)
Walter Dörwald919497e2003-01-19 16:23:59 +00001049 # Check conversions from string (same test set as for int(), and then some)
1050 LL = [
Guido van Rossume2a383d2007-01-15 16:59:06 +00001051 ('1' + '0'*20, 10**20),
1052 ('1' + '0'*100, 10**100)
Walter Dörwald919497e2003-01-19 16:23:59 +00001053 ]
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001054 for s, v in LL:
Walter Dörwald919497e2003-01-19 16:23:59 +00001055 for sign in "", "+", "-":
1056 for prefix in "", " ", "\t", " \t\t ":
1057 ss = prefix + sign + s
1058 vv = v
1059 if sign == "-" and v is not ValueError:
1060 vv = -v
1061 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +00001062 self.assertEqual(int(ss), int(vv))
Walter Dörwald919497e2003-01-19 16:23:59 +00001063 except v:
1064 pass
1065
Guido van Rossume2a383d2007-01-15 16:59:06 +00001066 self.assertRaises(ValueError, int, '123\0')
1067 self.assertRaises(ValueError, int, '53', 40)
1068 self.assertRaises(TypeError, int, 1, 12)
Walter Dörwald919497e2003-01-19 16:23:59 +00001069
Guido van Rossumd8faa362007-04-27 19:54:29 +00001070 # SF patch #1638879: embedded NULs were not detected with
1071 # explicit base
1072 self.assertRaises(ValueError, int, '123\0', 10)
1073 self.assertRaises(ValueError, int, '123\x00 245', 20)
1074
Guido van Rossume2a383d2007-01-15 16:59:06 +00001075 self.assertEqual(int('100000000000000000000000000000000', 2),
Thomas Wouters477c8d52006-05-27 19:21:47 +00001076 4294967296)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001077 self.assertEqual(int('102002022201221111211', 3), 4294967296)
1078 self.assertEqual(int('10000000000000000', 4), 4294967296)
1079 self.assertEqual(int('32244002423141', 5), 4294967296)
1080 self.assertEqual(int('1550104015504', 6), 4294967296)
1081 self.assertEqual(int('211301422354', 7), 4294967296)
1082 self.assertEqual(int('40000000000', 8), 4294967296)
1083 self.assertEqual(int('12068657454', 9), 4294967296)
1084 self.assertEqual(int('4294967296', 10), 4294967296)
1085 self.assertEqual(int('1904440554', 11), 4294967296)
1086 self.assertEqual(int('9ba461594', 12), 4294967296)
1087 self.assertEqual(int('535a79889', 13), 4294967296)
1088 self.assertEqual(int('2ca5b7464', 14), 4294967296)
1089 self.assertEqual(int('1a20dcd81', 15), 4294967296)
1090 self.assertEqual(int('100000000', 16), 4294967296)
1091 self.assertEqual(int('a7ffda91', 17), 4294967296)
1092 self.assertEqual(int('704he7g4', 18), 4294967296)
1093 self.assertEqual(int('4f5aff66', 19), 4294967296)
1094 self.assertEqual(int('3723ai4g', 20), 4294967296)
1095 self.assertEqual(int('281d55i4', 21), 4294967296)
1096 self.assertEqual(int('1fj8b184', 22), 4294967296)
1097 self.assertEqual(int('1606k7ic', 23), 4294967296)
1098 self.assertEqual(int('mb994ag', 24), 4294967296)
1099 self.assertEqual(int('hek2mgl', 25), 4294967296)
1100 self.assertEqual(int('dnchbnm', 26), 4294967296)
1101 self.assertEqual(int('b28jpdm', 27), 4294967296)
1102 self.assertEqual(int('8pfgih4', 28), 4294967296)
1103 self.assertEqual(int('76beigg', 29), 4294967296)
1104 self.assertEqual(int('5qmcpqg', 30), 4294967296)
1105 self.assertEqual(int('4q0jto4', 31), 4294967296)
1106 self.assertEqual(int('4000000', 32), 4294967296)
1107 self.assertEqual(int('3aokq94', 33), 4294967296)
1108 self.assertEqual(int('2qhxjli', 34), 4294967296)
1109 self.assertEqual(int('2br45qb', 35), 4294967296)
1110 self.assertEqual(int('1z141z4', 36), 4294967296)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001111
Guido van Rossume2a383d2007-01-15 16:59:06 +00001112 self.assertEqual(int('100000000000000000000000000000001', 2),
Thomas Wouters477c8d52006-05-27 19:21:47 +00001113 4294967297)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001114 self.assertEqual(int('102002022201221111212', 3), 4294967297)
1115 self.assertEqual(int('10000000000000001', 4), 4294967297)
1116 self.assertEqual(int('32244002423142', 5), 4294967297)
1117 self.assertEqual(int('1550104015505', 6), 4294967297)
1118 self.assertEqual(int('211301422355', 7), 4294967297)
1119 self.assertEqual(int('40000000001', 8), 4294967297)
1120 self.assertEqual(int('12068657455', 9), 4294967297)
1121 self.assertEqual(int('4294967297', 10), 4294967297)
1122 self.assertEqual(int('1904440555', 11), 4294967297)
1123 self.assertEqual(int('9ba461595', 12), 4294967297)
1124 self.assertEqual(int('535a7988a', 13), 4294967297)
1125 self.assertEqual(int('2ca5b7465', 14), 4294967297)
1126 self.assertEqual(int('1a20dcd82', 15), 4294967297)
1127 self.assertEqual(int('100000001', 16), 4294967297)
1128 self.assertEqual(int('a7ffda92', 17), 4294967297)
1129 self.assertEqual(int('704he7g5', 18), 4294967297)
1130 self.assertEqual(int('4f5aff67', 19), 4294967297)
1131 self.assertEqual(int('3723ai4h', 20), 4294967297)
1132 self.assertEqual(int('281d55i5', 21), 4294967297)
1133 self.assertEqual(int('1fj8b185', 22), 4294967297)
1134 self.assertEqual(int('1606k7id', 23), 4294967297)
1135 self.assertEqual(int('mb994ah', 24), 4294967297)
1136 self.assertEqual(int('hek2mgm', 25), 4294967297)
1137 self.assertEqual(int('dnchbnn', 26), 4294967297)
1138 self.assertEqual(int('b28jpdn', 27), 4294967297)
1139 self.assertEqual(int('8pfgih5', 28), 4294967297)
1140 self.assertEqual(int('76beigh', 29), 4294967297)
1141 self.assertEqual(int('5qmcpqh', 30), 4294967297)
1142 self.assertEqual(int('4q0jto5', 31), 4294967297)
1143 self.assertEqual(int('4000001', 32), 4294967297)
1144 self.assertEqual(int('3aokq95', 33), 4294967297)
1145 self.assertEqual(int('2qhxjlj', 34), 4294967297)
1146 self.assertEqual(int('2br45qc', 35), 4294967297)
1147 self.assertEqual(int('1z141z5', 36), 4294967297)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001148
Brett Cannonc3647ac2005-04-26 03:45:26 +00001149 def test_longconversion(self):
1150 # Test __long__()
1151 class Foo0:
1152 def __long__(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +00001153 return 42
Brett Cannonc3647ac2005-04-26 03:45:26 +00001154
1155 class Foo1(object):
1156 def __long__(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +00001157 return 42
Brett Cannonc3647ac2005-04-26 03:45:26 +00001158
Guido van Rossume2a383d2007-01-15 16:59:06 +00001159 class Foo2(int):
Brett Cannonc3647ac2005-04-26 03:45:26 +00001160 def __long__(self):
1161 return 42
1162
Guido van Rossume2a383d2007-01-15 16:59:06 +00001163 class Foo3(int):
1164 def __long__(self):
1165 return self
1166
1167 class Foo4(int):
1168 def __long__(self):
1169 return 42
1170
1171 class Foo5(int):
Brett Cannonc3647ac2005-04-26 03:45:26 +00001172 def __long__(self):
1173 return 42.
1174
Guido van Rossume2a383d2007-01-15 16:59:06 +00001175 self.assertEqual(int(Foo0()), 42)
1176 self.assertEqual(int(Foo1()), 42)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001177 # XXX invokes __int__ now
Guido van Rossumddefaf32007-01-14 03:31:43 +00001178 # self.assertEqual(long(Foo2()), 42L)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001179 self.assertEqual(int(Foo3()), 0)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001180 # XXX likewise
Guido van Rossumddefaf32007-01-14 03:31:43 +00001181 # self.assertEqual(long(Foo4()), 42)
1182 # self.assertRaises(TypeError, long, Foo5())
Brett Cannonc3647ac2005-04-26 03:45:26 +00001183
Walter Dörwald919497e2003-01-19 16:23:59 +00001184 def test_map(self):
1185 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001186 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001187 [1, 4, 9]
1188 )
1189 try:
1190 from math import sqrt
1191 except ImportError:
1192 def sqrt(x):
1193 return pow(x, 0.5)
1194 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001195 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +00001196 [[4.0, 2.0], [9.0, 3.0]]
1197 )
1198 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001199 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +00001200 [10, 4, 6]
1201 )
1202
1203 def plus(*v):
1204 accu = 0
1205 for i in v: accu = accu + i
1206 return accu
1207 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001208 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +00001209 [1, 3, 7]
1210 )
1211 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001212 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +00001213 [1+4, 3+9, 7+2]
1214 )
1215 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001216 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +00001217 [1+4+1, 3+9+1, 7+2+0]
1218 )
1219 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001220 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001221 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1222 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001223 def Max(a, b):
1224 if a is None:
1225 return b
1226 if b is None:
1227 return a
1228 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +00001229 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001230 list(map(Max, Squares(3), Squares(2))),
1231 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +00001232 )
1233 self.assertRaises(TypeError, map)
1234 self.assertRaises(TypeError, map, lambda x: x, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001235 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001236 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +00001237 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001238 yield None
1239 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +00001240 def badfunc(x):
1241 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001242 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001243
1244 def test_max(self):
1245 self.assertEqual(max('123123'), '3')
1246 self.assertEqual(max(1, 2, 3), 3)
1247 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1248 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1249
Guido van Rossume2a383d2007-01-15 16:59:06 +00001250 self.assertEqual(max(1, 2, 3.0), 3.0)
1251 self.assertEqual(max(1, 2.0, 3), 3)
1252 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001253
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001254 for stmt in (
1255 "max(key=int)", # no args
1256 "max(1, key=int)", # single arg not iterable
1257 "max(1, 2, keystone=int)", # wrong keyword
1258 "max(1, 2, key=int, abc=int)", # two many keywords
1259 "max(1, 2, key=1)", # keyfunc is not callable
1260 ):
Tim Peters7f061872004-12-07 21:17:46 +00001261 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001262 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001263 except TypeError:
1264 pass
1265 else:
1266 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001267
1268 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1269 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1270 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1271
1272 data = [random.randrange(200) for i in range(100)]
1273 keys = dict((elem, random.randrange(50)) for elem in data)
1274 f = keys.__getitem__
1275 self.assertEqual(max(data, key=f),
1276 sorted(reversed(data), key=f)[-1])
1277
Walter Dörwald919497e2003-01-19 16:23:59 +00001278 def test_min(self):
1279 self.assertEqual(min('123123'), '1')
1280 self.assertEqual(min(1, 2, 3), 1)
1281 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1282 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1283
Guido van Rossume2a383d2007-01-15 16:59:06 +00001284 self.assertEqual(min(1, 2, 3.0), 1)
1285 self.assertEqual(min(1, 2.0, 3), 1)
1286 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001287
1288 self.assertRaises(TypeError, min)
1289 self.assertRaises(TypeError, min, 42)
1290 self.assertRaises(ValueError, min, ())
1291 class BadSeq:
1292 def __getitem__(self, index):
1293 raise ValueError
1294 self.assertRaises(ValueError, min, BadSeq())
1295 class BadNumber:
1296 def __cmp__(self, other):
1297 raise ValueError
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001298 self.assertRaises(TypeError, min, (42, BadNumber()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001299
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001300 for stmt in (
1301 "min(key=int)", # no args
1302 "min(1, key=int)", # single arg not iterable
1303 "min(1, 2, keystone=int)", # wrong keyword
1304 "min(1, 2, key=int, abc=int)", # two many keywords
1305 "min(1, 2, key=1)", # keyfunc is not callable
1306 ):
Tim Peters7f061872004-12-07 21:17:46 +00001307 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001308 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001309 except TypeError:
1310 pass
1311 else:
1312 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001313
1314 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1315 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1316 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1317
1318 data = [random.randrange(200) for i in range(100)]
1319 keys = dict((elem, random.randrange(50)) for elem in data)
1320 f = keys.__getitem__
1321 self.assertEqual(min(data, key=f),
1322 sorted(data, key=f)[0])
1323
Georg Brandla18af4e2007-04-21 15:47:16 +00001324 def test_next(self):
1325 it = iter(range(2))
1326 self.assertEqual(next(it), 0)
1327 self.assertEqual(next(it), 1)
1328 self.assertRaises(StopIteration, next, it)
1329 self.assertRaises(StopIteration, next, it)
1330 self.assertEquals(next(it, 42), 42)
1331
1332 class Iter(object):
1333 def __iter__(self):
1334 return self
1335 def __next__(self):
1336 raise StopIteration
1337
1338 it = iter(Iter())
1339 self.assertEquals(next(it, 42), 42)
1340 self.assertRaises(StopIteration, next, it)
1341
1342 def gen():
1343 yield 1
1344 return
1345
1346 it = gen()
1347 self.assertEquals(next(it), 1)
1348 self.assertRaises(StopIteration, next, it)
1349 self.assertEquals(next(it, 42), 42)
1350
Walter Dörwald919497e2003-01-19 16:23:59 +00001351 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001352 self.assertEqual(oct(100), '0o144')
1353 self.assertEqual(oct(100), '0o144')
1354 self.assertEqual(oct(-100), '-0o144')
1355 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001356 self.assertRaises(TypeError, oct, ())
1357
1358 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001359 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001360 fp = open(TESTFN, 'w')
1361 try:
1362 fp.write('1+1\n')
1363 fp.write('1+1\n')
1364 fp.write('The quick brown fox jumps over the lazy dog')
1365 fp.write('.\n')
1366 fp.write('Dear John\n')
1367 fp.write('XXX'*100)
1368 fp.write('YYY'*100)
1369 finally:
1370 fp.close()
1371
1372 def test_open(self):
1373 self.write_testfile()
1374 fp = open(TESTFN, 'r')
1375 try:
1376 self.assertEqual(fp.readline(4), '1+1\n')
1377 self.assertEqual(fp.readline(4), '1+1\n')
1378 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1379 self.assertEqual(fp.readline(4), 'Dear')
1380 self.assertEqual(fp.readline(100), ' John\n')
1381 self.assertEqual(fp.read(300), 'XXX'*100)
1382 self.assertEqual(fp.read(1000), 'YYY'*100)
1383 finally:
1384 fp.close()
1385 unlink(TESTFN)
1386
1387 def test_ord(self):
1388 self.assertEqual(ord(' '), 32)
1389 self.assertEqual(ord('A'), 65)
1390 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001391 self.assertEqual(ord('\x80'), 128)
1392 self.assertEqual(ord('\xff'), 255)
1393
1394 self.assertEqual(ord(b' '), 32)
1395 self.assertEqual(ord(b'A'), 65)
1396 self.assertEqual(ord(b'a'), 97)
1397 self.assertEqual(ord(b'\x80'), 128)
1398 self.assertEqual(ord(b'\xff'), 255)
1399
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001400 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001401 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001402
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001403 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1404 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1405 self.assertEqual(ord("\U00010000"), 0x00010000)
1406 self.assertEqual(ord("\U00010001"), 0x00010001)
1407 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1408 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1409 self.assertEqual(ord("\U00100000"), 0x00100000)
1410 self.assertEqual(ord("\U00100001"), 0x00100001)
1411 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1412 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1413
Walter Dörwald919497e2003-01-19 16:23:59 +00001414 def test_pow(self):
1415 self.assertEqual(pow(0,0), 1)
1416 self.assertEqual(pow(0,1), 0)
1417 self.assertEqual(pow(1,0), 1)
1418 self.assertEqual(pow(1,1), 1)
1419
1420 self.assertEqual(pow(2,0), 1)
1421 self.assertEqual(pow(2,10), 1024)
1422 self.assertEqual(pow(2,20), 1024*1024)
1423 self.assertEqual(pow(2,30), 1024*1024*1024)
1424
1425 self.assertEqual(pow(-2,0), 1)
1426 self.assertEqual(pow(-2,1), -2)
1427 self.assertEqual(pow(-2,2), 4)
1428 self.assertEqual(pow(-2,3), -8)
1429
Guido van Rossume2a383d2007-01-15 16:59:06 +00001430 self.assertEqual(pow(0,0), 1)
1431 self.assertEqual(pow(0,1), 0)
1432 self.assertEqual(pow(1,0), 1)
1433 self.assertEqual(pow(1,1), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001434
Guido van Rossume2a383d2007-01-15 16:59:06 +00001435 self.assertEqual(pow(2,0), 1)
1436 self.assertEqual(pow(2,10), 1024)
1437 self.assertEqual(pow(2,20), 1024*1024)
1438 self.assertEqual(pow(2,30), 1024*1024*1024)
Walter Dörwald919497e2003-01-19 16:23:59 +00001439
Guido van Rossume2a383d2007-01-15 16:59:06 +00001440 self.assertEqual(pow(-2,0), 1)
1441 self.assertEqual(pow(-2,1), -2)
1442 self.assertEqual(pow(-2,2), 4)
1443 self.assertEqual(pow(-2,3), -8)
Walter Dörwald919497e2003-01-19 16:23:59 +00001444
1445 self.assertAlmostEqual(pow(0.,0), 1.)
1446 self.assertAlmostEqual(pow(0.,1), 0.)
1447 self.assertAlmostEqual(pow(1.,0), 1.)
1448 self.assertAlmostEqual(pow(1.,1), 1.)
1449
1450 self.assertAlmostEqual(pow(2.,0), 1.)
1451 self.assertAlmostEqual(pow(2.,10), 1024.)
1452 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1453 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1454
1455 self.assertAlmostEqual(pow(-2.,0), 1.)
1456 self.assertAlmostEqual(pow(-2.,1), -2.)
1457 self.assertAlmostEqual(pow(-2.,2), 4.)
1458 self.assertAlmostEqual(pow(-2.,3), -8.)
1459
Guido van Rossume2a383d2007-01-15 16:59:06 +00001460 for x in 2, 2, 2.0:
1461 for y in 10, 10, 10.0:
1462 for z in 1000, 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001463 if isinstance(x, float) or \
1464 isinstance(y, float) or \
1465 isinstance(z, float):
1466 self.assertRaises(TypeError, pow, x, y, z)
1467 else:
1468 self.assertAlmostEqual(pow(x, y, z), 24.0)
1469
Jeffrey Yasskin3404b3c2007-09-07 15:15:49 +00001470 self.assertAlmostEqual(pow(-1, 0.5), 1j)
1471 self.assertAlmostEqual(pow(-1, 1/3), 0.5 + 0.8660254037844386j)
1472
Walter Dörwald919497e2003-01-19 16:23:59 +00001473 self.assertRaises(TypeError, pow, -1, -2, 3)
1474 self.assertRaises(ValueError, pow, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001475 self.assertRaises(TypeError, pow, -1, -2, 3)
1476 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001477
1478 self.assertRaises(TypeError, pow)
1479
1480 def test_range(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001481 self.assertEqual(list(range(3)), [0, 1, 2])
1482 self.assertEqual(list(range(1, 5)), [1, 2, 3, 4])
1483 self.assertEqual(list(range(0)), [])
1484 self.assertEqual(list(range(-3)), [])
1485 self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
1486 #self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
Walter Dörwald919497e2003-01-19 16:23:59 +00001487
Guido van Rossum805365e2007-05-07 22:24:25 +00001488 """ XXX(nnorwitz):
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001489 # Now test range() with longs
Guido van Rossum805365e2007-05-07 22:24:25 +00001490 self.assertEqual(list(range(-2**100)), [])
1491 self.assertEqual(list(range(0, -2**100)), [])
1492 self.assertEqual(list(range(0, 2**100, -1)), [])
1493 self.assertEqual(list(range(0, 2**100, -1)), [])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001494
Christian Heimesa37d4c62007-12-04 23:02:19 +00001495 a = int(10 * sys.maxsize)
1496 b = int(100 * sys.maxsize)
1497 c = int(50 * sys.maxsize)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001498
Guido van Rossum805365e2007-05-07 22:24:25 +00001499 self.assertEqual(list(range(a, a+2)), [a, a+1])
1500 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
1501 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001502
Guido van Rossum805365e2007-05-07 22:24:25 +00001503 seq = list(range(a, b, c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001504 self.assert_(a in seq)
1505 self.assert_(b not in seq)
1506 self.assertEqual(len(seq), 2)
1507
Guido van Rossum805365e2007-05-07 22:24:25 +00001508 seq = list(range(b, a, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001509 self.assert_(b in seq)
1510 self.assert_(a not in seq)
1511 self.assertEqual(len(seq), 2)
1512
Guido van Rossum805365e2007-05-07 22:24:25 +00001513 seq = list(range(-a, -b, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001514 self.assert_(-a in seq)
1515 self.assert_(-b not in seq)
1516 self.assertEqual(len(seq), 2)
1517
Walter Dörwald919497e2003-01-19 16:23:59 +00001518 self.assertRaises(TypeError, range)
1519 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1520 self.assertRaises(ValueError, range, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001521 self.assertRaises(ValueError, range, a, a + 1, int(0))
Neal Norwitzfcf44352005-11-27 20:37:43 +00001522
1523 class badzero(int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001524 def __eq__(self, other):
Neal Norwitzfcf44352005-11-27 20:37:43 +00001525 raise RuntimeError
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001526 __ne__ = __lt__ = __gt__ = __le__ = __ge__ = __eq__
1527
1528 # XXX This won't (but should!) raise RuntimeError if a is an int...
Neal Norwitzfcf44352005-11-27 20:37:43 +00001529 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Guido van Rossum805365e2007-05-07 22:24:25 +00001530 """
Walter Dörwald919497e2003-01-19 16:23:59 +00001531
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001532 # Reject floats when it would require PyLongs to represent.
1533 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001534 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001535
Walter Dörwald357981e2003-04-15 18:59:28 +00001536 self.assertRaises(TypeError, range, 0, "spam")
1537 self.assertRaises(TypeError, range, 0, 42, "spam")
1538
Christian Heimesa37d4c62007-12-04 23:02:19 +00001539 #NEAL self.assertRaises(OverflowError, range, -sys.maxsize, sys.maxsize)
1540 #NEAL self.assertRaises(OverflowError, range, 0, 2*sys.maxsize)
Guido van Rossum805365e2007-05-07 22:24:25 +00001541
Christian Heimesa37d4c62007-12-04 23:02:19 +00001542 self.assertRaises(OverflowError, len, range(0, sys.maxsize**10))
Walter Dörwald357981e2003-04-15 18:59:28 +00001543
Guido van Rossuma88a0332007-02-26 16:59:55 +00001544 def test_input(self):
1545 self.write_testfile()
1546 fp = open(TESTFN, 'r')
1547 savestdin = sys.stdin
1548 savestdout = sys.stdout # Eats the echo
1549 try:
1550 sys.stdin = fp
1551 sys.stdout = BitBucket()
1552 self.assertEqual(input(), "1+1")
1553 self.assertEqual(input('testing\n'), "1+1")
1554 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1555 self.assertEqual(input('testing\n'), 'Dear John')
1556
1557 # SF 1535165: don't segfault on closed stdin
1558 # sys.stdout must be a regular file for triggering
1559 sys.stdout = savestdout
1560 sys.stdin.close()
1561 self.assertRaises(ValueError, input)
1562
1563 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001564 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001565 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001566 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001567 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001568 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001569 self.assertRaises(EOFError, input)
1570
1571 del sys.stdout
1572 self.assertRaises(RuntimeError, input, 'prompt')
1573 del sys.stdin
1574 self.assertRaises(RuntimeError, input, 'prompt')
1575 finally:
1576 sys.stdin = savestdin
1577 sys.stdout = savestdout
1578 fp.close()
1579 unlink(TESTFN)
1580
Walter Dörwald919497e2003-01-19 16:23:59 +00001581 def test_repr(self):
1582 self.assertEqual(repr(''), '\'\'')
1583 self.assertEqual(repr(0), '0')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001584 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001585 self.assertEqual(repr(()), '()')
1586 self.assertEqual(repr([]), '[]')
1587 self.assertEqual(repr({}), '{}')
1588 a = []
1589 a.append(a)
1590 self.assertEqual(repr(a), '[[...]]')
1591 a = {}
1592 a[0] = a
1593 self.assertEqual(repr(a), '{0: {...}}')
1594
1595 def test_round(self):
1596 self.assertEqual(round(0.0), 0.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001597 self.assertEqual(type(round(0.0)), int)
Walter Dörwald919497e2003-01-19 16:23:59 +00001598 self.assertEqual(round(1.0), 1.0)
1599 self.assertEqual(round(10.0), 10.0)
1600 self.assertEqual(round(1000000000.0), 1000000000.0)
1601 self.assertEqual(round(1e20), 1e20)
1602
1603 self.assertEqual(round(-1.0), -1.0)
1604 self.assertEqual(round(-10.0), -10.0)
1605 self.assertEqual(round(-1000000000.0), -1000000000.0)
1606 self.assertEqual(round(-1e20), -1e20)
1607
1608 self.assertEqual(round(0.1), 0.0)
1609 self.assertEqual(round(1.1), 1.0)
1610 self.assertEqual(round(10.1), 10.0)
1611 self.assertEqual(round(1000000000.1), 1000000000.0)
1612
1613 self.assertEqual(round(-1.1), -1.0)
1614 self.assertEqual(round(-10.1), -10.0)
1615 self.assertEqual(round(-1000000000.1), -1000000000.0)
1616
1617 self.assertEqual(round(0.9), 1.0)
1618 self.assertEqual(round(9.9), 10.0)
1619 self.assertEqual(round(999999999.9), 1000000000.0)
1620
1621 self.assertEqual(round(-0.9), -1.0)
1622 self.assertEqual(round(-9.9), -10.0)
1623 self.assertEqual(round(-999999999.9), -1000000000.0)
1624
1625 self.assertEqual(round(-8.0, -1), -10.0)
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001626 self.assertEqual(type(round(-8.0, -1)), float)
1627
1628 self.assertEqual(type(round(-8.0, 0)), float)
1629 self.assertEqual(type(round(-8.0, 1)), float)
1630
1631 # Check even / odd rounding behaviour
1632 self.assertEqual(round(5.5), 6)
1633 self.assertEqual(round(6.5), 6)
1634 self.assertEqual(round(-5.5), -6)
1635 self.assertEqual(round(-6.5), -6)
1636
1637 # Check behavior on ints
1638 self.assertEqual(round(0), 0)
1639 self.assertEqual(round(8), 8)
1640 self.assertEqual(round(-8), -8)
1641 self.assertEqual(type(round(0)), int)
1642 self.assertEqual(type(round(-8, -1)), float)
1643 self.assertEqual(type(round(-8, 0)), float)
1644 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001645
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001646 # test new kwargs
1647 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1648
Walter Dörwald919497e2003-01-19 16:23:59 +00001649 self.assertRaises(TypeError, round)
1650
Alex Martelliae211f92007-08-22 23:21:33 +00001651 # test generic rounding delegation for reals
1652 class TestRound:
1653 def __round__(self):
1654 return 23
1655
1656 class TestNoRound:
1657 pass
1658
1659 self.assertEqual(round(TestRound()), 23)
1660
1661 self.assertRaises(TypeError, round, 1, 2, 3)
1662 self.assertRaises(TypeError, round, TestNoRound())
1663
Guido van Rossum2fa33db2007-08-23 22:07:24 +00001664 t = TestNoRound()
1665 t.__round__ = lambda *args: args
1666 self.assertRaises(TypeError, round, t)
1667 self.assertRaises(TypeError, round, t, 0)
1668
Walter Dörwald919497e2003-01-19 16:23:59 +00001669 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001670 setattr(sys, 'spam', 1)
1671 self.assertEqual(sys.spam, 1)
1672 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1673 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001674
1675 def test_str(self):
1676 self.assertEqual(str(''), '')
1677 self.assertEqual(str(0), '0')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001678 self.assertEqual(str(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001679 self.assertEqual(str(()), '()')
1680 self.assertEqual(str([]), '[]')
1681 self.assertEqual(str({}), '{}')
1682 a = []
1683 a.append(a)
1684 self.assertEqual(str(a), '[[...]]')
1685 a = {}
1686 a[0] = a
1687 self.assertEqual(str(a), '{0: {...}}')
1688
Alex Martellia70b1912003-04-22 08:12:33 +00001689 def test_sum(self):
1690 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001691 self.assertEqual(sum(list(range(2,8))), 27)
1692 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001693 self.assertEqual(sum(Squares(10)), 285)
1694 self.assertEqual(sum(iter(Squares(10))), 285)
1695 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1696
1697 self.assertRaises(TypeError, sum)
1698 self.assertRaises(TypeError, sum, 42)
1699 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1700 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1701 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1702 self.assertRaises(TypeError, sum, [{2:3}])
1703 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1704
1705 class BadSeq:
1706 def __getitem__(self, index):
1707 raise ValueError
1708 self.assertRaises(ValueError, sum, BadSeq())
1709
Walter Dörwald919497e2003-01-19 16:23:59 +00001710 def test_tuple(self):
1711 self.assertEqual(tuple(()), ())
1712 t0_3 = (0, 1, 2, 3)
1713 t0_3_bis = tuple(t0_3)
1714 self.assert_(t0_3 is t0_3_bis)
1715 self.assertEqual(tuple([]), ())
1716 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1717 self.assertEqual(tuple(''), ())
1718 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1719
1720 def test_type(self):
1721 self.assertEqual(type(''), type('123'))
1722 self.assertNotEqual(type(''), type(()))
1723
Guido van Rossumfee7b932005-01-16 00:21:28 +00001724 # We don't want self in vars(), so these are static methods
1725
1726 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001727 def get_vars_f0():
1728 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001729
Guido van Rossumfee7b932005-01-16 00:21:28 +00001730 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001731 def get_vars_f2():
1732 BuiltinTest.get_vars_f0()
1733 a = 1
1734 b = 2
1735 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001736
1737 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001738 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001739 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001740 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001741 self.assertEqual(self.get_vars_f0(), {})
1742 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1743 self.assertRaises(TypeError, vars, 42, 42)
1744 self.assertRaises(TypeError, vars, 42)
1745
1746 def test_zip(self):
1747 a = (1, 2, 3)
1748 b = (4, 5, 6)
1749 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001750 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001751 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001752 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001753 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001754 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001755 class I:
1756 def __getitem__(self, i):
1757 if i < 0 or i > 2: raise IndexError
1758 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001759 self.assertEqual(list(zip(a, I())), t)
1760 self.assertEqual(list(zip()), [])
1761 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001762 self.assertRaises(TypeError, zip, None)
1763 class G:
1764 pass
1765 self.assertRaises(TypeError, zip, a, G())
1766
1767 # Make sure zip doesn't try to allocate a billion elements for the
1768 # result list when one of its arguments doesn't say how long it is.
1769 # A MemoryError is the most likely failure mode.
1770 class SequenceWithoutALength:
1771 def __getitem__(self, i):
1772 if i == 5:
1773 raise IndexError
1774 else:
1775 return i
1776 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001777 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001778 list(enumerate(range(5)))
1779 )
1780
1781 class BadSeq:
1782 def __getitem__(self, i):
1783 if i == 5:
1784 raise ValueError
1785 else:
1786 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001787 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001788
Raymond Hettinger64958a12003-12-17 20:43:33 +00001789class TestSorted(unittest.TestCase):
1790
1791 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001792 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001793 copy = data[:]
1794 random.shuffle(copy)
1795 self.assertEqual(data, sorted(copy))
1796 self.assertNotEqual(data, copy)
1797
1798 data.reverse()
1799 random.shuffle(copy)
Raymond Hettinger64958a12003-12-17 20:43:33 +00001800 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1801 self.assertNotEqual(data, copy)
1802 random.shuffle(copy)
1803 self.assertEqual(data, sorted(copy, reverse=1))
1804 self.assertNotEqual(data, copy)
1805
1806 def test_inputtypes(self):
1807 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001808 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001809 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001810 self.assertEqual(sorted(s), sorted(T(s)))
1811
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001812 s = ''.join(set(s)) # unique letters only
1813 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001814 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001815 self.assertEqual(sorted(s), sorted(T(s)))
1816
1817 def test_baddecorator(self):
1818 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1819 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1820
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001821def test_main(verbose=None):
1822 test_classes = (BuiltinTest, TestSorted)
1823
1824 run_unittest(*test_classes)
1825
1826 # verify reference counting
1827 if verbose and hasattr(sys, "gettotalrefcount"):
1828 import gc
1829 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001830 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001831 run_unittest(*test_classes)
1832 gc.collect()
1833 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001834 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001835
Walter Dörwald919497e2003-01-19 16:23:59 +00001836
1837if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001838 test_main(verbose=True)