blob: b3e47338041bbfa738eac9496d429982d8f16117 [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
Guido van Rossum34d19282007-08-09 01:03:29 +00008import sys, warnings, random, UserDict, io
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
52L = [
53 ('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),
Walter Dörwald70a6b492004-02-12 17:35:32 +000063 (repr(sys.maxint), sys.maxint),
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
Raymond Hettinger96229b12005-03-11 06:49:40 +000074class TestFailingBool:
Jack Diederich4dafcc42006-11-28 19:15:13 +000075 def __bool__(self):
Raymond Hettinger96229b12005-03-11 06:49:40 +000076 raise RuntimeError
77
78class TestFailingIter:
79 def __iter__(self):
80 raise RuntimeError
81
Walter Dörwald919497e2003-01-19 16:23:59 +000082class BuiltinTest(unittest.TestCase):
83
84 def test_import(self):
85 __import__('sys')
86 __import__('time')
87 __import__('string')
Guido van Rossumd8faa362007-04-27 19:54:29 +000088 __import__(name='sys')
89 __import__(name='time', level=0)
Walter Dörwald919497e2003-01-19 16:23:59 +000090 self.assertRaises(ImportError, __import__, 'spamspam')
91 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000092 self.assertRaises(ValueError, __import__, '')
Guido van Rossumd8faa362007-04-27 19:54:29 +000093 self.assertRaises(TypeError, __import__, 'sys', name='sys')
Walter Dörwald919497e2003-01-19 16:23:59 +000094
95 def test_abs(self):
96 # int
97 self.assertEqual(abs(0), 0)
98 self.assertEqual(abs(1234), 1234)
99 self.assertEqual(abs(-1234), 1234)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000100 self.assertTrue(abs(-sys.maxint-1) > 0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000101 # float
102 self.assertEqual(abs(0.0), 0.0)
103 self.assertEqual(abs(3.14), 3.14)
104 self.assertEqual(abs(-3.14), 3.14)
105 # long
Guido van Rossume2a383d2007-01-15 16:59:06 +0000106 self.assertEqual(abs(0), 0)
107 self.assertEqual(abs(1234), 1234)
108 self.assertEqual(abs(-1234), 1234)
Walter Dörwald919497e2003-01-19 16:23:59 +0000109 # str
110 self.assertRaises(TypeError, abs, 'a')
111
Raymond Hettinger96229b12005-03-11 06:49:40 +0000112 def test_all(self):
113 self.assertEqual(all([2, 4, 6]), True)
114 self.assertEqual(all([2, None, 6]), False)
115 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
116 self.assertRaises(RuntimeError, all, TestFailingIter())
117 self.assertRaises(TypeError, all, 10) # Non-iterable
118 self.assertRaises(TypeError, all) # No args
119 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
120 self.assertEqual(all([]), True) # Empty iterator
121 S = [50, 60]
122 self.assertEqual(all(x > 42 for x in S), True)
123 S = [50, 40, 60]
124 self.assertEqual(all(x > 42 for x in S), False)
125
126 def test_any(self):
127 self.assertEqual(any([None, None, None]), False)
128 self.assertEqual(any([None, 4, None]), True)
129 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
130 self.assertRaises(RuntimeError, all, TestFailingIter())
131 self.assertRaises(TypeError, any, 10) # Non-iterable
132 self.assertRaises(TypeError, any) # No args
133 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
134 self.assertEqual(any([]), False) # Empty iterator
135 S = [40, 60, 30]
136 self.assertEqual(any(x > 42 for x in S), True)
137 S = [10, 20, 30]
138 self.assertEqual(any(x > 42 for x in S), False)
139
Thomas Wouters89f507f2006-12-13 04:49:30 +0000140 def test_neg(self):
141 x = -sys.maxint-1
142 self.assert_(isinstance(x, int))
143 self.assertEqual(-x, sys.maxint+1)
144
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000145 # XXX(nnorwitz): This test case for callable should probably be removed.
Walter Dörwald919497e2003-01-19 16:23:59 +0000146 def test_callable(self):
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000147 self.assert_(hasattr(len, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000148 def f(): pass
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000149 self.assert_(hasattr(f, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000150 class C:
151 def meth(self): pass
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000152 self.assert_(hasattr(C, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000153 x = C()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000154 self.assert_(hasattr(x.meth, '__call__'))
155 self.assert_(not hasattr(x, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000156 class D(C):
157 def __call__(self): pass
158 y = D()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000159 self.assert_(hasattr(y, '__call__'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000160 y()
161
162 def test_chr(self):
163 self.assertEqual(chr(32), ' ')
164 self.assertEqual(chr(65), 'A')
165 self.assertEqual(chr(97), 'a')
166 self.assertEqual(chr(0xff), '\xff')
Guido van Rossum572dbf82007-04-27 23:53:51 +0000167 self.assertRaises(ValueError, chr, 1<<24)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000168 self.assertEqual(chr(sys.maxunicode),
169 str(('\\U%08x' % (sys.maxunicode)).encode("ascii"),
170 'unicode-escape'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000171 self.assertRaises(TypeError, chr)
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000172 self.assertEqual(chr(0x0000FFFF), "\U0000FFFF")
173 self.assertEqual(chr(0x00010000), "\U00010000")
174 self.assertEqual(chr(0x00010001), "\U00010001")
175 self.assertEqual(chr(0x000FFFFE), "\U000FFFFE")
176 self.assertEqual(chr(0x000FFFFF), "\U000FFFFF")
177 self.assertEqual(chr(0x00100000), "\U00100000")
178 self.assertEqual(chr(0x00100001), "\U00100001")
179 self.assertEqual(chr(0x0010FFFE), "\U0010FFFE")
180 self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
181 self.assertRaises(ValueError, chr, -1)
182 self.assertRaises(ValueError, chr, 0x00110000)
Walter Dörwald919497e2003-01-19 16:23:59 +0000183
Guido van Rossum8ac004e2007-07-15 13:00:05 +0000184 def test_cmp(self):
Walter Dörwald919497e2003-01-19 16:23:59 +0000185 self.assertEqual(cmp(-1, 1), -1)
186 self.assertEqual(cmp(1, -1), 1)
187 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000188 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000189 a = []; a.append(a)
190 b = []; b.append(b)
191 from UserList import UserList
192 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000193 self.assertRaises(RuntimeError, cmp, a, b)
194 self.assertRaises(RuntimeError, cmp, b, c)
195 self.assertRaises(RuntimeError, cmp, c, a)
196 self.assertRaises(RuntimeError, cmp, a, c)
197 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000198 a.pop(); b.pop(); c.pop()
199 self.assertRaises(TypeError, cmp)
200
Walter Dörwald919497e2003-01-19 16:23:59 +0000201 def test_compile(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000202 compile('print(1)\n', '', 'exec')
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000203## bom = b'\xef\xbb\xbf'
204## compile(bom + b'print(1)\n', '', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000205 compile(source='pass', filename='?', mode='exec')
206 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
207 compile('pass', '?', dont_inherit=1, mode='exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000208 self.assertRaises(TypeError, compile)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000209 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'badmode')
210 self.assertRaises(ValueError, compile, 'print(42)\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000211 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000212 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
213 mode='eval', source='0', filename='tmp')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000214 compile('print("\xe5")\n', '', 'exec')
215 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
216 self.assertRaises(ValueError, compile, str('a = 1'), 'f', 'bad')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000217
Walter Dörwald919497e2003-01-19 16:23:59 +0000218 def test_delattr(self):
219 import sys
220 sys.spam = 1
221 delattr(sys, 'spam')
222 self.assertRaises(TypeError, delattr)
223
224 def test_dir(self):
Georg Brandle32b4222007-03-10 22:13:27 +0000225 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000226 self.assertRaises(TypeError, dir, 42, 42)
227
Georg Brandle32b4222007-03-10 22:13:27 +0000228 # dir() - local scope
229 local_var = 1
230 self.assert_('local_var' in dir())
231
232 # dir(module)
233 import sys
234 self.assert_('exit' in dir(sys))
235
236 # dir(module_with_invalid__dict__)
237 import types
238 class Foo(types.ModuleType):
239 __dict__ = 8
240 f = Foo("foo")
241 self.assertRaises(TypeError, dir, f)
242
243 # dir(type)
244 self.assert_("strip" in dir(str))
245 self.assert_("__mro__" not in dir(str))
246
247 # dir(obj)
248 class Foo(object):
249 def __init__(self):
250 self.x = 7
251 self.y = 8
252 self.z = 9
253 f = Foo()
254 self.assert_("y" in dir(f))
255
256 # dir(obj_no__dict__)
257 class Foo(object):
258 __slots__ = []
259 f = Foo()
260 self.assert_("__repr__" in dir(f))
261
262 # dir(obj_no__class__with__dict__)
263 # (an ugly trick to cause getattr(f, "__class__") to fail)
264 class Foo(object):
265 __slots__ = ["__class__", "__dict__"]
266 def __init__(self):
267 self.bar = "wow"
268 f = Foo()
269 self.assert_("__repr__" not in dir(f))
270 self.assert_("bar" in dir(f))
271
272 # dir(obj_using __dir__)
273 class Foo(object):
274 def __dir__(self):
275 return ["kan", "ga", "roo"]
276 f = Foo()
277 self.assert_(dir(f) == ["ga", "kan", "roo"])
278
279 # dir(obj__dir__not_list)
280 class Foo(object):
281 def __dir__(self):
282 return 7
283 f = Foo()
284 self.assertRaises(TypeError, dir, f)
285
Collin Winter3eed7652007-08-14 17:53:54 +0000286 # dir(traceback)
287 try:
288 raise IndexError
289 except:
290 self.assertEqual(len(dir(sys.exc_info()[2])), 4)
291
292
Walter Dörwald919497e2003-01-19 16:23:59 +0000293 def test_divmod(self):
294 self.assertEqual(divmod(12, 7), (1, 5))
295 self.assertEqual(divmod(-12, 7), (-2, 2))
296 self.assertEqual(divmod(12, -7), (-2, -2))
297 self.assertEqual(divmod(-12, -7), (1, -5))
298
Guido van Rossume2a383d2007-01-15 16:59:06 +0000299 self.assertEqual(divmod(12, 7), (1, 5))
300 self.assertEqual(divmod(-12, 7), (-2, 2))
301 self.assertEqual(divmod(12, -7), (-2, -2))
302 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000303
Guido van Rossume2a383d2007-01-15 16:59:06 +0000304 self.assertEqual(divmod(12, 7), (1, 5))
305 self.assertEqual(divmod(-12, 7), (-2, 2))
306 self.assertEqual(divmod(12, -7), (-2, -2))
307 self.assertEqual(divmod(-12, -7), (1, -5))
Walter Dörwald919497e2003-01-19 16:23:59 +0000308
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000309 self.assertEqual(divmod(-sys.maxint-1, -1),
310 (sys.maxint+1, 0))
311
Walter Dörwald919497e2003-01-19 16:23:59 +0000312 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
313 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
314 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
315 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
316
317 self.assertRaises(TypeError, divmod)
318
319 def test_eval(self):
320 self.assertEqual(eval('1+1'), 2)
321 self.assertEqual(eval(' 1+1\n'), 2)
322 globals = {'a': 1, 'b': 2}
323 locals = {'b': 200, 'c': 300}
324 self.assertEqual(eval('a', globals) , 1)
325 self.assertEqual(eval('a', globals, locals), 1)
326 self.assertEqual(eval('b', globals, locals), 200)
327 self.assertEqual(eval('c', globals, locals), 300)
Walter Dörwald919497e2003-01-19 16:23:59 +0000328 globals = {'a': 1, 'b': 2}
329 locals = {'b': 200, 'c': 300}
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000330## bom = b'\xef\xbb\xbf'
331## self.assertEqual(eval(bom + b'a', globals, locals), 1)
332 self.assertEqual(eval('"\xe5"', globals), "\xe5")
Walter Dörwald919497e2003-01-19 16:23:59 +0000333 self.assertRaises(TypeError, eval)
334 self.assertRaises(TypeError, eval, ())
335
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000336 def test_general_eval(self):
337 # Tests that general mappings can be used for the locals argument
338
339 class M:
340 "Test mapping interface versus possible calls from eval()."
341 def __getitem__(self, key):
342 if key == 'a':
343 return 12
344 raise KeyError
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000345 def keys(self):
346 return list('xyz')
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000347
348 m = M()
349 g = globals()
350 self.assertEqual(eval('a', g, m), 12)
351 self.assertRaises(NameError, eval, 'b', g, m)
352 self.assertEqual(eval('dir()', g, m), list('xyz'))
353 self.assertEqual(eval('globals()', g, m), g)
354 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000355 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000356 class A:
357 "Non-mapping"
358 pass
359 m = A()
360 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000361
362 # Verify that dict subclasses work as well
363 class D(dict):
364 def __getitem__(self, key):
365 if key == 'a':
366 return 12
367 return dict.__getitem__(self, key)
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 d = D()
372 self.assertEqual(eval('a', g, d), 12)
373 self.assertRaises(NameError, eval, 'b', g, d)
374 self.assertEqual(eval('dir()', g, d), list('xyz'))
375 self.assertEqual(eval('globals()', g, d), g)
376 self.assertEqual(eval('locals()', g, d), d)
377
378 # Verify locals stores (used by list comps)
379 eval('[locals() for i in (2,3)]', g, d)
380 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
381
382 class SpreadSheet:
383 "Sample application showing nested, calculated lookups."
384 _cells = {}
385 def __setitem__(self, key, formula):
386 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000387 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000388 return eval(self._cells[key], globals(), self)
389
390 ss = SpreadSheet()
391 ss['a1'] = '5'
392 ss['a2'] = 'a1*6'
393 ss['a3'] = 'a2*7'
394 self.assertEqual(ss['a3'], 210)
395
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000396 # Verify that dir() catches a non-list returned by eval
397 # SF bug #1004669
398 class C:
399 def __getitem__(self, item):
400 raise KeyError(item)
Guido van Rossumcd70eee2007-02-11 18:53:00 +0000401 def keys(self):
402 return 1 # used to be 'a' but that's no longer an error
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000403 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
404
Georg Brandl7cae87c2006-09-06 06:51:57 +0000405 def test_exec(self):
406 g = {}
407 exec('z = 1', g)
408 if '__builtins__' in g:
409 del g['__builtins__']
410 self.assertEqual(g, {'z': 1})
411
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000412 exec('z = 1+1', g)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000413 if '__builtins__' in g:
414 del g['__builtins__']
415 self.assertEqual(g, {'z': 2})
416 g = {}
417 l = {}
418
419 import warnings
420 warnings.filterwarnings("ignore", "global statement", module="<string>")
421 exec('global a; a = 1; b = 2', g, l)
422 if '__builtins__' in g:
423 del g['__builtins__']
424 if '__builtins__' in l:
425 del l['__builtins__']
426 self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
427
Walter Dörwald919497e2003-01-19 16:23:59 +0000428 def test_filter(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000429 self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld'))
430 self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9])
431 self.assertEqual(list(filter(lambda x: x > 0, [1, -3, 9, 0, 2])), [1, 9, 2])
432 self.assertEqual(list(filter(None, Squares(10))), [1, 4, 9, 16, 25, 36, 49, 64, 81])
433 self.assertEqual(list(filter(lambda x: x%2, Squares(10))), [1, 9, 25, 49, 81])
Walter Dörwald919497e2003-01-19 16:23:59 +0000434 def identity(item):
435 return 1
436 filter(identity, Squares(5))
437 self.assertRaises(TypeError, filter)
438 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000439 def __getitem__(self, index):
440 if index<4:
441 return 42
442 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000443 self.assertRaises(ValueError, list, filter(lambda x: x, BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +0000444 def badfunc():
445 pass
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000446 self.assertRaises(TypeError, list, filter(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000447
Walter Dörwaldbf517072003-01-27 15:57:14 +0000448 # test bltinmodule.c::filtertuple()
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000449 self.assertEqual(list(filter(None, (1, 2))), [1, 2])
450 self.assertEqual(list(filter(lambda x: x>=3, (1, 2, 3, 4))), [3, 4])
451 self.assertRaises(TypeError, list, filter(42, (1, 2)))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000452
Walter Dörwald919497e2003-01-19 16:23:59 +0000453 def test_float(self):
454 self.assertEqual(float(3.14), 3.14)
455 self.assertEqual(float(314), 314.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000456 self.assertEqual(float(314), 314.0)
Walter Dörwald919497e2003-01-19 16:23:59 +0000457 self.assertEqual(float(" 3.14 "), 3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000458 self.assertRaises(ValueError, float, " 0x3.1 ")
459 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000460 self.assertEqual(float(str(b" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
461 self.assertEqual(float("1"*10000), 1e10000) # Inf on both sides
Walter Dörwald919497e2003-01-19 16:23:59 +0000462
Thomas Wouters477c8d52006-05-27 19:21:47 +0000463 @run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
Neal Norwitz5898fa22005-11-22 05:17:40 +0000464 def test_float_with_comma(self):
465 # set locale to something that doesn't use '.' for the decimal point
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000466 # float must not accept the locale specific decimal point but
467 # it still has to accept the normal python syntac
Thomas Wouters477c8d52006-05-27 19:21:47 +0000468 import locale
469 if not locale.localeconv()['decimal_point'] == ',':
Neal Norwitz5898fa22005-11-22 05:17:40 +0000470 return
471
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000472 self.assertEqual(float(" 3.14 "), 3.14)
473 self.assertEqual(float("+3.14 "), 3.14)
474 self.assertEqual(float("-3.14 "), -3.14)
475 self.assertEqual(float(".14 "), .14)
476 self.assertEqual(float("3. "), 3.0)
477 self.assertEqual(float("3.e3 "), 3000.0)
478 self.assertEqual(float("3.2e3 "), 3200.0)
479 self.assertEqual(float("2.5e-1 "), 0.25)
480 self.assertEqual(float("5e-1"), 0.5)
481 self.assertRaises(ValueError, float, " 3,14 ")
482 self.assertRaises(ValueError, float, " +3,14 ")
483 self.assertRaises(ValueError, float, " -3,14 ")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000484 self.assertRaises(ValueError, float, " 0x3.1 ")
485 self.assertRaises(ValueError, float, " -0x3.p-1 ")
486 self.assertEqual(float(" 25.e-1 "), 2.5)
487 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000488
Brett Cannonc3647ac2005-04-26 03:45:26 +0000489 def test_floatconversion(self):
490 # Make sure that calls to __float__() work properly
491 class Foo0:
492 def __float__(self):
493 return 42.
494
495 class Foo1(object):
496 def __float__(self):
497 return 42.
498
499 class Foo2(float):
500 def __float__(self):
501 return 42.
502
503 class Foo3(float):
504 def __new__(cls, value=0.):
505 return float.__new__(cls, 2*value)
506
507 def __float__(self):
508 return self
509
510 class Foo4(float):
511 def __float__(self):
512 return 42
513
514 self.assertAlmostEqual(float(Foo0()), 42.)
515 self.assertAlmostEqual(float(Foo1()), 42.)
516 self.assertAlmostEqual(float(Foo2()), 42.)
517 self.assertAlmostEqual(float(Foo3(21)), 42.)
518 self.assertRaises(TypeError, float, Foo4(42))
519
Walter Dörwald919497e2003-01-19 16:23:59 +0000520 def test_getattr(self):
521 import sys
522 self.assert_(getattr(sys, 'stdout') is sys.stdout)
523 self.assertRaises(TypeError, getattr, sys, 1)
524 self.assertRaises(TypeError, getattr, sys, 1, "foo")
525 self.assertRaises(TypeError, getattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000526 self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000527
528 def test_hasattr(self):
529 import sys
530 self.assert_(hasattr(sys, 'stdout'))
531 self.assertRaises(TypeError, hasattr, sys, 1)
532 self.assertRaises(TypeError, hasattr)
Guido van Rossumf15a29f2007-05-04 00:41:39 +0000533 self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
Walter Dörwald919497e2003-01-19 16:23:59 +0000534
535 def test_hash(self):
536 hash(None)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000537 self.assertEqual(hash(1), hash(1))
Walter Dörwald919497e2003-01-19 16:23:59 +0000538 self.assertEqual(hash(1), hash(1.0))
539 hash('spam')
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000540 self.assertEqual(hash('spam'), hash(str8('spam')))
Walter Dörwald919497e2003-01-19 16:23:59 +0000541 hash((0,1,2,3))
542 def f(): pass
543 self.assertRaises(TypeError, hash, [])
544 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000545 # Bug 1536021: Allow hash to return long objects
546 class X:
547 def __hash__(self):
548 return 2**100
549 self.assertEquals(type(hash(X())), int)
550 class Y(object):
551 def __hash__(self):
552 return 2**100
553 self.assertEquals(type(hash(Y())), int)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000554 class Z(int):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000555 def __hash__(self):
556 return self
Guido van Rossume2a383d2007-01-15 16:59:06 +0000557 self.assertEquals(hash(Z(42)), hash(42))
Walter Dörwald919497e2003-01-19 16:23:59 +0000558
559 def test_hex(self):
560 self.assertEqual(hex(16), '0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000561 self.assertEqual(hex(16), '0x10')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000562 self.assertEqual(hex(-16), '-0x10')
Guido van Rossume2a383d2007-01-15 16:59:06 +0000563 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000564 self.assertRaises(TypeError, hex, {})
565
566 def test_id(self):
567 id(None)
568 id(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000569 id(1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000570 id(1.0)
571 id('spam')
572 id((0,1,2,3))
573 id([0,1,2,3])
574 id({'spam': 1, 'eggs': 2, 'ham': 3})
575
Guido van Rossuma88a0332007-02-26 16:59:55 +0000576 # Test input() later, alphabetized as if it were raw_input
577
Walter Dörwald919497e2003-01-19 16:23:59 +0000578 def test_int(self):
579 self.assertEqual(int(314), 314)
580 self.assertEqual(int(3.14), 3)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000581 self.assertEqual(int(314), 314)
Walter Dörwald919497e2003-01-19 16:23:59 +0000582 # Check that conversion from float truncates towards zero
583 self.assertEqual(int(-3.14), -3)
584 self.assertEqual(int(3.9), 3)
585 self.assertEqual(int(-3.9), -3)
586 self.assertEqual(int(3.5), 3)
587 self.assertEqual(int(-3.5), -3)
588 # Different base:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000589 self.assertEqual(int("10",16), 16)
Walter Dörwald919497e2003-01-19 16:23:59 +0000590 # Test conversion from strings and various anomalies
591 for s, v in L:
592 for sign in "", "+", "-":
593 for prefix in "", " ", "\t", " \t\t ":
594 ss = prefix + sign + s
595 vv = v
596 if sign == "-" and v is not ValueError:
597 vv = -v
598 try:
599 self.assertEqual(int(ss), vv)
600 except v:
601 pass
602
Walter Dörwald70a6b492004-02-12 17:35:32 +0000603 s = repr(-1-sys.maxint)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000604 x = int(s)
605 self.assertEqual(x+1, -sys.maxint)
606 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000607 # should return long
Thomas Wouters89f507f2006-12-13 04:49:30 +0000608 self.assertEqual(int(s[1:]), sys.maxint+1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000609
610 # should return long
611 x = int(1e100)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000612 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000613 x = int(-1e100)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000614 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000615
616
617 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
618 # Worked by accident in Windows release build, but failed in debug build.
619 # Failed in all Linux builds.
620 x = -1-sys.maxint
621 self.assertEqual(x >> 1, x//2)
622
623 self.assertRaises(ValueError, int, '123\0')
624 self.assertRaises(ValueError, int, '53', 40)
625
Thomas Wouters89f507f2006-12-13 04:49:30 +0000626 # SF bug 1545497: embedded NULs were not detected with
627 # explicit base
628 self.assertRaises(ValueError, int, '123\0', 10)
629 self.assertRaises(ValueError, int, '123\x00 245', 20)
630
Walter Dörwald919497e2003-01-19 16:23:59 +0000631 x = int('1' * 600)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000632 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000633
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000634 x = int(chr(0x661) * 600)
635 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000636
637 self.assertRaises(TypeError, int, 1, 12)
638
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000639 # tests with base 0
640 self.assertRaises(ValueError, int, ' 0123 ', 0) # old octal syntax
641 self.assertEqual(int('000', 0), 0)
642 self.assertEqual(int('0o123', 0), 83)
643 self.assertEqual(int('0x123', 0), 291)
644 self.assertEqual(int('0b100', 0), 4)
645 self.assertEqual(int(' 0O123 ', 0), 83)
646 self.assertEqual(int(' 0X123 ', 0), 291)
647 self.assertEqual(int(' 0B100 ', 0), 4)
648
649 # without base still base 10
650 self.assertEqual(int('0123'), 123)
651 self.assertEqual(int('0123', 10), 123)
652
653 # tests with prefix and base != 0
Neal Norwitz5898fa22005-11-22 05:17:40 +0000654 self.assertEqual(int('0x123', 16), 291)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000655 self.assertEqual(int('0o123', 8), 83)
656 self.assertEqual(int('0b100', 2), 4)
657 self.assertEqual(int('0X123', 16), 291)
658 self.assertEqual(int('0O123', 8), 83)
659 self.assertEqual(int('0B100', 2), 4)
Walter Dörwald919497e2003-01-19 16:23:59 +0000660
Thomas Wouters477c8d52006-05-27 19:21:47 +0000661 # SF bug 1334662: int(string, base) wrong answers
662 # Various representations of 2**32 evaluated to 0
663 # rather than 2**32 in previous versions
664
Guido van Rossume2a383d2007-01-15 16:59:06 +0000665 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296)
666 self.assertEqual(int('102002022201221111211', 3), 4294967296)
667 self.assertEqual(int('10000000000000000', 4), 4294967296)
668 self.assertEqual(int('32244002423141', 5), 4294967296)
669 self.assertEqual(int('1550104015504', 6), 4294967296)
670 self.assertEqual(int('211301422354', 7), 4294967296)
671 self.assertEqual(int('40000000000', 8), 4294967296)
672 self.assertEqual(int('12068657454', 9), 4294967296)
673 self.assertEqual(int('4294967296', 10), 4294967296)
674 self.assertEqual(int('1904440554', 11), 4294967296)
675 self.assertEqual(int('9ba461594', 12), 4294967296)
676 self.assertEqual(int('535a79889', 13), 4294967296)
677 self.assertEqual(int('2ca5b7464', 14), 4294967296)
678 self.assertEqual(int('1a20dcd81', 15), 4294967296)
679 self.assertEqual(int('100000000', 16), 4294967296)
680 self.assertEqual(int('a7ffda91', 17), 4294967296)
681 self.assertEqual(int('704he7g4', 18), 4294967296)
682 self.assertEqual(int('4f5aff66', 19), 4294967296)
683 self.assertEqual(int('3723ai4g', 20), 4294967296)
684 self.assertEqual(int('281d55i4', 21), 4294967296)
685 self.assertEqual(int('1fj8b184', 22), 4294967296)
686 self.assertEqual(int('1606k7ic', 23), 4294967296)
687 self.assertEqual(int('mb994ag', 24), 4294967296)
688 self.assertEqual(int('hek2mgl', 25), 4294967296)
689 self.assertEqual(int('dnchbnm', 26), 4294967296)
690 self.assertEqual(int('b28jpdm', 27), 4294967296)
691 self.assertEqual(int('8pfgih4', 28), 4294967296)
692 self.assertEqual(int('76beigg', 29), 4294967296)
693 self.assertEqual(int('5qmcpqg', 30), 4294967296)
694 self.assertEqual(int('4q0jto4', 31), 4294967296)
695 self.assertEqual(int('4000000', 32), 4294967296)
696 self.assertEqual(int('3aokq94', 33), 4294967296)
697 self.assertEqual(int('2qhxjli', 34), 4294967296)
698 self.assertEqual(int('2br45qb', 35), 4294967296)
699 self.assertEqual(int('1z141z4', 36), 4294967296)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000700
701 # SF bug 1334662: int(string, base) wrong answers
702 # Checks for proper evaluation of 2**32 + 1
Guido van Rossume2a383d2007-01-15 16:59:06 +0000703 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297)
704 self.assertEqual(int('102002022201221111212', 3), 4294967297)
705 self.assertEqual(int('10000000000000001', 4), 4294967297)
706 self.assertEqual(int('32244002423142', 5), 4294967297)
707 self.assertEqual(int('1550104015505', 6), 4294967297)
708 self.assertEqual(int('211301422355', 7), 4294967297)
709 self.assertEqual(int('40000000001', 8), 4294967297)
710 self.assertEqual(int('12068657455', 9), 4294967297)
711 self.assertEqual(int('4294967297', 10), 4294967297)
712 self.assertEqual(int('1904440555', 11), 4294967297)
713 self.assertEqual(int('9ba461595', 12), 4294967297)
714 self.assertEqual(int('535a7988a', 13), 4294967297)
715 self.assertEqual(int('2ca5b7465', 14), 4294967297)
716 self.assertEqual(int('1a20dcd82', 15), 4294967297)
717 self.assertEqual(int('100000001', 16), 4294967297)
718 self.assertEqual(int('a7ffda92', 17), 4294967297)
719 self.assertEqual(int('704he7g5', 18), 4294967297)
720 self.assertEqual(int('4f5aff67', 19), 4294967297)
721 self.assertEqual(int('3723ai4h', 20), 4294967297)
722 self.assertEqual(int('281d55i5', 21), 4294967297)
723 self.assertEqual(int('1fj8b185', 22), 4294967297)
724 self.assertEqual(int('1606k7id', 23), 4294967297)
725 self.assertEqual(int('mb994ah', 24), 4294967297)
726 self.assertEqual(int('hek2mgm', 25), 4294967297)
727 self.assertEqual(int('dnchbnn', 26), 4294967297)
728 self.assertEqual(int('b28jpdn', 27), 4294967297)
729 self.assertEqual(int('8pfgih5', 28), 4294967297)
730 self.assertEqual(int('76beigh', 29), 4294967297)
731 self.assertEqual(int('5qmcpqh', 30), 4294967297)
732 self.assertEqual(int('4q0jto5', 31), 4294967297)
733 self.assertEqual(int('4000001', 32), 4294967297)
734 self.assertEqual(int('3aokq95', 33), 4294967297)
735 self.assertEqual(int('2qhxjlj', 34), 4294967297)
736 self.assertEqual(int('2br45qc', 35), 4294967297)
737 self.assertEqual(int('1z141z5', 36), 4294967297)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000738
Brett Cannonc3647ac2005-04-26 03:45:26 +0000739 def test_intconversion(self):
740 # Test __int__()
741 class Foo0:
742 def __int__(self):
743 return 42
744
745 class Foo1(object):
746 def __int__(self):
747 return 42
748
749 class Foo2(int):
750 def __int__(self):
751 return 42
752
753 class Foo3(int):
754 def __int__(self):
755 return self
756
757 class Foo4(int):
758 def __int__(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000759 return 42
Brett Cannonc3647ac2005-04-26 03:45:26 +0000760
761 class Foo5(int):
762 def __int__(self):
763 return 42.
764
765 self.assertEqual(int(Foo0()), 42)
766 self.assertEqual(int(Foo1()), 42)
767 self.assertEqual(int(Foo2()), 42)
768 self.assertEqual(int(Foo3()), 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000769 self.assertEqual(int(Foo4()), 42)
Brett Cannonc3647ac2005-04-26 03:45:26 +0000770 self.assertRaises(TypeError, int, Foo5())
771
Walter Dörwald919497e2003-01-19 16:23:59 +0000772 def test_iter(self):
773 self.assertRaises(TypeError, iter)
774 self.assertRaises(TypeError, iter, 42, 42)
775 lists = [("1", "2"), ["1", "2"], "12"]
Walter Dörwald919497e2003-01-19 16:23:59 +0000776 for l in lists:
777 i = iter(l)
Georg Brandla18af4e2007-04-21 15:47:16 +0000778 self.assertEqual(next(i), '1')
779 self.assertEqual(next(i), '2')
780 self.assertRaises(StopIteration, next, i)
Walter Dörwald919497e2003-01-19 16:23:59 +0000781
782 def test_isinstance(self):
783 class C:
784 pass
785 class D(C):
786 pass
787 class E:
788 pass
789 c = C()
790 d = D()
791 e = E()
792 self.assert_(isinstance(c, C))
793 self.assert_(isinstance(d, C))
794 self.assert_(not isinstance(e, C))
795 self.assert_(not isinstance(c, D))
796 self.assert_(not isinstance('foo', E))
797 self.assertRaises(TypeError, isinstance, E, 'foo')
798 self.assertRaises(TypeError, isinstance)
799
800 def test_issubclass(self):
801 class C:
802 pass
803 class D(C):
804 pass
805 class E:
806 pass
807 c = C()
808 d = D()
809 e = E()
810 self.assert_(issubclass(D, C))
811 self.assert_(issubclass(C, C))
812 self.assert_(not issubclass(C, D))
813 self.assertRaises(TypeError, issubclass, 'foo', E)
814 self.assertRaises(TypeError, issubclass, E, 'foo')
815 self.assertRaises(TypeError, issubclass)
816
817 def test_len(self):
818 self.assertEqual(len('123'), 3)
819 self.assertEqual(len(()), 0)
820 self.assertEqual(len((1, 2, 3, 4)), 4)
821 self.assertEqual(len([1, 2, 3, 4]), 4)
822 self.assertEqual(len({}), 0)
823 self.assertEqual(len({'a':1, 'b': 2}), 2)
824 class BadSeq:
825 def __len__(self):
826 raise ValueError
827 self.assertRaises(ValueError, len, BadSeq())
828
829 def test_list(self):
830 self.assertEqual(list([]), [])
831 l0_3 = [0, 1, 2, 3]
832 l0_3_bis = list(l0_3)
833 self.assertEqual(l0_3, l0_3_bis)
834 self.assert_(l0_3 is not l0_3_bis)
835 self.assertEqual(list(()), [])
836 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
837 self.assertEqual(list(''), [])
838 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
839
840 if sys.maxint == 0x7fffffff:
841 # This test can currently only work on 32-bit machines.
842 # XXX If/when PySequence_Length() returns a ssize_t, it should be
843 # XXX re-enabled.
844 # Verify clearing of bug #556025.
845 # This assumes that the max data size (sys.maxint) == max
846 # address size this also assumes that the address size is at
847 # least 4 bytes with 8 byte addresses, the bug is not well
848 # tested
849 #
850 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
851 # earlier due to a newlib bug. See the following mailing list
852 # thread for the details:
853
854 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
Guido van Rossum805365e2007-05-07 22:24:25 +0000855 self.assertRaises(MemoryError, list, range(sys.maxint // 2))
Walter Dörwald919497e2003-01-19 16:23:59 +0000856
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000857 # This code used to segfault in Py2.4a3
858 x = []
859 x.extend(-y for y in x)
860 self.assertEqual(x, [])
861
Walter Dörwald919497e2003-01-19 16:23:59 +0000862 def test_long(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000863 self.assertEqual(int(314), 314)
864 self.assertEqual(int(3.14), 3)
865 self.assertEqual(int(314), 314)
Walter Dörwald919497e2003-01-19 16:23:59 +0000866 # Check that conversion from float truncates towards zero
Guido van Rossume2a383d2007-01-15 16:59:06 +0000867 self.assertEqual(int(-3.14), -3)
868 self.assertEqual(int(3.9), 3)
869 self.assertEqual(int(-3.9), -3)
870 self.assertEqual(int(3.5), 3)
871 self.assertEqual(int(-3.5), -3)
872 self.assertEqual(int("-3"), -3)
Walter Dörwald919497e2003-01-19 16:23:59 +0000873 # Different base:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000874 self.assertEqual(int("10",16), 16)
Walter Dörwald919497e2003-01-19 16:23:59 +0000875 # Check conversions from string (same test set as for int(), and then some)
876 LL = [
Guido van Rossume2a383d2007-01-15 16:59:06 +0000877 ('1' + '0'*20, 10**20),
878 ('1' + '0'*100, 10**100)
Walter Dörwald919497e2003-01-19 16:23:59 +0000879 ]
Walter Dörwald1f5947b2007-05-22 16:52:54 +0000880 for s, v in LL:
Walter Dörwald919497e2003-01-19 16:23:59 +0000881 for sign in "", "+", "-":
882 for prefix in "", " ", "\t", " \t\t ":
883 ss = prefix + sign + s
884 vv = v
885 if sign == "-" and v is not ValueError:
886 vv = -v
887 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000888 self.assertEqual(int(ss), int(vv))
Walter Dörwald919497e2003-01-19 16:23:59 +0000889 except v:
890 pass
891
Guido van Rossume2a383d2007-01-15 16:59:06 +0000892 self.assertRaises(ValueError, int, '123\0')
893 self.assertRaises(ValueError, int, '53', 40)
894 self.assertRaises(TypeError, int, 1, 12)
Walter Dörwald919497e2003-01-19 16:23:59 +0000895
Guido van Rossumd8faa362007-04-27 19:54:29 +0000896 # SF patch #1638879: embedded NULs were not detected with
897 # explicit base
898 self.assertRaises(ValueError, int, '123\0', 10)
899 self.assertRaises(ValueError, int, '123\x00 245', 20)
900
Guido van Rossume2a383d2007-01-15 16:59:06 +0000901 self.assertEqual(int('100000000000000000000000000000000', 2),
Thomas Wouters477c8d52006-05-27 19:21:47 +0000902 4294967296)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000903 self.assertEqual(int('102002022201221111211', 3), 4294967296)
904 self.assertEqual(int('10000000000000000', 4), 4294967296)
905 self.assertEqual(int('32244002423141', 5), 4294967296)
906 self.assertEqual(int('1550104015504', 6), 4294967296)
907 self.assertEqual(int('211301422354', 7), 4294967296)
908 self.assertEqual(int('40000000000', 8), 4294967296)
909 self.assertEqual(int('12068657454', 9), 4294967296)
910 self.assertEqual(int('4294967296', 10), 4294967296)
911 self.assertEqual(int('1904440554', 11), 4294967296)
912 self.assertEqual(int('9ba461594', 12), 4294967296)
913 self.assertEqual(int('535a79889', 13), 4294967296)
914 self.assertEqual(int('2ca5b7464', 14), 4294967296)
915 self.assertEqual(int('1a20dcd81', 15), 4294967296)
916 self.assertEqual(int('100000000', 16), 4294967296)
917 self.assertEqual(int('a7ffda91', 17), 4294967296)
918 self.assertEqual(int('704he7g4', 18), 4294967296)
919 self.assertEqual(int('4f5aff66', 19), 4294967296)
920 self.assertEqual(int('3723ai4g', 20), 4294967296)
921 self.assertEqual(int('281d55i4', 21), 4294967296)
922 self.assertEqual(int('1fj8b184', 22), 4294967296)
923 self.assertEqual(int('1606k7ic', 23), 4294967296)
924 self.assertEqual(int('mb994ag', 24), 4294967296)
925 self.assertEqual(int('hek2mgl', 25), 4294967296)
926 self.assertEqual(int('dnchbnm', 26), 4294967296)
927 self.assertEqual(int('b28jpdm', 27), 4294967296)
928 self.assertEqual(int('8pfgih4', 28), 4294967296)
929 self.assertEqual(int('76beigg', 29), 4294967296)
930 self.assertEqual(int('5qmcpqg', 30), 4294967296)
931 self.assertEqual(int('4q0jto4', 31), 4294967296)
932 self.assertEqual(int('4000000', 32), 4294967296)
933 self.assertEqual(int('3aokq94', 33), 4294967296)
934 self.assertEqual(int('2qhxjli', 34), 4294967296)
935 self.assertEqual(int('2br45qb', 35), 4294967296)
936 self.assertEqual(int('1z141z4', 36), 4294967296)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000937
Guido van Rossume2a383d2007-01-15 16:59:06 +0000938 self.assertEqual(int('100000000000000000000000000000001', 2),
Thomas Wouters477c8d52006-05-27 19:21:47 +0000939 4294967297)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000940 self.assertEqual(int('102002022201221111212', 3), 4294967297)
941 self.assertEqual(int('10000000000000001', 4), 4294967297)
942 self.assertEqual(int('32244002423142', 5), 4294967297)
943 self.assertEqual(int('1550104015505', 6), 4294967297)
944 self.assertEqual(int('211301422355', 7), 4294967297)
945 self.assertEqual(int('40000000001', 8), 4294967297)
946 self.assertEqual(int('12068657455', 9), 4294967297)
947 self.assertEqual(int('4294967297', 10), 4294967297)
948 self.assertEqual(int('1904440555', 11), 4294967297)
949 self.assertEqual(int('9ba461595', 12), 4294967297)
950 self.assertEqual(int('535a7988a', 13), 4294967297)
951 self.assertEqual(int('2ca5b7465', 14), 4294967297)
952 self.assertEqual(int('1a20dcd82', 15), 4294967297)
953 self.assertEqual(int('100000001', 16), 4294967297)
954 self.assertEqual(int('a7ffda92', 17), 4294967297)
955 self.assertEqual(int('704he7g5', 18), 4294967297)
956 self.assertEqual(int('4f5aff67', 19), 4294967297)
957 self.assertEqual(int('3723ai4h', 20), 4294967297)
958 self.assertEqual(int('281d55i5', 21), 4294967297)
959 self.assertEqual(int('1fj8b185', 22), 4294967297)
960 self.assertEqual(int('1606k7id', 23), 4294967297)
961 self.assertEqual(int('mb994ah', 24), 4294967297)
962 self.assertEqual(int('hek2mgm', 25), 4294967297)
963 self.assertEqual(int('dnchbnn', 26), 4294967297)
964 self.assertEqual(int('b28jpdn', 27), 4294967297)
965 self.assertEqual(int('8pfgih5', 28), 4294967297)
966 self.assertEqual(int('76beigh', 29), 4294967297)
967 self.assertEqual(int('5qmcpqh', 30), 4294967297)
968 self.assertEqual(int('4q0jto5', 31), 4294967297)
969 self.assertEqual(int('4000001', 32), 4294967297)
970 self.assertEqual(int('3aokq95', 33), 4294967297)
971 self.assertEqual(int('2qhxjlj', 34), 4294967297)
972 self.assertEqual(int('2br45qc', 35), 4294967297)
973 self.assertEqual(int('1z141z5', 36), 4294967297)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000974
975
Brett Cannonc3647ac2005-04-26 03:45:26 +0000976 def test_longconversion(self):
977 # Test __long__()
978 class Foo0:
979 def __long__(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000980 return 42
Brett Cannonc3647ac2005-04-26 03:45:26 +0000981
982 class Foo1(object):
983 def __long__(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000984 return 42
Brett Cannonc3647ac2005-04-26 03:45:26 +0000985
Guido van Rossume2a383d2007-01-15 16:59:06 +0000986 class Foo2(int):
Brett Cannonc3647ac2005-04-26 03:45:26 +0000987 def __long__(self):
988 return 42
989
Guido van Rossume2a383d2007-01-15 16:59:06 +0000990 class Foo3(int):
991 def __long__(self):
992 return self
993
994 class Foo4(int):
995 def __long__(self):
996 return 42
997
998 class Foo5(int):
Brett Cannonc3647ac2005-04-26 03:45:26 +0000999 def __long__(self):
1000 return 42.
1001
Guido van Rossume2a383d2007-01-15 16:59:06 +00001002 self.assertEqual(int(Foo0()), 42)
1003 self.assertEqual(int(Foo1()), 42)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001004 # XXX invokes __int__ now
Guido van Rossumddefaf32007-01-14 03:31:43 +00001005 # self.assertEqual(long(Foo2()), 42L)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001006 self.assertEqual(int(Foo3()), 0)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001007 # XXX likewise
Guido van Rossumddefaf32007-01-14 03:31:43 +00001008 # self.assertEqual(long(Foo4()), 42)
1009 # self.assertRaises(TypeError, long, Foo5())
Brett Cannonc3647ac2005-04-26 03:45:26 +00001010
Walter Dörwald919497e2003-01-19 16:23:59 +00001011 def test_map(self):
1012 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001013 list(map(None, 'hello')),
1014 [('h',), ('e',), ('l',), ('l',), ('o',)]
Walter Dörwald919497e2003-01-19 16:23:59 +00001015 )
1016 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001017 list(map(None, 'abcd', 'efg')),
1018 [('a', 'e'), ('b', 'f'), ('c', 'g')]
Walter Dörwald919497e2003-01-19 16:23:59 +00001019 )
1020 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001021 list(map(None, range(3))),
1022 [(0,), (1,), (2,)]
Walter Dörwald919497e2003-01-19 16:23:59 +00001023 )
1024 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001025 list(map(lambda x: x*x, range(1,4))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001026 [1, 4, 9]
1027 )
1028 try:
1029 from math import sqrt
1030 except ImportError:
1031 def sqrt(x):
1032 return pow(x, 0.5)
1033 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001034 list(map(lambda x: list(map(sqrt, x)), [[16, 4], [81, 9]])),
Walter Dörwald919497e2003-01-19 16:23:59 +00001035 [[4.0, 2.0], [9.0, 3.0]]
1036 )
1037 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001038 list(map(lambda x, y: x+y, [1,3,2], [9,1,4])),
Walter Dörwald919497e2003-01-19 16:23:59 +00001039 [10, 4, 6]
1040 )
1041
1042 def plus(*v):
1043 accu = 0
1044 for i in v: accu = accu + i
1045 return accu
1046 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001047 list(map(plus, [1, 3, 7])),
Walter Dörwald919497e2003-01-19 16:23:59 +00001048 [1, 3, 7]
1049 )
1050 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001051 list(map(plus, [1, 3, 7], [4, 9, 2])),
Walter Dörwald919497e2003-01-19 16:23:59 +00001052 [1+4, 3+9, 7+2]
1053 )
1054 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001055 list(map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])),
Walter Dörwald919497e2003-01-19 16:23:59 +00001056 [1+4+1, 3+9+1, 7+2+0]
1057 )
1058 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001059 list(map(None, Squares(10))),
1060 [(0,), (1,), (4,), (9,), (16,), (25,), (36,), (49,), (64,), (81,)]
1061 )
1062 self.assertEqual(
1063 list(map(int, Squares(10))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001064 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1065 )
1066 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001067 list(map(None, Squares(3), Squares(2))),
1068 [(0,0), (1,1)]
Walter Dörwald919497e2003-01-19 16:23:59 +00001069 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001070 def Max(a, b):
1071 if a is None:
1072 return b
1073 if b is None:
1074 return a
1075 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +00001076 self.assertEqual(
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001077 list(map(Max, Squares(3), Squares(2))),
1078 [0, 1]
Walter Dörwald919497e2003-01-19 16:23:59 +00001079 )
1080 self.assertRaises(TypeError, map)
1081 self.assertRaises(TypeError, map, lambda x: x, 42)
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001082 self.assertEqual(list(map(None, [42])), [(42,)])
Walter Dörwald919497e2003-01-19 16:23:59 +00001083 class BadSeq:
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001084 def __iter__(self):
Walter Dörwald919497e2003-01-19 16:23:59 +00001085 raise ValueError
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001086 yield None
1087 self.assertRaises(ValueError, list, map(lambda x: x, BadSeq()))
Neal Norwitzfcf44352005-11-27 20:37:43 +00001088 def badfunc(x):
1089 raise RuntimeError
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001090 self.assertRaises(RuntimeError, list, map(badfunc, range(5)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001091
1092 def test_max(self):
1093 self.assertEqual(max('123123'), '3')
1094 self.assertEqual(max(1, 2, 3), 3)
1095 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1096 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1097
Guido van Rossume2a383d2007-01-15 16:59:06 +00001098 self.assertEqual(max(1, 2, 3.0), 3.0)
1099 self.assertEqual(max(1, 2.0, 3), 3)
1100 self.assertEqual(max(1.0, 2, 3), 3)
Walter Dörwald919497e2003-01-19 16:23:59 +00001101
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001102 for stmt in (
1103 "max(key=int)", # no args
1104 "max(1, key=int)", # single arg not iterable
1105 "max(1, 2, keystone=int)", # wrong keyword
1106 "max(1, 2, key=int, abc=int)", # two many keywords
1107 "max(1, 2, key=1)", # keyfunc is not callable
1108 ):
Tim Peters7f061872004-12-07 21:17:46 +00001109 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001110 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001111 except TypeError:
1112 pass
1113 else:
1114 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001115
1116 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1117 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1118 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1119
1120 data = [random.randrange(200) for i in range(100)]
1121 keys = dict((elem, random.randrange(50)) for elem in data)
1122 f = keys.__getitem__
1123 self.assertEqual(max(data, key=f),
1124 sorted(reversed(data), key=f)[-1])
1125
Walter Dörwald919497e2003-01-19 16:23:59 +00001126 def test_min(self):
1127 self.assertEqual(min('123123'), '1')
1128 self.assertEqual(min(1, 2, 3), 1)
1129 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1130 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1131
Guido van Rossume2a383d2007-01-15 16:59:06 +00001132 self.assertEqual(min(1, 2, 3.0), 1)
1133 self.assertEqual(min(1, 2.0, 3), 1)
1134 self.assertEqual(min(1.0, 2, 3), 1.0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001135
1136 self.assertRaises(TypeError, min)
1137 self.assertRaises(TypeError, min, 42)
1138 self.assertRaises(ValueError, min, ())
1139 class BadSeq:
1140 def __getitem__(self, index):
1141 raise ValueError
1142 self.assertRaises(ValueError, min, BadSeq())
1143 class BadNumber:
1144 def __cmp__(self, other):
1145 raise ValueError
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001146 self.assertRaises(TypeError, min, (42, BadNumber()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001147
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001148 for stmt in (
1149 "min(key=int)", # no args
1150 "min(1, key=int)", # single arg not iterable
1151 "min(1, 2, keystone=int)", # wrong keyword
1152 "min(1, 2, key=int, abc=int)", # two many keywords
1153 "min(1, 2, key=1)", # keyfunc is not callable
1154 ):
Tim Peters7f061872004-12-07 21:17:46 +00001155 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00001156 exec(stmt, globals())
Tim Peters7f061872004-12-07 21:17:46 +00001157 except TypeError:
1158 pass
1159 else:
1160 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001161
1162 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1163 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1164 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1165
1166 data = [random.randrange(200) for i in range(100)]
1167 keys = dict((elem, random.randrange(50)) for elem in data)
1168 f = keys.__getitem__
1169 self.assertEqual(min(data, key=f),
1170 sorted(data, key=f)[0])
1171
Georg Brandla18af4e2007-04-21 15:47:16 +00001172 def test_next(self):
1173 it = iter(range(2))
1174 self.assertEqual(next(it), 0)
1175 self.assertEqual(next(it), 1)
1176 self.assertRaises(StopIteration, next, it)
1177 self.assertRaises(StopIteration, next, it)
1178 self.assertEquals(next(it, 42), 42)
1179
1180 class Iter(object):
1181 def __iter__(self):
1182 return self
1183 def __next__(self):
1184 raise StopIteration
1185
1186 it = iter(Iter())
1187 self.assertEquals(next(it, 42), 42)
1188 self.assertRaises(StopIteration, next, it)
1189
1190 def gen():
1191 yield 1
1192 return
1193
1194 it = gen()
1195 self.assertEquals(next(it), 1)
1196 self.assertRaises(StopIteration, next, it)
1197 self.assertEquals(next(it, 42), 42)
1198
Walter Dörwald919497e2003-01-19 16:23:59 +00001199 def test_oct(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001200 self.assertEqual(oct(100), '0o144')
1201 self.assertEqual(oct(100), '0o144')
1202 self.assertEqual(oct(-100), '-0o144')
1203 self.assertEqual(oct(-100), '-0o144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001204 self.assertRaises(TypeError, oct, ())
1205
1206 def write_testfile(self):
Guido van Rossuma88a0332007-02-26 16:59:55 +00001207 # NB the first 4 lines are also used to test input, below
Walter Dörwald919497e2003-01-19 16:23:59 +00001208 fp = open(TESTFN, 'w')
1209 try:
1210 fp.write('1+1\n')
1211 fp.write('1+1\n')
1212 fp.write('The quick brown fox jumps over the lazy dog')
1213 fp.write('.\n')
1214 fp.write('Dear John\n')
1215 fp.write('XXX'*100)
1216 fp.write('YYY'*100)
1217 finally:
1218 fp.close()
1219
1220 def test_open(self):
1221 self.write_testfile()
1222 fp = open(TESTFN, 'r')
1223 try:
1224 self.assertEqual(fp.readline(4), '1+1\n')
1225 self.assertEqual(fp.readline(4), '1+1\n')
1226 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1227 self.assertEqual(fp.readline(4), 'Dear')
1228 self.assertEqual(fp.readline(100), ' John\n')
1229 self.assertEqual(fp.read(300), 'XXX'*100)
1230 self.assertEqual(fp.read(1000), 'YYY'*100)
1231 finally:
1232 fp.close()
1233 unlink(TESTFN)
1234
1235 def test_ord(self):
1236 self.assertEqual(ord(' '), 32)
1237 self.assertEqual(ord('A'), 65)
1238 self.assertEqual(ord('a'), 97)
Guido van Rossumf9e91c92007-05-08 21:05:48 +00001239 self.assertEqual(ord('\x80'), 128)
1240 self.assertEqual(ord('\xff'), 255)
1241
1242 self.assertEqual(ord(b' '), 32)
1243 self.assertEqual(ord(b'A'), 65)
1244 self.assertEqual(ord(b'a'), 97)
1245 self.assertEqual(ord(b'\x80'), 128)
1246 self.assertEqual(ord(b'\xff'), 255)
1247
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001248 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode)
Walter Dörwald919497e2003-01-19 16:23:59 +00001249 self.assertRaises(TypeError, ord, 42)
Walter Dörwald919497e2003-01-19 16:23:59 +00001250
Guido van Rossum8ac004e2007-07-15 13:00:05 +00001251 self.assertEqual(ord(chr(0x10FFFF)), 0x10FFFF)
1252 self.assertEqual(ord("\U0000FFFF"), 0x0000FFFF)
1253 self.assertEqual(ord("\U00010000"), 0x00010000)
1254 self.assertEqual(ord("\U00010001"), 0x00010001)
1255 self.assertEqual(ord("\U000FFFFE"), 0x000FFFFE)
1256 self.assertEqual(ord("\U000FFFFF"), 0x000FFFFF)
1257 self.assertEqual(ord("\U00100000"), 0x00100000)
1258 self.assertEqual(ord("\U00100001"), 0x00100001)
1259 self.assertEqual(ord("\U0010FFFE"), 0x0010FFFE)
1260 self.assertEqual(ord("\U0010FFFF"), 0x0010FFFF)
1261
Walter Dörwald919497e2003-01-19 16:23:59 +00001262 def test_pow(self):
1263 self.assertEqual(pow(0,0), 1)
1264 self.assertEqual(pow(0,1), 0)
1265 self.assertEqual(pow(1,0), 1)
1266 self.assertEqual(pow(1,1), 1)
1267
1268 self.assertEqual(pow(2,0), 1)
1269 self.assertEqual(pow(2,10), 1024)
1270 self.assertEqual(pow(2,20), 1024*1024)
1271 self.assertEqual(pow(2,30), 1024*1024*1024)
1272
1273 self.assertEqual(pow(-2,0), 1)
1274 self.assertEqual(pow(-2,1), -2)
1275 self.assertEqual(pow(-2,2), 4)
1276 self.assertEqual(pow(-2,3), -8)
1277
Guido van Rossume2a383d2007-01-15 16:59:06 +00001278 self.assertEqual(pow(0,0), 1)
1279 self.assertEqual(pow(0,1), 0)
1280 self.assertEqual(pow(1,0), 1)
1281 self.assertEqual(pow(1,1), 1)
Walter Dörwald919497e2003-01-19 16:23:59 +00001282
Guido van Rossume2a383d2007-01-15 16:59:06 +00001283 self.assertEqual(pow(2,0), 1)
1284 self.assertEqual(pow(2,10), 1024)
1285 self.assertEqual(pow(2,20), 1024*1024)
1286 self.assertEqual(pow(2,30), 1024*1024*1024)
Walter Dörwald919497e2003-01-19 16:23:59 +00001287
Guido van Rossume2a383d2007-01-15 16:59:06 +00001288 self.assertEqual(pow(-2,0), 1)
1289 self.assertEqual(pow(-2,1), -2)
1290 self.assertEqual(pow(-2,2), 4)
1291 self.assertEqual(pow(-2,3), -8)
Walter Dörwald919497e2003-01-19 16:23:59 +00001292
1293 self.assertAlmostEqual(pow(0.,0), 1.)
1294 self.assertAlmostEqual(pow(0.,1), 0.)
1295 self.assertAlmostEqual(pow(1.,0), 1.)
1296 self.assertAlmostEqual(pow(1.,1), 1.)
1297
1298 self.assertAlmostEqual(pow(2.,0), 1.)
1299 self.assertAlmostEqual(pow(2.,10), 1024.)
1300 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1301 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1302
1303 self.assertAlmostEqual(pow(-2.,0), 1.)
1304 self.assertAlmostEqual(pow(-2.,1), -2.)
1305 self.assertAlmostEqual(pow(-2.,2), 4.)
1306 self.assertAlmostEqual(pow(-2.,3), -8.)
1307
Guido van Rossume2a383d2007-01-15 16:59:06 +00001308 for x in 2, 2, 2.0:
1309 for y in 10, 10, 10.0:
1310 for z in 1000, 1000, 1000.0:
Walter Dörwald919497e2003-01-19 16:23:59 +00001311 if isinstance(x, float) or \
1312 isinstance(y, float) or \
1313 isinstance(z, float):
1314 self.assertRaises(TypeError, pow, x, y, z)
1315 else:
1316 self.assertAlmostEqual(pow(x, y, z), 24.0)
1317
1318 self.assertRaises(TypeError, pow, -1, -2, 3)
1319 self.assertRaises(ValueError, pow, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001320 self.assertRaises(TypeError, pow, -1, -2, 3)
1321 self.assertRaises(ValueError, pow, 1, 2, 0)
Walter Dörwald919497e2003-01-19 16:23:59 +00001322 self.assertRaises(ValueError, pow, -342.43, 0.234)
1323
1324 self.assertRaises(TypeError, pow)
1325
1326 def test_range(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001327 self.assertEqual(list(range(3)), [0, 1, 2])
1328 self.assertEqual(list(range(1, 5)), [1, 2, 3, 4])
1329 self.assertEqual(list(range(0)), [])
1330 self.assertEqual(list(range(-3)), [])
1331 self.assertEqual(list(range(1, 10, 3)), [1, 4, 7])
1332 #self.assertEqual(list(range(5, -5, -3)), [5, 2, -1, -4])
Walter Dörwald919497e2003-01-19 16:23:59 +00001333
Guido van Rossum805365e2007-05-07 22:24:25 +00001334 """ XXX(nnorwitz):
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001335 # Now test range() with longs
Guido van Rossum805365e2007-05-07 22:24:25 +00001336 self.assertEqual(list(range(-2**100)), [])
1337 self.assertEqual(list(range(0, -2**100)), [])
1338 self.assertEqual(list(range(0, 2**100, -1)), [])
1339 self.assertEqual(list(range(0, 2**100, -1)), [])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001340
Guido van Rossume2a383d2007-01-15 16:59:06 +00001341 a = int(10 * sys.maxint)
1342 b = int(100 * sys.maxint)
1343 c = int(50 * sys.maxint)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001344
Guido van Rossum805365e2007-05-07 22:24:25 +00001345 self.assertEqual(list(range(a, a+2)), [a, a+1])
1346 self.assertEqual(list(range(a+2, a, -1)), [a+2, a+1])
1347 self.assertEqual(list(range(a+4, a, -2)), [a+4, a+2])
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001348
Guido van Rossum805365e2007-05-07 22:24:25 +00001349 seq = list(range(a, b, c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001350 self.assert_(a in seq)
1351 self.assert_(b not in seq)
1352 self.assertEqual(len(seq), 2)
1353
Guido van Rossum805365e2007-05-07 22:24:25 +00001354 seq = list(range(b, a, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001355 self.assert_(b in seq)
1356 self.assert_(a not in seq)
1357 self.assertEqual(len(seq), 2)
1358
Guido van Rossum805365e2007-05-07 22:24:25 +00001359 seq = list(range(-a, -b, -c))
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001360 self.assert_(-a in seq)
1361 self.assert_(-b not in seq)
1362 self.assertEqual(len(seq), 2)
1363
Walter Dörwald919497e2003-01-19 16:23:59 +00001364 self.assertRaises(TypeError, range)
1365 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1366 self.assertRaises(ValueError, range, 1, 2, 0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00001367 self.assertRaises(ValueError, range, a, a + 1, int(0))
Neal Norwitzfcf44352005-11-27 20:37:43 +00001368
1369 class badzero(int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001370 def __eq__(self, other):
Neal Norwitzfcf44352005-11-27 20:37:43 +00001371 raise RuntimeError
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001372 __ne__ = __lt__ = __gt__ = __le__ = __ge__ = __eq__
1373
1374 # XXX This won't (but should!) raise RuntimeError if a is an int...
Neal Norwitzfcf44352005-11-27 20:37:43 +00001375 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Guido van Rossum805365e2007-05-07 22:24:25 +00001376 """
Walter Dörwald919497e2003-01-19 16:23:59 +00001377
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001378 # Reject floats when it would require PyLongs to represent.
1379 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001380 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001381
Walter Dörwald357981e2003-04-15 18:59:28 +00001382 self.assertRaises(TypeError, range, 0, "spam")
1383 self.assertRaises(TypeError, range, 0, 42, "spam")
1384
Guido van Rossum805365e2007-05-07 22:24:25 +00001385 #NEAL self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1386 #NEAL self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1387
1388 self.assertRaises(OverflowError, len, range(0, sys.maxint**10))
Walter Dörwald357981e2003-04-15 18:59:28 +00001389
Guido van Rossuma88a0332007-02-26 16:59:55 +00001390 def test_input(self):
1391 self.write_testfile()
1392 fp = open(TESTFN, 'r')
1393 savestdin = sys.stdin
1394 savestdout = sys.stdout # Eats the echo
1395 try:
1396 sys.stdin = fp
1397 sys.stdout = BitBucket()
1398 self.assertEqual(input(), "1+1")
1399 self.assertEqual(input('testing\n'), "1+1")
1400 self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
1401 self.assertEqual(input('testing\n'), 'Dear John')
1402
1403 # SF 1535165: don't segfault on closed stdin
1404 # sys.stdout must be a regular file for triggering
1405 sys.stdout = savestdout
1406 sys.stdin.close()
1407 self.assertRaises(ValueError, input)
1408
1409 sys.stdout = BitBucket()
Guido van Rossum34d19282007-08-09 01:03:29 +00001410 sys.stdin = io.StringIO("NULL\0")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001411 self.assertRaises(TypeError, input, 42, 42)
Guido van Rossum34d19282007-08-09 01:03:29 +00001412 sys.stdin = io.StringIO(" 'whitespace'")
Guido van Rossuma88a0332007-02-26 16:59:55 +00001413 self.assertEqual(input(), " 'whitespace'")
Guido van Rossum34d19282007-08-09 01:03:29 +00001414 sys.stdin = io.StringIO()
Guido van Rossuma88a0332007-02-26 16:59:55 +00001415 self.assertRaises(EOFError, input)
1416
1417 del sys.stdout
1418 self.assertRaises(RuntimeError, input, 'prompt')
1419 del sys.stdin
1420 self.assertRaises(RuntimeError, input, 'prompt')
1421 finally:
1422 sys.stdin = savestdin
1423 sys.stdout = savestdout
1424 fp.close()
1425 unlink(TESTFN)
1426
Walter Dörwald919497e2003-01-19 16:23:59 +00001427 def test_repr(self):
1428 self.assertEqual(repr(''), '\'\'')
1429 self.assertEqual(repr(0), '0')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001430 self.assertEqual(repr(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001431 self.assertEqual(repr(()), '()')
1432 self.assertEqual(repr([]), '[]')
1433 self.assertEqual(repr({}), '{}')
1434 a = []
1435 a.append(a)
1436 self.assertEqual(repr(a), '[[...]]')
1437 a = {}
1438 a[0] = a
1439 self.assertEqual(repr(a), '{0: {...}}')
1440
1441 def test_round(self):
1442 self.assertEqual(round(0.0), 0.0)
1443 self.assertEqual(round(1.0), 1.0)
1444 self.assertEqual(round(10.0), 10.0)
1445 self.assertEqual(round(1000000000.0), 1000000000.0)
1446 self.assertEqual(round(1e20), 1e20)
1447
1448 self.assertEqual(round(-1.0), -1.0)
1449 self.assertEqual(round(-10.0), -10.0)
1450 self.assertEqual(round(-1000000000.0), -1000000000.0)
1451 self.assertEqual(round(-1e20), -1e20)
1452
1453 self.assertEqual(round(0.1), 0.0)
1454 self.assertEqual(round(1.1), 1.0)
1455 self.assertEqual(round(10.1), 10.0)
1456 self.assertEqual(round(1000000000.1), 1000000000.0)
1457
1458 self.assertEqual(round(-1.1), -1.0)
1459 self.assertEqual(round(-10.1), -10.0)
1460 self.assertEqual(round(-1000000000.1), -1000000000.0)
1461
1462 self.assertEqual(round(0.9), 1.0)
1463 self.assertEqual(round(9.9), 10.0)
1464 self.assertEqual(round(999999999.9), 1000000000.0)
1465
1466 self.assertEqual(round(-0.9), -1.0)
1467 self.assertEqual(round(-9.9), -10.0)
1468 self.assertEqual(round(-999999999.9), -1000000000.0)
1469
1470 self.assertEqual(round(-8.0, -1), -10.0)
1471
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001472 # test new kwargs
1473 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1474
Walter Dörwald919497e2003-01-19 16:23:59 +00001475 self.assertRaises(TypeError, round)
1476
1477 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001478 setattr(sys, 'spam', 1)
1479 self.assertEqual(sys.spam, 1)
1480 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1481 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001482
1483 def test_str(self):
1484 self.assertEqual(str(''), '')
1485 self.assertEqual(str(0), '0')
Guido van Rossume2a383d2007-01-15 16:59:06 +00001486 self.assertEqual(str(0), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001487 self.assertEqual(str(()), '()')
1488 self.assertEqual(str([]), '[]')
1489 self.assertEqual(str({}), '{}')
1490 a = []
1491 a.append(a)
1492 self.assertEqual(str(a), '[[...]]')
1493 a = {}
1494 a[0] = a
1495 self.assertEqual(str(a), '{0: {...}}')
1496
Alex Martellia70b1912003-04-22 08:12:33 +00001497 def test_sum(self):
1498 self.assertEqual(sum([]), 0)
Guido van Rossum805365e2007-05-07 22:24:25 +00001499 self.assertEqual(sum(list(range(2,8))), 27)
1500 self.assertEqual(sum(iter(list(range(2,8)))), 27)
Alex Martellia70b1912003-04-22 08:12:33 +00001501 self.assertEqual(sum(Squares(10)), 285)
1502 self.assertEqual(sum(iter(Squares(10))), 285)
1503 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1504
1505 self.assertRaises(TypeError, sum)
1506 self.assertRaises(TypeError, sum, 42)
1507 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1508 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1509 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1510 self.assertRaises(TypeError, sum, [{2:3}])
1511 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1512
1513 class BadSeq:
1514 def __getitem__(self, index):
1515 raise ValueError
1516 self.assertRaises(ValueError, sum, BadSeq())
1517
Walter Dörwald919497e2003-01-19 16:23:59 +00001518 def test_tuple(self):
1519 self.assertEqual(tuple(()), ())
1520 t0_3 = (0, 1, 2, 3)
1521 t0_3_bis = tuple(t0_3)
1522 self.assert_(t0_3 is t0_3_bis)
1523 self.assertEqual(tuple([]), ())
1524 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1525 self.assertEqual(tuple(''), ())
1526 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1527
1528 def test_type(self):
1529 self.assertEqual(type(''), type('123'))
1530 self.assertNotEqual(type(''), type(()))
1531
Guido van Rossumfee7b932005-01-16 00:21:28 +00001532 # We don't want self in vars(), so these are static methods
1533
1534 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001535 def get_vars_f0():
1536 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001537
Guido van Rossumfee7b932005-01-16 00:21:28 +00001538 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001539 def get_vars_f2():
1540 BuiltinTest.get_vars_f0()
1541 a = 1
1542 b = 2
1543 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001544
1545 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001546 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001547 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001548 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001549 self.assertEqual(self.get_vars_f0(), {})
1550 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1551 self.assertRaises(TypeError, vars, 42, 42)
1552 self.assertRaises(TypeError, vars, 42)
1553
1554 def test_zip(self):
1555 a = (1, 2, 3)
1556 b = (4, 5, 6)
1557 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001558 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001559 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001560 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001561 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001562 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001563 class I:
1564 def __getitem__(self, i):
1565 if i < 0 or i > 2: raise IndexError
1566 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001567 self.assertEqual(list(zip(a, I())), t)
1568 self.assertEqual(list(zip()), [])
1569 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001570 self.assertRaises(TypeError, zip, None)
1571 class G:
1572 pass
1573 self.assertRaises(TypeError, zip, a, G())
1574
1575 # Make sure zip doesn't try to allocate a billion elements for the
1576 # result list when one of its arguments doesn't say how long it is.
1577 # A MemoryError is the most likely failure mode.
1578 class SequenceWithoutALength:
1579 def __getitem__(self, i):
1580 if i == 5:
1581 raise IndexError
1582 else:
1583 return i
1584 self.assertEqual(
Guido van Rossum805365e2007-05-07 22:24:25 +00001585 list(zip(SequenceWithoutALength(), range(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001586 list(enumerate(range(5)))
1587 )
1588
1589 class BadSeq:
1590 def __getitem__(self, i):
1591 if i == 5:
1592 raise ValueError
1593 else:
1594 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001595 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001596
Raymond Hettinger64958a12003-12-17 20:43:33 +00001597class TestSorted(unittest.TestCase):
1598
1599 def test_basic(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001600 data = list(range(100))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001601 copy = data[:]
1602 random.shuffle(copy)
1603 self.assertEqual(data, sorted(copy))
1604 self.assertNotEqual(data, copy)
1605
1606 data.reverse()
1607 random.shuffle(copy)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001608 self.assertEqual(data, sorted(copy, cmp=lambda x, y: (x < y) - (x > y)))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001609 self.assertNotEqual(data, copy)
1610 random.shuffle(copy)
1611 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1612 self.assertNotEqual(data, copy)
1613 random.shuffle(copy)
1614 self.assertEqual(data, sorted(copy, reverse=1))
1615 self.assertNotEqual(data, copy)
1616
1617 def test_inputtypes(self):
1618 s = 'abracadabra'
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001619 types = [list, tuple, str]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001620 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001621 self.assertEqual(sorted(s), sorted(T(s)))
1622
Walter Dörwald1f5947b2007-05-22 16:52:54 +00001623 s = ''.join(set(s)) # unique letters only
1624 types = [str, set, frozenset, list, tuple, dict.fromkeys]
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001625 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001626 self.assertEqual(sorted(s), sorted(T(s)))
1627
1628 def test_baddecorator(self):
1629 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1630 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1631
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001632def test_main(verbose=None):
1633 test_classes = (BuiltinTest, TestSorted)
1634
1635 run_unittest(*test_classes)
1636
1637 # verify reference counting
1638 if verbose and hasattr(sys, "gettotalrefcount"):
1639 import gc
1640 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001641 for i in range(len(counts)):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001642 run_unittest(*test_classes)
1643 gc.collect()
1644 counts[i] = sys.gettotalrefcount()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001645 print(counts)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001646
Walter Dörwald919497e2003-01-19 16:23:59 +00001647
1648if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001649 test_main(verbose=True)