blob: dbc86e281aa855660db361f9b63bbc7a7d47e0ae [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
Georg Brandlde9b6242006-04-30 11:13:56 +00004from test.test_support import fcmp, have_unicode, TESTFN, unlink, \
5 run_unittest, run_with_locale
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00006from operator import neg
Guido van Rossum3bead091992-01-27 17:00:37 +00007
Mark Dickinsond058cd22008-02-10 21:29:51 +00008import sys, warnings, cStringIO, random, fractions, UserDict
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
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +000014# count the number of test runs.
15# used to skip running test_execfile() multiple times
16numruns = 0
17
Walter Dörwald919497e2003-01-19 16:23:59 +000018class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000019
Walter Dörwald919497e2003-01-19 16:23:59 +000020 def __init__(self, max):
21 self.max = max
22 self.sofar = []
23
24 def __len__(self): return len(self.sofar)
25
26 def __getitem__(self, i):
27 if not 0 <= i < self.max: raise IndexError
28 n = len(self.sofar)
29 while n <= i:
30 self.sofar.append(n*n)
31 n += 1
32 return self.sofar[i]
33
34class StrSquares:
35
36 def __init__(self, max):
37 self.max = max
38 self.sofar = []
39
40 def __len__(self):
41 return len(self.sofar)
42
43 def __getitem__(self, i):
44 if not 0 <= i < self.max:
45 raise IndexError
46 n = len(self.sofar)
47 while n <= i:
48 self.sofar.append(str(n*n))
49 n += 1
50 return self.sofar[i]
51
52class BitBucket:
53 def write(self, line):
54 pass
55
56L = [
57 ('0', 0),
58 ('1', 1),
59 ('9', 9),
60 ('10', 10),
61 ('99', 99),
62 ('100', 100),
63 ('314', 314),
64 (' 314', 314),
65 ('314 ', 314),
66 (' \t\t 314 \t\t ', 314),
Walter Dörwald70a6b492004-02-12 17:35:32 +000067 (repr(sys.maxint), sys.maxint),
Walter Dörwald919497e2003-01-19 16:23:59 +000068 (' 1x', ValueError),
69 (' 1 ', 1),
70 (' 1\02 ', ValueError),
71 ('', ValueError),
72 (' ', ValueError),
73 (' \t\t ', ValueError)
74]
75if have_unicode:
76 L += [
77 (unicode('0'), 0),
78 (unicode('1'), 1),
79 (unicode('9'), 9),
80 (unicode('10'), 10),
81 (unicode('99'), 99),
82 (unicode('100'), 100),
83 (unicode('314'), 314),
84 (unicode(' 314'), 314),
85 (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
86 (unicode(' \t\t 314 \t\t '), 314),
87 (unicode(' 1x'), ValueError),
88 (unicode(' 1 '), 1),
89 (unicode(' 1\02 '), ValueError),
90 (unicode(''), ValueError),
91 (unicode(' '), ValueError),
92 (unicode(' \t\t '), ValueError),
93 (unichr(0x200), ValueError),
94]
95
Raymond Hettinger96229b12005-03-11 06:49:40 +000096class TestFailingBool:
97 def __nonzero__(self):
98 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')
Georg Brandl5240d742007-03-13 20:46:32 +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 Wouters8ddab272006-04-04 16:17:02 +0000114 self.assertRaises(ValueError, __import__, '')
Georg Brandl5240d742007-03-13 20:46:32 +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)
Martin v. Löwis820d6ac2006-10-04 05:47:34 +0000122 self.assertTrue(abs(-sys.maxint-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
128 self.assertEqual(abs(0L), 0L)
129 self.assertEqual(abs(1234L), 1234L)
130 self.assertEqual(abs(-1234L), 1234L)
131 # 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
Armin Rigo7ccbca92006-10-04 12:17:45 +0000162 def test_neg(self):
163 x = -sys.maxint-1
164 self.assert_(isinstance(x, int))
165 self.assertEqual(-x, sys.maxint+1)
166
Walter Dörwald919497e2003-01-19 16:23:59 +0000167 def test_apply(self):
168 def f0(*args):
169 self.assertEqual(args, ())
170 def f1(a1):
171 self.assertEqual(a1, 1)
172 def f2(a1, a2):
173 self.assertEqual(a1, 1)
174 self.assertEqual(a2, 2)
175 def f3(a1, a2, a3):
176 self.assertEqual(a1, 1)
177 self.assertEqual(a2, 2)
178 self.assertEqual(a3, 3)
179 apply(f0, ())
180 apply(f1, (1,))
181 apply(f2, (1, 2))
182 apply(f3, (1, 2, 3))
183
184 # A PyCFunction that takes only positional parameters should allow an
185 # empty keyword dictionary to pass without a complaint, but raise a
186 # TypeError if the dictionary is non-empty.
187 apply(id, (1,), {})
188 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
189 self.assertRaises(TypeError, apply)
190 self.assertRaises(TypeError, apply, id, 42)
191 self.assertRaises(TypeError, apply, id, (42,), 42)
192
193 def test_callable(self):
194 self.assert_(callable(len))
195 def f(): pass
196 self.assert_(callable(f))
197 class C:
198 def meth(self): pass
199 self.assert_(callable(C))
200 x = C()
201 self.assert_(callable(x.meth))
202 self.assert_(not callable(x))
203 class D(C):
204 def __call__(self): pass
205 y = D()
206 self.assert_(callable(y))
207 y()
208
209 def test_chr(self):
210 self.assertEqual(chr(32), ' ')
211 self.assertEqual(chr(65), 'A')
212 self.assertEqual(chr(97), 'a')
213 self.assertEqual(chr(0xff), '\xff')
214 self.assertRaises(ValueError, chr, 256)
215 self.assertRaises(TypeError, chr)
216
217 def test_cmp(self):
218 self.assertEqual(cmp(-1, 1), -1)
219 self.assertEqual(cmp(1, -1), 1)
220 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000221 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000222 a = []; a.append(a)
223 b = []; b.append(b)
224 from UserList import UserList
225 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000226 self.assertRaises(RuntimeError, cmp, a, b)
227 self.assertRaises(RuntimeError, cmp, b, c)
228 self.assertRaises(RuntimeError, cmp, c, a)
229 self.assertRaises(RuntimeError, cmp, a, c)
230 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000231 a.pop(); b.pop(); c.pop()
232 self.assertRaises(TypeError, cmp)
233
234 def test_coerce(self):
235 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
236 self.assertEqual(coerce(1, 1L), (1L, 1L))
237 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
238 self.assertRaises(TypeError, coerce)
239 class BadNumber:
240 def __coerce__(self, other):
241 raise ValueError
242 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000243 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000244
245 def test_compile(self):
246 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000247 bom = '\xef\xbb\xbf'
248 compile(bom + 'print 1\n', '', 'exec')
Georg Brandl5240d742007-03-13 20:46:32 +0000249 compile(source='pass', filename='?', mode='exec')
250 compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
251 compile('pass', '?', dont_inherit=1, mode='exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000252 self.assertRaises(TypeError, compile)
253 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
254 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000255 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Georg Brandl5240d742007-03-13 20:46:32 +0000256 self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
257 mode='eval', source='0', filename='tmp')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000258 if have_unicode:
259 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000260 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
261 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000262
Georg Brandl5240d742007-03-13 20:46:32 +0000263
Walter Dörwald919497e2003-01-19 16:23:59 +0000264 def test_delattr(self):
265 import sys
266 sys.spam = 1
267 delattr(sys, 'spam')
268 self.assertRaises(TypeError, delattr)
269
270 def test_dir(self):
Georg Brandl871f1bc2007-03-12 13:17:36 +0000271 # dir(wrong number of arguments)
Walter Dörwald919497e2003-01-19 16:23:59 +0000272 self.assertRaises(TypeError, dir, 42, 42)
273
Georg Brandl871f1bc2007-03-12 13:17:36 +0000274 # dir() - local scope
275 local_var = 1
276 self.assert_('local_var' in dir())
277
278 # dir(module)
279 import sys
280 self.assert_('exit' in dir(sys))
281
282 # dir(module_with_invalid__dict__)
283 import types
284 class Foo(types.ModuleType):
285 __dict__ = 8
286 f = Foo("foo")
287 self.assertRaises(TypeError, dir, f)
288
289 # dir(type)
290 self.assert_("strip" in dir(str))
291 self.assert_("__mro__" not in dir(str))
292
293 # dir(obj)
294 class Foo(object):
295 def __init__(self):
296 self.x = 7
297 self.y = 8
298 self.z = 9
299 f = Foo()
300 self.assert_("y" in dir(f))
301
302 # dir(obj_no__dict__)
303 class Foo(object):
304 __slots__ = []
305 f = Foo()
306 self.assert_("__repr__" in dir(f))
307
308 # dir(obj_no__class__with__dict__)
309 # (an ugly trick to cause getattr(f, "__class__") to fail)
310 class Foo(object):
311 __slots__ = ["__class__", "__dict__"]
312 def __init__(self):
313 self.bar = "wow"
314 f = Foo()
315 self.assert_("__repr__" not in dir(f))
316 self.assert_("bar" in dir(f))
317
318 # dir(obj_using __dir__)
319 class Foo(object):
320 def __dir__(self):
321 return ["kan", "ga", "roo"]
322 f = Foo()
323 self.assert_(dir(f) == ["ga", "kan", "roo"])
324
325 # dir(obj__dir__not_list)
326 class Foo(object):
327 def __dir__(self):
328 return 7
329 f = Foo()
330 self.assertRaises(TypeError, dir, f)
331
Walter Dörwald919497e2003-01-19 16:23:59 +0000332 def test_divmod(self):
333 self.assertEqual(divmod(12, 7), (1, 5))
334 self.assertEqual(divmod(-12, 7), (-2, 2))
335 self.assertEqual(divmod(12, -7), (-2, -2))
336 self.assertEqual(divmod(-12, -7), (1, -5))
337
338 self.assertEqual(divmod(12L, 7L), (1L, 5L))
339 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
340 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
341 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
342
343 self.assertEqual(divmod(12, 7L), (1, 5L))
344 self.assertEqual(divmod(-12, 7L), (-2, 2L))
345 self.assertEqual(divmod(12L, -7), (-2L, -2))
346 self.assertEqual(divmod(-12L, -7), (1L, -5))
347
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000348 self.assertEqual(divmod(-sys.maxint-1, -1),
349 (sys.maxint+1, 0))
350
Walter Dörwald919497e2003-01-19 16:23:59 +0000351 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
352 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
353 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
354 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
355
356 self.assertRaises(TypeError, divmod)
357
358 def test_eval(self):
359 self.assertEqual(eval('1+1'), 2)
360 self.assertEqual(eval(' 1+1\n'), 2)
361 globals = {'a': 1, 'b': 2}
362 locals = {'b': 200, 'c': 300}
363 self.assertEqual(eval('a', globals) , 1)
364 self.assertEqual(eval('a', globals, locals), 1)
365 self.assertEqual(eval('b', globals, locals), 200)
366 self.assertEqual(eval('c', globals, locals), 300)
367 if have_unicode:
368 self.assertEqual(eval(unicode('1+1')), 2)
369 self.assertEqual(eval(unicode(' 1+1\n')), 2)
370 globals = {'a': 1, 'b': 2}
371 locals = {'b': 200, 'c': 300}
372 if have_unicode:
373 self.assertEqual(eval(unicode('a'), globals), 1)
374 self.assertEqual(eval(unicode('a'), globals, locals), 1)
375 self.assertEqual(eval(unicode('b'), globals, locals), 200)
376 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000377 bom = '\xef\xbb\xbf'
378 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000379 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
380 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000381 self.assertRaises(TypeError, eval)
382 self.assertRaises(TypeError, eval, ())
383
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000384 def test_general_eval(self):
385 # Tests that general mappings can be used for the locals argument
386
387 class M:
388 "Test mapping interface versus possible calls from eval()."
389 def __getitem__(self, key):
390 if key == 'a':
391 return 12
392 raise KeyError
393 def keys(self):
394 return list('xyz')
395
396 m = M()
397 g = globals()
398 self.assertEqual(eval('a', g, m), 12)
399 self.assertRaises(NameError, eval, 'b', g, m)
400 self.assertEqual(eval('dir()', g, m), list('xyz'))
401 self.assertEqual(eval('globals()', g, m), g)
402 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000403 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000404 class A:
405 "Non-mapping"
406 pass
407 m = A()
408 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000409
410 # Verify that dict subclasses work as well
411 class D(dict):
412 def __getitem__(self, key):
413 if key == 'a':
414 return 12
415 return dict.__getitem__(self, key)
416 def keys(self):
417 return list('xyz')
418
419 d = D()
420 self.assertEqual(eval('a', g, d), 12)
421 self.assertRaises(NameError, eval, 'b', g, d)
422 self.assertEqual(eval('dir()', g, d), list('xyz'))
423 self.assertEqual(eval('globals()', g, d), g)
424 self.assertEqual(eval('locals()', g, d), d)
425
426 # Verify locals stores (used by list comps)
427 eval('[locals() for i in (2,3)]', g, d)
428 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
429
430 class SpreadSheet:
431 "Sample application showing nested, calculated lookups."
432 _cells = {}
433 def __setitem__(self, key, formula):
434 self._cells[key] = formula
Martin Blais215f13d2006-06-06 12:46:55 +0000435 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000436 return eval(self._cells[key], globals(), self)
437
438 ss = SpreadSheet()
439 ss['a1'] = '5'
440 ss['a2'] = 'a1*6'
441 ss['a3'] = 'a2*7'
442 self.assertEqual(ss['a3'], 210)
443
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000444 # Verify that dir() catches a non-list returned by eval
445 # SF bug #1004669
446 class C:
447 def __getitem__(self, item):
448 raise KeyError(item)
449 def keys(self):
450 return 'a'
451 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
452
Walter Dörwald919497e2003-01-19 16:23:59 +0000453 # Done outside of the method test_z to get the correct scope
454 z = 0
455 f = open(TESTFN, 'w')
456 f.write('z = z+1\n')
457 f.write('z = z*2\n')
458 f.close()
459 execfile(TESTFN)
460
461 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000462 global numruns
463 if numruns:
464 return
465 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000466
Walter Dörwald919497e2003-01-19 16:23:59 +0000467 globals = {'a': 1, 'b': 2}
468 locals = {'b': 200, 'c': 300}
469
470 self.assertEqual(self.__class__.z, 2)
471 globals['z'] = 0
472 execfile(TESTFN, globals)
473 self.assertEqual(globals['z'], 2)
474 locals['z'] = 0
475 execfile(TESTFN, globals, locals)
476 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000477
478 class M:
479 "Test mapping interface versus possible calls from execfile()."
480 def __init__(self):
481 self.z = 10
482 def __getitem__(self, key):
483 if key == 'z':
484 return self.z
485 raise KeyError
486 def __setitem__(self, key, value):
487 if key == 'z':
488 self.z = value
489 return
490 raise KeyError
491
492 locals = M()
493 locals['z'] = 0
494 execfile(TESTFN, globals, locals)
495 self.assertEqual(locals['z'], 2)
496
Walter Dörwald919497e2003-01-19 16:23:59 +0000497 unlink(TESTFN)
498 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000499 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000500 import os
501 self.assertRaises(IOError, execfile, os.curdir)
502 self.assertRaises(IOError, execfile, "I_dont_exist")
503
504 def test_filter(self):
505 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
506 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
507 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
508 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
509 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
510 def identity(item):
511 return 1
512 filter(identity, Squares(5))
513 self.assertRaises(TypeError, filter)
514 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000515 def __getitem__(self, index):
516 if index<4:
517 return 42
518 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000519 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
520 def badfunc():
521 pass
522 self.assertRaises(TypeError, filter, badfunc, range(5))
523
Walter Dörwaldbf517072003-01-27 15:57:14 +0000524 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000525 self.assertEqual(filter(None, (1, 2)), (1, 2))
526 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
527 self.assertRaises(TypeError, filter, 42, (1, 2))
528
Walter Dörwaldbf517072003-01-27 15:57:14 +0000529 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000530 self.assertEqual(filter(None, "12"), "12")
531 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
532 self.assertRaises(TypeError, filter, 42, "12")
533 class badstr(str):
534 def __getitem__(self, index):
535 raise ValueError
536 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000537
Walter Dörwald903f1e02003-02-04 16:28:00 +0000538 class badstr2(str):
539 def __getitem__(self, index):
540 return 42
541 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
542
543 class weirdstr(str):
544 def __getitem__(self, index):
545 return weirdstr(2*str.__getitem__(self, index))
546 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
547
Walter Dörwald5e61e242003-02-04 17:04:01 +0000548 class shiftstr(str):
549 def __getitem__(self, index):
550 return chr(ord(str.__getitem__(self, index))+1)
551 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
552
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000553 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000554 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000555 self.assertEqual(filter(None, unicode("12")), unicode("12"))
556 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
557 self.assertRaises(TypeError, filter, 42, unicode("12"))
558 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000559
Walter Dörwald903f1e02003-02-04 16:28:00 +0000560 class badunicode(unicode):
561 def __getitem__(self, index):
562 return 42
563 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
564
565 class weirdunicode(unicode):
566 def __getitem__(self, index):
567 return weirdunicode(2*unicode.__getitem__(self, index))
568 self.assertEqual(
569 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
570
Walter Dörwald5e61e242003-02-04 17:04:01 +0000571 class shiftunicode(unicode):
572 def __getitem__(self, index):
573 return unichr(ord(unicode.__getitem__(self, index))+1)
574 self.assertEqual(
575 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
576 unicode("345")
577 )
578
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000579 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000580 # test that filter() never returns tuple, str or unicode subclasses
581 # and that the result always goes through __getitem__
582 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000583 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000584 def __getitem__(self, index):
585 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000586 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000587 def __getitem__(self, index):
588 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000589 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000590 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000591 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000592 }
593 if have_unicode:
594 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000595 def __getitem__(self, index):
596 return 2*unicode.__getitem__(self, index)
597 inputs[unicode2] = {
598 unicode(): unicode(),
599 unicode("123"): unicode("112233")
600 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000601
Walter Dörwald1918f772003-02-10 13:19:13 +0000602 for (cls, inps) in inputs.iteritems():
603 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000604 # make sure the output goes through __getitem__
605 # even if func is None
606 self.assertEqual(
607 filter(funcs[0], cls(inp)),
608 filter(funcs[1], cls(inp))
609 )
610 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000611 outp = filter(func, cls(inp))
612 self.assertEqual(outp, exp)
613 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000614
Walter Dörwald919497e2003-01-19 16:23:59 +0000615 def test_float(self):
616 self.assertEqual(float(3.14), 3.14)
617 self.assertEqual(float(314), 314.0)
618 self.assertEqual(float(314L), 314.0)
619 self.assertEqual(float(" 3.14 "), 3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000620 self.assertRaises(ValueError, float, " 0x3.1 ")
621 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Guido van Rossum3b835492008-01-05 00:59:59 +0000622 self.assertRaises(ValueError, float, " +0x3.p-1 ")
623 self.assertRaises(ValueError, float, "++3.14")
624 self.assertRaises(ValueError, float, "+-3.14")
625 self.assertRaises(ValueError, float, "-+3.14")
626 self.assertRaises(ValueError, float, "--3.14")
Walter Dörwald919497e2003-01-19 16:23:59 +0000627 if have_unicode:
628 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
629 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
Walter Dörwaldede187f2005-11-29 15:45:14 +0000630 # Implementation limitation in PyFloat_FromString()
631 self.assertRaises(ValueError, float, unicode("1"*10000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000632
Georg Brandlde9b6242006-04-30 11:13:56 +0000633 @run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
Neal Norwitz5898fa22005-11-22 05:17:40 +0000634 def test_float_with_comma(self):
635 # set locale to something that doesn't use '.' for the decimal point
Martin v. Löwisfcfff0a2006-07-03 12:19:50 +0000636 # float must not accept the locale specific decimal point but
637 # it still has to accept the normal python syntac
Georg Brandlde9b6242006-04-30 11:13:56 +0000638 import locale
639 if not locale.localeconv()['decimal_point'] == ',':
Neal Norwitz5898fa22005-11-22 05:17:40 +0000640 return
641
Martin v. Löwisfcfff0a2006-07-03 12:19:50 +0000642 self.assertEqual(float(" 3.14 "), 3.14)
643 self.assertEqual(float("+3.14 "), 3.14)
644 self.assertEqual(float("-3.14 "), -3.14)
645 self.assertEqual(float(".14 "), .14)
646 self.assertEqual(float("3. "), 3.0)
647 self.assertEqual(float("3.e3 "), 3000.0)
648 self.assertEqual(float("3.2e3 "), 3200.0)
649 self.assertEqual(float("2.5e-1 "), 0.25)
650 self.assertEqual(float("5e-1"), 0.5)
651 self.assertRaises(ValueError, float, " 3,14 ")
652 self.assertRaises(ValueError, float, " +3,14 ")
653 self.assertRaises(ValueError, float, " -3,14 ")
Georg Brandlde9b6242006-04-30 11:13:56 +0000654 self.assertRaises(ValueError, float, " 0x3.1 ")
655 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Guido van Rossum3b835492008-01-05 00:59:59 +0000656 self.assertRaises(ValueError, float, " +0x3.p-1 ")
Georg Brandlde9b6242006-04-30 11:13:56 +0000657 self.assertEqual(float(" 25.e-1 "), 2.5)
658 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000659
Brett Cannonc3647ac2005-04-26 03:45:26 +0000660 def test_floatconversion(self):
661 # Make sure that calls to __float__() work properly
662 class Foo0:
663 def __float__(self):
664 return 42.
665
666 class Foo1(object):
667 def __float__(self):
668 return 42.
669
670 class Foo2(float):
671 def __float__(self):
672 return 42.
673
674 class Foo3(float):
675 def __new__(cls, value=0.):
676 return float.__new__(cls, 2*value)
677
678 def __float__(self):
679 return self
680
681 class Foo4(float):
682 def __float__(self):
683 return 42
684
685 self.assertAlmostEqual(float(Foo0()), 42.)
686 self.assertAlmostEqual(float(Foo1()), 42.)
687 self.assertAlmostEqual(float(Foo2()), 42.)
688 self.assertAlmostEqual(float(Foo3(21)), 42.)
689 self.assertRaises(TypeError, float, Foo4(42))
690
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +0000691 def test_floatasratio(self):
Raymond Hettinger04c96d52008-02-01 21:30:23 +0000692 for f, ratio in [
693 (0.875, (7, 8)),
694 (-0.875, (-7, 8)),
695 (0.0, (0, 1)),
696 (11.5, (23, 2)),
697 ]:
698 self.assertEqual(f.as_integer_ratio(), ratio)
699
Raymond Hettinger4cab8ec2008-02-01 22:42:59 +0000700 for i in range(10000):
701 f = random.random()
702 f *= 10 ** random.randint(-100, 100)
703 n, d = f.as_integer_ratio()
704 self.assertEqual(float(n).__truediv__(d), f)
705
Mark Dickinsond058cd22008-02-10 21:29:51 +0000706 R = fractions.Fraction
Jeffrey Yasskin3ea7b412008-01-27 23:08:46 +0000707 self.assertEqual(R(0, 1),
708 R(*float(0.0).as_integer_ratio()))
709 self.assertEqual(R(5, 2),
710 R(*float(2.5).as_integer_ratio()))
711 self.assertEqual(R(1, 2),
712 R(*float(0.5).as_integer_ratio()))
713 self.assertEqual(R(4728779608739021, 2251799813685248),
714 R(*float(2.1).as_integer_ratio()))
715 self.assertEqual(R(-4728779608739021, 2251799813685248),
716 R(*float(-2.1).as_integer_ratio()))
717 self.assertEqual(R(-2100, 1),
718 R(*float(-2100.0).as_integer_ratio()))
719
720 self.assertRaises(OverflowError, float('inf').as_integer_ratio)
721 self.assertRaises(OverflowError, float('-inf').as_integer_ratio)
722 self.assertRaises(ValueError, float('nan').as_integer_ratio)
723
Walter Dörwald919497e2003-01-19 16:23:59 +0000724 def test_getattr(self):
725 import sys
726 self.assert_(getattr(sys, 'stdout') is sys.stdout)
727 self.assertRaises(TypeError, getattr, sys, 1)
728 self.assertRaises(TypeError, getattr, sys, 1, "foo")
729 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000730 if have_unicode:
731 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000732
733 def test_hasattr(self):
734 import sys
735 self.assert_(hasattr(sys, 'stdout'))
736 self.assertRaises(TypeError, hasattr, sys, 1)
737 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000738 if have_unicode:
739 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000740
741 def test_hash(self):
742 hash(None)
743 self.assertEqual(hash(1), hash(1L))
744 self.assertEqual(hash(1), hash(1.0))
745 hash('spam')
746 if have_unicode:
747 self.assertEqual(hash('spam'), hash(unicode('spam')))
748 hash((0,1,2,3))
749 def f(): pass
750 self.assertRaises(TypeError, hash, [])
751 self.assertRaises(TypeError, hash, {})
Martin v. Löwisab2f8f72006-08-09 07:57:39 +0000752 # Bug 1536021: Allow hash to return long objects
753 class X:
754 def __hash__(self):
755 return 2**100
756 self.assertEquals(type(hash(X())), int)
757 class Y(object):
758 def __hash__(self):
759 return 2**100
760 self.assertEquals(type(hash(Y())), int)
Armin Rigo51fc8c42006-08-09 14:55:26 +0000761 class Z(long):
762 def __hash__(self):
763 return self
764 self.assertEquals(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000765
766 def test_hex(self):
767 self.assertEqual(hex(16), '0x10')
768 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000769 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000770 self.assertEqual(hex(-16L), '-0x10L')
771 self.assertRaises(TypeError, hex, {})
772
773 def test_id(self):
774 id(None)
775 id(1)
776 id(1L)
777 id(1.0)
778 id('spam')
779 id((0,1,2,3))
780 id([0,1,2,3])
781 id({'spam': 1, 'eggs': 2, 'ham': 3})
782
783 # Test input() later, together with raw_input
784
785 def test_int(self):
786 self.assertEqual(int(314), 314)
787 self.assertEqual(int(3.14), 3)
788 self.assertEqual(int(314L), 314)
789 # Check that conversion from float truncates towards zero
790 self.assertEqual(int(-3.14), -3)
791 self.assertEqual(int(3.9), 3)
792 self.assertEqual(int(-3.9), -3)
793 self.assertEqual(int(3.5), 3)
794 self.assertEqual(int(-3.5), -3)
795 # Different base:
796 self.assertEqual(int("10",16), 16L)
797 if have_unicode:
798 self.assertEqual(int(unicode("10"),16), 16L)
799 # Test conversion from strings and various anomalies
800 for s, v in L:
801 for sign in "", "+", "-":
802 for prefix in "", " ", "\t", " \t\t ":
803 ss = prefix + sign + s
804 vv = v
805 if sign == "-" and v is not ValueError:
806 vv = -v
807 try:
808 self.assertEqual(int(ss), vv)
809 except v:
810 pass
811
Walter Dörwald70a6b492004-02-12 17:35:32 +0000812 s = repr(-1-sys.maxint)
Armin Rigo7ccbca92006-10-04 12:17:45 +0000813 x = int(s)
814 self.assertEqual(x+1, -sys.maxint)
815 self.assert_(isinstance(x, int))
Walter Dörwald919497e2003-01-19 16:23:59 +0000816 # should return long
Armin Rigo7ccbca92006-10-04 12:17:45 +0000817 self.assertEqual(int(s[1:]), sys.maxint+1)
Walter Dörwald919497e2003-01-19 16:23:59 +0000818
819 # should return long
820 x = int(1e100)
821 self.assert_(isinstance(x, long))
822 x = int(-1e100)
823 self.assert_(isinstance(x, long))
824
825
826 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
827 # Worked by accident in Windows release build, but failed in debug build.
828 # Failed in all Linux builds.
829 x = -1-sys.maxint
830 self.assertEqual(x >> 1, x//2)
831
832 self.assertRaises(ValueError, int, '123\0')
833 self.assertRaises(ValueError, int, '53', 40)
834
Georg Brandl2c1375c2006-10-12 11:27:59 +0000835 # SF bug 1545497: embedded NULs were not detected with
836 # explicit base
837 self.assertRaises(ValueError, int, '123\0', 10)
838 self.assertRaises(ValueError, int, '123\x00 245', 20)
839
Walter Dörwald919497e2003-01-19 16:23:59 +0000840 x = int('1' * 600)
841 self.assert_(isinstance(x, long))
842
843 if have_unicode:
844 x = int(unichr(0x661) * 600)
845 self.assert_(isinstance(x, long))
846
847 self.assertRaises(TypeError, int, 1, 12)
848
849 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000850 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000851
Georg Brandl14404b62008-01-19 19:27:05 +0000852 # Bug 1679: "0x" is not a valid hex literal
853 self.assertRaises(ValueError, int, "0x", 16)
854 self.assertRaises(ValueError, int, "0x", 0)
855
Eric Smith9ff19b52008-03-17 17:32:20 +0000856 self.assertRaises(ValueError, int, "0o", 8)
857 self.assertRaises(ValueError, int, "0o", 0)
858
859 self.assertRaises(ValueError, int, "0b", 2)
860 self.assertRaises(ValueError, int, "0b", 0)
861
Georg Brandl14404b62008-01-19 19:27:05 +0000862
Tim Petersb713ec22006-05-23 18:45:30 +0000863 # SF bug 1334662: int(string, base) wrong answers
864 # Various representations of 2**32 evaluated to 0
865 # rather than 2**32 in previous versions
866
867 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
868 self.assertEqual(int('102002022201221111211', 3), 4294967296L)
869 self.assertEqual(int('10000000000000000', 4), 4294967296L)
870 self.assertEqual(int('32244002423141', 5), 4294967296L)
871 self.assertEqual(int('1550104015504', 6), 4294967296L)
872 self.assertEqual(int('211301422354', 7), 4294967296L)
873 self.assertEqual(int('40000000000', 8), 4294967296L)
874 self.assertEqual(int('12068657454', 9), 4294967296L)
875 self.assertEqual(int('4294967296', 10), 4294967296L)
876 self.assertEqual(int('1904440554', 11), 4294967296L)
877 self.assertEqual(int('9ba461594', 12), 4294967296L)
878 self.assertEqual(int('535a79889', 13), 4294967296L)
879 self.assertEqual(int('2ca5b7464', 14), 4294967296L)
880 self.assertEqual(int('1a20dcd81', 15), 4294967296L)
881 self.assertEqual(int('100000000', 16), 4294967296L)
882 self.assertEqual(int('a7ffda91', 17), 4294967296L)
883 self.assertEqual(int('704he7g4', 18), 4294967296L)
884 self.assertEqual(int('4f5aff66', 19), 4294967296L)
885 self.assertEqual(int('3723ai4g', 20), 4294967296L)
886 self.assertEqual(int('281d55i4', 21), 4294967296L)
887 self.assertEqual(int('1fj8b184', 22), 4294967296L)
888 self.assertEqual(int('1606k7ic', 23), 4294967296L)
889 self.assertEqual(int('mb994ag', 24), 4294967296L)
890 self.assertEqual(int('hek2mgl', 25), 4294967296L)
891 self.assertEqual(int('dnchbnm', 26), 4294967296L)
892 self.assertEqual(int('b28jpdm', 27), 4294967296L)
893 self.assertEqual(int('8pfgih4', 28), 4294967296L)
894 self.assertEqual(int('76beigg', 29), 4294967296L)
895 self.assertEqual(int('5qmcpqg', 30), 4294967296L)
896 self.assertEqual(int('4q0jto4', 31), 4294967296L)
897 self.assertEqual(int('4000000', 32), 4294967296L)
898 self.assertEqual(int('3aokq94', 33), 4294967296L)
899 self.assertEqual(int('2qhxjli', 34), 4294967296L)
900 self.assertEqual(int('2br45qb', 35), 4294967296L)
901 self.assertEqual(int('1z141z4', 36), 4294967296L)
902
Eric Smith9ff19b52008-03-17 17:32:20 +0000903 # tests with base 0
904 # this fails on 3.0, but in 2.x the old octal syntax is allowed
905 self.assertEqual(int(' 0123 ', 0), 83)
906 self.assertEqual(int(' 0123 ', 0), 83)
907 self.assertEqual(int('000', 0), 0)
908 self.assertEqual(int('0o123', 0), 83)
909 self.assertEqual(int('0x123', 0), 291)
910 self.assertEqual(int('0b100', 0), 4)
911 self.assertEqual(int(' 0O123 ', 0), 83)
912 self.assertEqual(int(' 0X123 ', 0), 291)
913 self.assertEqual(int(' 0B100 ', 0), 4)
914
915 # without base still base 10
916 self.assertEqual(int('0123'), 123)
917 self.assertEqual(int('0123', 10), 123)
918
919 # tests with prefix and base != 0
920 self.assertEqual(int('0x123', 16), 291)
921 self.assertEqual(int('0o123', 8), 83)
922 self.assertEqual(int('0b100', 2), 4)
923 self.assertEqual(int('0X123', 16), 291)
924 self.assertEqual(int('0O123', 8), 83)
925 self.assertEqual(int('0B100', 2), 4)
926
927 # the code has special checks for the first character after the
928 # type prefix
929 self.assertRaises(ValueError, int, '0b2', 2)
930 self.assertRaises(ValueError, int, '0b02', 2)
931 self.assertRaises(ValueError, int, '0B2', 2)
932 self.assertRaises(ValueError, int, '0B02', 2)
933 self.assertRaises(ValueError, int, '0o8', 8)
934 self.assertRaises(ValueError, int, '0o08', 8)
935 self.assertRaises(ValueError, int, '0O8', 8)
936 self.assertRaises(ValueError, int, '0O08', 8)
937 self.assertRaises(ValueError, int, '0xg', 16)
938 self.assertRaises(ValueError, int, '0x0g', 16)
939 self.assertRaises(ValueError, int, '0Xg', 16)
940 self.assertRaises(ValueError, int, '0X0g', 16)
941
Tim Petersb713ec22006-05-23 18:45:30 +0000942 # SF bug 1334662: int(string, base) wrong answers
943 # Checks for proper evaluation of 2**32 + 1
944 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
945 self.assertEqual(int('102002022201221111212', 3), 4294967297L)
946 self.assertEqual(int('10000000000000001', 4), 4294967297L)
947 self.assertEqual(int('32244002423142', 5), 4294967297L)
948 self.assertEqual(int('1550104015505', 6), 4294967297L)
949 self.assertEqual(int('211301422355', 7), 4294967297L)
950 self.assertEqual(int('40000000001', 8), 4294967297L)
951 self.assertEqual(int('12068657455', 9), 4294967297L)
952 self.assertEqual(int('4294967297', 10), 4294967297L)
953 self.assertEqual(int('1904440555', 11), 4294967297L)
954 self.assertEqual(int('9ba461595', 12), 4294967297L)
955 self.assertEqual(int('535a7988a', 13), 4294967297L)
956 self.assertEqual(int('2ca5b7465', 14), 4294967297L)
957 self.assertEqual(int('1a20dcd82', 15), 4294967297L)
958 self.assertEqual(int('100000001', 16), 4294967297L)
959 self.assertEqual(int('a7ffda92', 17), 4294967297L)
960 self.assertEqual(int('704he7g5', 18), 4294967297L)
961 self.assertEqual(int('4f5aff67', 19), 4294967297L)
962 self.assertEqual(int('3723ai4h', 20), 4294967297L)
963 self.assertEqual(int('281d55i5', 21), 4294967297L)
964 self.assertEqual(int('1fj8b185', 22), 4294967297L)
965 self.assertEqual(int('1606k7id', 23), 4294967297L)
966 self.assertEqual(int('mb994ah', 24), 4294967297L)
967 self.assertEqual(int('hek2mgm', 25), 4294967297L)
968 self.assertEqual(int('dnchbnn', 26), 4294967297L)
969 self.assertEqual(int('b28jpdn', 27), 4294967297L)
970 self.assertEqual(int('8pfgih5', 28), 4294967297L)
971 self.assertEqual(int('76beigh', 29), 4294967297L)
972 self.assertEqual(int('5qmcpqh', 30), 4294967297L)
973 self.assertEqual(int('4q0jto5', 31), 4294967297L)
974 self.assertEqual(int('4000001', 32), 4294967297L)
975 self.assertEqual(int('3aokq95', 33), 4294967297L)
976 self.assertEqual(int('2qhxjlj', 34), 4294967297L)
977 self.assertEqual(int('2br45qc', 35), 4294967297L)
978 self.assertEqual(int('1z141z5', 36), 4294967297L)
979
Brett Cannonc3647ac2005-04-26 03:45:26 +0000980 def test_intconversion(self):
981 # Test __int__()
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +0000982 class ClassicMissingMethods:
983 pass
984 self.assertRaises(AttributeError, int, ClassicMissingMethods())
985
986 class MissingMethods(object):
987 pass
988 self.assertRaises(TypeError, int, MissingMethods())
989
Brett Cannonc3647ac2005-04-26 03:45:26 +0000990 class Foo0:
991 def __int__(self):
992 return 42
993
994 class Foo1(object):
995 def __int__(self):
996 return 42
997
998 class Foo2(int):
999 def __int__(self):
1000 return 42
1001
1002 class Foo3(int):
1003 def __int__(self):
1004 return self
1005
1006 class Foo4(int):
1007 def __int__(self):
1008 return 42L
1009
1010 class Foo5(int):
1011 def __int__(self):
1012 return 42.
1013
1014 self.assertEqual(int(Foo0()), 42)
1015 self.assertEqual(int(Foo1()), 42)
1016 self.assertEqual(int(Foo2()), 42)
1017 self.assertEqual(int(Foo3()), 0)
1018 self.assertEqual(int(Foo4()), 42L)
1019 self.assertRaises(TypeError, int, Foo5())
1020
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001021 class Classic:
1022 pass
1023 for base in (object, Classic):
1024 class IntOverridesTrunc(base):
1025 def __int__(self):
1026 return 42
1027 def __trunc__(self):
1028 return -12
1029 self.assertEqual(int(IntOverridesTrunc()), 42)
1030
1031 class JustTrunc(base):
1032 def __trunc__(self):
1033 return 42
1034 self.assertEqual(int(JustTrunc()), 42)
1035
1036 for trunc_result_base in (object, Classic):
1037 class Integral(trunc_result_base):
1038 def __int__(self):
1039 return 42
1040
1041 class TruncReturnsNonInt(base):
1042 def __trunc__(self):
1043 return Integral()
1044 self.assertEqual(int(TruncReturnsNonInt()), 42)
1045
1046 class NonIntegral(trunc_result_base):
1047 def __trunc__(self):
1048 # Check that we avoid infinite recursion.
1049 return NonIntegral()
1050
1051 class TruncReturnsNonIntegral(base):
1052 def __trunc__(self):
1053 return NonIntegral()
1054 try:
1055 int(TruncReturnsNonIntegral())
1056 except TypeError as e:
1057 self.assertEquals(str(e),
1058 "__trunc__ returned non-Integral"
1059 " (type NonIntegral)")
1060 else:
1061 self.fail("Failed to raise TypeError with %s" %
1062 ((base, trunc_result_base),))
1063
Walter Dörwald919497e2003-01-19 16:23:59 +00001064 def test_intern(self):
1065 self.assertRaises(TypeError, intern)
1066 s = "never interned before"
1067 self.assert_(intern(s) is s)
1068 s2 = s.swapcase().swapcase()
1069 self.assert_(intern(s2) is s)
1070
Jeremy Hylton4c989dd2004-08-07 19:20:05 +00001071 # Subclasses of string can't be interned, because they
1072 # provide too much opportunity for insane things to happen.
1073 # We don't want them in the interned dict and if they aren't
1074 # actually interned, we don't want to create the appearance
1075 # that they are by allowing intern() to succeeed.
1076 class S(str):
1077 def __hash__(self):
1078 return 123
1079
1080 self.assertRaises(TypeError, intern, S("abc"))
1081
1082 # It's still safe to pass these strings to routines that
1083 # call intern internally, e.g. PyObject_SetAttr().
1084 s = S("abc")
1085 setattr(s, s, s)
1086 self.assertEqual(getattr(s, s), s)
1087
Walter Dörwald919497e2003-01-19 16:23:59 +00001088 def test_iter(self):
1089 self.assertRaises(TypeError, iter)
1090 self.assertRaises(TypeError, iter, 42, 42)
1091 lists = [("1", "2"), ["1", "2"], "12"]
1092 if have_unicode:
1093 lists.append(unicode("12"))
1094 for l in lists:
1095 i = iter(l)
1096 self.assertEqual(i.next(), '1')
1097 self.assertEqual(i.next(), '2')
1098 self.assertRaises(StopIteration, i.next)
1099
1100 def test_isinstance(self):
1101 class C:
1102 pass
1103 class D(C):
1104 pass
1105 class E:
1106 pass
1107 c = C()
1108 d = D()
1109 e = E()
1110 self.assert_(isinstance(c, C))
1111 self.assert_(isinstance(d, C))
1112 self.assert_(not isinstance(e, C))
1113 self.assert_(not isinstance(c, D))
1114 self.assert_(not isinstance('foo', E))
1115 self.assertRaises(TypeError, isinstance, E, 'foo')
1116 self.assertRaises(TypeError, isinstance)
1117
1118 def test_issubclass(self):
1119 class C:
1120 pass
1121 class D(C):
1122 pass
1123 class E:
1124 pass
1125 c = C()
1126 d = D()
1127 e = E()
1128 self.assert_(issubclass(D, C))
1129 self.assert_(issubclass(C, C))
1130 self.assert_(not issubclass(C, D))
1131 self.assertRaises(TypeError, issubclass, 'foo', E)
1132 self.assertRaises(TypeError, issubclass, E, 'foo')
1133 self.assertRaises(TypeError, issubclass)
1134
1135 def test_len(self):
1136 self.assertEqual(len('123'), 3)
1137 self.assertEqual(len(()), 0)
1138 self.assertEqual(len((1, 2, 3, 4)), 4)
1139 self.assertEqual(len([1, 2, 3, 4]), 4)
1140 self.assertEqual(len({}), 0)
1141 self.assertEqual(len({'a':1, 'b': 2}), 2)
1142 class BadSeq:
1143 def __len__(self):
1144 raise ValueError
1145 self.assertRaises(ValueError, len, BadSeq())
1146
1147 def test_list(self):
1148 self.assertEqual(list([]), [])
1149 l0_3 = [0, 1, 2, 3]
1150 l0_3_bis = list(l0_3)
1151 self.assertEqual(l0_3, l0_3_bis)
1152 self.assert_(l0_3 is not l0_3_bis)
1153 self.assertEqual(list(()), [])
1154 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
1155 self.assertEqual(list(''), [])
1156 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
1157
1158 if sys.maxint == 0x7fffffff:
1159 # This test can currently only work on 32-bit machines.
1160 # XXX If/when PySequence_Length() returns a ssize_t, it should be
1161 # XXX re-enabled.
1162 # Verify clearing of bug #556025.
1163 # This assumes that the max data size (sys.maxint) == max
1164 # address size this also assumes that the address size is at
1165 # least 4 bytes with 8 byte addresses, the bug is not well
1166 # tested
1167 #
1168 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
1169 # earlier due to a newlib bug. See the following mailing list
1170 # thread for the details:
1171
1172 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
1173 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
1174
Raymond Hettingeraa241e02004-09-26 19:24:20 +00001175 # This code used to segfault in Py2.4a3
1176 x = []
1177 x.extend(-y for y in x)
1178 self.assertEqual(x, [])
1179
Walter Dörwald919497e2003-01-19 16:23:59 +00001180 def test_long(self):
1181 self.assertEqual(long(314), 314L)
1182 self.assertEqual(long(3.14), 3L)
1183 self.assertEqual(long(314L), 314L)
1184 # Check that conversion from float truncates towards zero
1185 self.assertEqual(long(-3.14), -3L)
1186 self.assertEqual(long(3.9), 3L)
1187 self.assertEqual(long(-3.9), -3L)
1188 self.assertEqual(long(3.5), 3L)
1189 self.assertEqual(long(-3.5), -3L)
1190 self.assertEqual(long("-3"), -3L)
1191 if have_unicode:
1192 self.assertEqual(long(unicode("-3")), -3L)
1193 # Different base:
1194 self.assertEqual(long("10",16), 16L)
1195 if have_unicode:
1196 self.assertEqual(long(unicode("10"),16), 16L)
1197 # Check conversions from string (same test set as for int(), and then some)
1198 LL = [
1199 ('1' + '0'*20, 10L**20),
1200 ('1' + '0'*100, 10L**100)
1201 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +00001202 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +00001203 if have_unicode:
1204 L2 += [
1205 (unicode('1') + unicode('0')*20, 10L**20),
1206 (unicode('1') + unicode('0')*100, 10L**100),
1207 ]
1208 for s, v in L2 + LL:
1209 for sign in "", "+", "-":
1210 for prefix in "", " ", "\t", " \t\t ":
1211 ss = prefix + sign + s
1212 vv = v
1213 if sign == "-" and v is not ValueError:
1214 vv = -v
1215 try:
1216 self.assertEqual(long(ss), long(vv))
1217 except v:
1218 pass
1219
1220 self.assertRaises(ValueError, long, '123\0')
1221 self.assertRaises(ValueError, long, '53', 40)
1222 self.assertRaises(TypeError, long, 1, 12)
1223
Georg Brandl00cd8182007-03-06 18:41:12 +00001224 # SF patch #1638879: embedded NULs were not detected with
1225 # explicit base
1226 self.assertRaises(ValueError, long, '123\0', 10)
1227 self.assertRaises(ValueError, long, '123\x00 245', 20)
1228
Tim Peters696cf432006-05-24 21:10:40 +00001229 self.assertEqual(long('100000000000000000000000000000000', 2),
1230 4294967296)
1231 self.assertEqual(long('102002022201221111211', 3), 4294967296)
1232 self.assertEqual(long('10000000000000000', 4), 4294967296)
1233 self.assertEqual(long('32244002423141', 5), 4294967296)
1234 self.assertEqual(long('1550104015504', 6), 4294967296)
1235 self.assertEqual(long('211301422354', 7), 4294967296)
1236 self.assertEqual(long('40000000000', 8), 4294967296)
1237 self.assertEqual(long('12068657454', 9), 4294967296)
1238 self.assertEqual(long('4294967296', 10), 4294967296)
1239 self.assertEqual(long('1904440554', 11), 4294967296)
1240 self.assertEqual(long('9ba461594', 12), 4294967296)
1241 self.assertEqual(long('535a79889', 13), 4294967296)
1242 self.assertEqual(long('2ca5b7464', 14), 4294967296)
1243 self.assertEqual(long('1a20dcd81', 15), 4294967296)
1244 self.assertEqual(long('100000000', 16), 4294967296)
1245 self.assertEqual(long('a7ffda91', 17), 4294967296)
1246 self.assertEqual(long('704he7g4', 18), 4294967296)
1247 self.assertEqual(long('4f5aff66', 19), 4294967296)
1248 self.assertEqual(long('3723ai4g', 20), 4294967296)
1249 self.assertEqual(long('281d55i4', 21), 4294967296)
1250 self.assertEqual(long('1fj8b184', 22), 4294967296)
1251 self.assertEqual(long('1606k7ic', 23), 4294967296)
1252 self.assertEqual(long('mb994ag', 24), 4294967296)
1253 self.assertEqual(long('hek2mgl', 25), 4294967296)
1254 self.assertEqual(long('dnchbnm', 26), 4294967296)
1255 self.assertEqual(long('b28jpdm', 27), 4294967296)
1256 self.assertEqual(long('8pfgih4', 28), 4294967296)
1257 self.assertEqual(long('76beigg', 29), 4294967296)
1258 self.assertEqual(long('5qmcpqg', 30), 4294967296)
1259 self.assertEqual(long('4q0jto4', 31), 4294967296)
1260 self.assertEqual(long('4000000', 32), 4294967296)
1261 self.assertEqual(long('3aokq94', 33), 4294967296)
1262 self.assertEqual(long('2qhxjli', 34), 4294967296)
1263 self.assertEqual(long('2br45qb', 35), 4294967296)
1264 self.assertEqual(long('1z141z4', 36), 4294967296)
1265
1266 self.assertEqual(long('100000000000000000000000000000001', 2),
1267 4294967297)
1268 self.assertEqual(long('102002022201221111212', 3), 4294967297)
1269 self.assertEqual(long('10000000000000001', 4), 4294967297)
1270 self.assertEqual(long('32244002423142', 5), 4294967297)
1271 self.assertEqual(long('1550104015505', 6), 4294967297)
1272 self.assertEqual(long('211301422355', 7), 4294967297)
1273 self.assertEqual(long('40000000001', 8), 4294967297)
1274 self.assertEqual(long('12068657455', 9), 4294967297)
1275 self.assertEqual(long('4294967297', 10), 4294967297)
1276 self.assertEqual(long('1904440555', 11), 4294967297)
1277 self.assertEqual(long('9ba461595', 12), 4294967297)
1278 self.assertEqual(long('535a7988a', 13), 4294967297)
1279 self.assertEqual(long('2ca5b7465', 14), 4294967297)
1280 self.assertEqual(long('1a20dcd82', 15), 4294967297)
1281 self.assertEqual(long('100000001', 16), 4294967297)
1282 self.assertEqual(long('a7ffda92', 17), 4294967297)
1283 self.assertEqual(long('704he7g5', 18), 4294967297)
1284 self.assertEqual(long('4f5aff67', 19), 4294967297)
1285 self.assertEqual(long('3723ai4h', 20), 4294967297)
1286 self.assertEqual(long('281d55i5', 21), 4294967297)
1287 self.assertEqual(long('1fj8b185', 22), 4294967297)
1288 self.assertEqual(long('1606k7id', 23), 4294967297)
1289 self.assertEqual(long('mb994ah', 24), 4294967297)
1290 self.assertEqual(long('hek2mgm', 25), 4294967297)
1291 self.assertEqual(long('dnchbnn', 26), 4294967297)
1292 self.assertEqual(long('b28jpdn', 27), 4294967297)
1293 self.assertEqual(long('8pfgih5', 28), 4294967297)
1294 self.assertEqual(long('76beigh', 29), 4294967297)
1295 self.assertEqual(long('5qmcpqh', 30), 4294967297)
1296 self.assertEqual(long('4q0jto5', 31), 4294967297)
1297 self.assertEqual(long('4000001', 32), 4294967297)
1298 self.assertEqual(long('3aokq95', 33), 4294967297)
1299 self.assertEqual(long('2qhxjlj', 34), 4294967297)
1300 self.assertEqual(long('2br45qc', 35), 4294967297)
1301 self.assertEqual(long('1z141z5', 36), 4294967297)
1302
1303
Brett Cannonc3647ac2005-04-26 03:45:26 +00001304 def test_longconversion(self):
1305 # Test __long__()
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001306 class ClassicMissingMethods:
1307 pass
1308 self.assertRaises(AttributeError, long, ClassicMissingMethods())
1309
1310 class MissingMethods(object):
1311 pass
1312 self.assertRaises(TypeError, long, MissingMethods())
1313
Brett Cannonc3647ac2005-04-26 03:45:26 +00001314 class Foo0:
1315 def __long__(self):
1316 return 42L
1317
1318 class Foo1(object):
1319 def __long__(self):
1320 return 42L
1321
1322 class Foo2(long):
1323 def __long__(self):
1324 return 42L
1325
1326 class Foo3(long):
1327 def __long__(self):
1328 return self
1329
1330 class Foo4(long):
1331 def __long__(self):
1332 return 42
1333
1334 class Foo5(long):
1335 def __long__(self):
1336 return 42.
1337
1338 self.assertEqual(long(Foo0()), 42L)
1339 self.assertEqual(long(Foo1()), 42L)
1340 self.assertEqual(long(Foo2()), 42L)
1341 self.assertEqual(long(Foo3()), 0)
1342 self.assertEqual(long(Foo4()), 42)
1343 self.assertRaises(TypeError, long, Foo5())
1344
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001345 class Classic:
1346 pass
1347 for base in (object, Classic):
1348 class LongOverridesTrunc(base):
1349 def __long__(self):
1350 return 42
1351 def __trunc__(self):
1352 return -12
1353 self.assertEqual(long(LongOverridesTrunc()), 42)
1354
1355 class JustTrunc(base):
1356 def __trunc__(self):
1357 return 42
1358 self.assertEqual(long(JustTrunc()), 42)
1359
1360 for trunc_result_base in (object, Classic):
1361 class Integral(trunc_result_base):
1362 def __int__(self):
1363 return 42
1364
1365 class TruncReturnsNonLong(base):
1366 def __trunc__(self):
1367 return Integral()
1368 self.assertEqual(long(TruncReturnsNonLong()), 42)
1369
1370 class NonIntegral(trunc_result_base):
1371 def __trunc__(self):
1372 # Check that we avoid infinite recursion.
1373 return NonIntegral()
1374
1375 class TruncReturnsNonIntegral(base):
1376 def __trunc__(self):
1377 return NonIntegral()
1378 try:
1379 long(TruncReturnsNonIntegral())
1380 except TypeError as e:
1381 self.assertEquals(str(e),
1382 "__trunc__ returned non-Integral"
1383 " (type NonIntegral)")
1384 else:
1385 self.fail("Failed to raise TypeError with %s" %
1386 ((base, trunc_result_base),))
1387
Walter Dörwald919497e2003-01-19 16:23:59 +00001388 def test_map(self):
1389 self.assertEqual(
1390 map(None, 'hello world'),
1391 ['h','e','l','l','o',' ','w','o','r','l','d']
1392 )
1393 self.assertEqual(
1394 map(None, 'abcd', 'efg'),
1395 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
1396 )
1397 self.assertEqual(
1398 map(None, range(10)),
1399 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1400 )
1401 self.assertEqual(
1402 map(lambda x: x*x, range(1,4)),
1403 [1, 4, 9]
1404 )
1405 try:
1406 from math import sqrt
1407 except ImportError:
1408 def sqrt(x):
1409 return pow(x, 0.5)
1410 self.assertEqual(
1411 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
1412 [[4.0, 2.0], [9.0, 3.0]]
1413 )
1414 self.assertEqual(
1415 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
1416 [10, 4, 6]
1417 )
1418
1419 def plus(*v):
1420 accu = 0
1421 for i in v: accu = accu + i
1422 return accu
1423 self.assertEqual(
1424 map(plus, [1, 3, 7]),
1425 [1, 3, 7]
1426 )
1427 self.assertEqual(
1428 map(plus, [1, 3, 7], [4, 9, 2]),
1429 [1+4, 3+9, 7+2]
1430 )
1431 self.assertEqual(
1432 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
1433 [1+4+1, 3+9+1, 7+2+0]
1434 )
1435 self.assertEqual(
1436 map(None, Squares(10)),
1437 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1438 )
1439 self.assertEqual(
1440 map(int, Squares(10)),
1441 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1442 )
1443 self.assertEqual(
1444 map(None, Squares(3), Squares(2)),
1445 [(0,0), (1,1), (4,None)]
1446 )
1447 self.assertEqual(
1448 map(max, Squares(3), Squares(2)),
1449 [0, 1, 4]
1450 )
1451 self.assertRaises(TypeError, map)
1452 self.assertRaises(TypeError, map, lambda x: x, 42)
1453 self.assertEqual(map(None, [42]), [42])
1454 class BadSeq:
1455 def __getitem__(self, index):
1456 raise ValueError
1457 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001458 def badfunc(x):
1459 raise RuntimeError
1460 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001461
1462 def test_max(self):
1463 self.assertEqual(max('123123'), '3')
1464 self.assertEqual(max(1, 2, 3), 3)
1465 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1466 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1467
1468 self.assertEqual(max(1, 2L, 3.0), 3.0)
1469 self.assertEqual(max(1L, 2.0, 3), 3)
1470 self.assertEqual(max(1.0, 2, 3L), 3L)
1471
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001472 for stmt in (
1473 "max(key=int)", # no args
1474 "max(1, key=int)", # single arg not iterable
1475 "max(1, 2, keystone=int)", # wrong keyword
1476 "max(1, 2, key=int, abc=int)", # two many keywords
1477 "max(1, 2, key=1)", # keyfunc is not callable
1478 ):
Tim Peters7f061872004-12-07 21:17:46 +00001479 try:
1480 exec(stmt) in globals()
1481 except TypeError:
1482 pass
1483 else:
1484 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001485
1486 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1487 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1488 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1489
1490 data = [random.randrange(200) for i in range(100)]
1491 keys = dict((elem, random.randrange(50)) for elem in data)
1492 f = keys.__getitem__
1493 self.assertEqual(max(data, key=f),
1494 sorted(reversed(data), key=f)[-1])
1495
Walter Dörwald919497e2003-01-19 16:23:59 +00001496 def test_min(self):
1497 self.assertEqual(min('123123'), '1')
1498 self.assertEqual(min(1, 2, 3), 1)
1499 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1500 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1501
1502 self.assertEqual(min(1, 2L, 3.0), 1)
1503 self.assertEqual(min(1L, 2.0, 3), 1L)
1504 self.assertEqual(min(1.0, 2, 3L), 1.0)
1505
1506 self.assertRaises(TypeError, min)
1507 self.assertRaises(TypeError, min, 42)
1508 self.assertRaises(ValueError, min, ())
1509 class BadSeq:
1510 def __getitem__(self, index):
1511 raise ValueError
1512 self.assertRaises(ValueError, min, BadSeq())
1513 class BadNumber:
1514 def __cmp__(self, other):
1515 raise ValueError
1516 self.assertRaises(ValueError, min, (42, BadNumber()))
1517
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001518 for stmt in (
1519 "min(key=int)", # no args
1520 "min(1, key=int)", # single arg not iterable
1521 "min(1, 2, keystone=int)", # wrong keyword
1522 "min(1, 2, key=int, abc=int)", # two many keywords
1523 "min(1, 2, key=1)", # keyfunc is not callable
1524 ):
Tim Peters7f061872004-12-07 21:17:46 +00001525 try:
1526 exec(stmt) in globals()
1527 except TypeError:
1528 pass
1529 else:
1530 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001531
1532 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1533 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1534 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1535
1536 data = [random.randrange(200) for i in range(100)]
1537 keys = dict((elem, random.randrange(50)) for elem in data)
1538 f = keys.__getitem__
1539 self.assertEqual(min(data, key=f),
1540 sorted(data, key=f)[0])
1541
Georg Brandl28e08732008-04-30 19:47:09 +00001542 def test_next(self):
1543 it = iter(range(2))
1544 self.assertEqual(next(it), 0)
1545 self.assertEqual(next(it), 1)
1546 self.assertRaises(StopIteration, next, it)
1547 self.assertRaises(StopIteration, next, it)
1548 self.assertEquals(next(it, 42), 42)
1549
1550 class Iter(object):
1551 def __iter__(self):
1552 return self
1553 def next(self):
1554 raise StopIteration
1555
1556 it = iter(Iter())
1557 self.assertEquals(next(it, 42), 42)
1558 self.assertRaises(StopIteration, next, it)
1559
1560 def gen():
1561 yield 1
1562 return
1563
1564 it = gen()
1565 self.assertEquals(next(it), 1)
1566 self.assertRaises(StopIteration, next, it)
1567 self.assertEquals(next(it, 42), 42)
1568
Walter Dörwald919497e2003-01-19 16:23:59 +00001569 def test_oct(self):
1570 self.assertEqual(oct(100), '0144')
1571 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001572 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001573 self.assertEqual(oct(-100L), '-0144L')
1574 self.assertRaises(TypeError, oct, ())
1575
1576 def write_testfile(self):
1577 # NB the first 4 lines are also used to test input and raw_input, below
1578 fp = open(TESTFN, 'w')
1579 try:
1580 fp.write('1+1\n')
1581 fp.write('1+1\n')
1582 fp.write('The quick brown fox jumps over the lazy dog')
1583 fp.write('.\n')
1584 fp.write('Dear John\n')
1585 fp.write('XXX'*100)
1586 fp.write('YYY'*100)
1587 finally:
1588 fp.close()
1589
1590 def test_open(self):
1591 self.write_testfile()
1592 fp = open(TESTFN, 'r')
1593 try:
1594 self.assertEqual(fp.readline(4), '1+1\n')
1595 self.assertEqual(fp.readline(4), '1+1\n')
1596 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1597 self.assertEqual(fp.readline(4), 'Dear')
1598 self.assertEqual(fp.readline(100), ' John\n')
1599 self.assertEqual(fp.read(300), 'XXX'*100)
1600 self.assertEqual(fp.read(1000), 'YYY'*100)
1601 finally:
1602 fp.close()
1603 unlink(TESTFN)
1604
1605 def test_ord(self):
1606 self.assertEqual(ord(' '), 32)
1607 self.assertEqual(ord('A'), 65)
1608 self.assertEqual(ord('a'), 97)
1609 if have_unicode:
1610 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1611 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001612 if have_unicode:
1613 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001614
1615 def test_pow(self):
1616 self.assertEqual(pow(0,0), 1)
1617 self.assertEqual(pow(0,1), 0)
1618 self.assertEqual(pow(1,0), 1)
1619 self.assertEqual(pow(1,1), 1)
1620
1621 self.assertEqual(pow(2,0), 1)
1622 self.assertEqual(pow(2,10), 1024)
1623 self.assertEqual(pow(2,20), 1024*1024)
1624 self.assertEqual(pow(2,30), 1024*1024*1024)
1625
1626 self.assertEqual(pow(-2,0), 1)
1627 self.assertEqual(pow(-2,1), -2)
1628 self.assertEqual(pow(-2,2), 4)
1629 self.assertEqual(pow(-2,3), -8)
1630
1631 self.assertEqual(pow(0L,0), 1)
1632 self.assertEqual(pow(0L,1), 0)
1633 self.assertEqual(pow(1L,0), 1)
1634 self.assertEqual(pow(1L,1), 1)
1635
1636 self.assertEqual(pow(2L,0), 1)
1637 self.assertEqual(pow(2L,10), 1024)
1638 self.assertEqual(pow(2L,20), 1024*1024)
1639 self.assertEqual(pow(2L,30), 1024*1024*1024)
1640
1641 self.assertEqual(pow(-2L,0), 1)
1642 self.assertEqual(pow(-2L,1), -2)
1643 self.assertEqual(pow(-2L,2), 4)
1644 self.assertEqual(pow(-2L,3), -8)
1645
1646 self.assertAlmostEqual(pow(0.,0), 1.)
1647 self.assertAlmostEqual(pow(0.,1), 0.)
1648 self.assertAlmostEqual(pow(1.,0), 1.)
1649 self.assertAlmostEqual(pow(1.,1), 1.)
1650
1651 self.assertAlmostEqual(pow(2.,0), 1.)
1652 self.assertAlmostEqual(pow(2.,10), 1024.)
1653 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1654 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1655
1656 self.assertAlmostEqual(pow(-2.,0), 1.)
1657 self.assertAlmostEqual(pow(-2.,1), -2.)
1658 self.assertAlmostEqual(pow(-2.,2), 4.)
1659 self.assertAlmostEqual(pow(-2.,3), -8.)
1660
1661 for x in 2, 2L, 2.0:
1662 for y in 10, 10L, 10.0:
1663 for z in 1000, 1000L, 1000.0:
1664 if isinstance(x, float) or \
1665 isinstance(y, float) or \
1666 isinstance(z, float):
1667 self.assertRaises(TypeError, pow, x, y, z)
1668 else:
1669 self.assertAlmostEqual(pow(x, y, z), 24.0)
1670
1671 self.assertRaises(TypeError, pow, -1, -2, 3)
1672 self.assertRaises(ValueError, pow, 1, 2, 0)
1673 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1674 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001675 # Will return complex in 3.0:
1676 self.assertRaises(ValueError, pow, -342.43, 0.234)
Walter Dörwald919497e2003-01-19 16:23:59 +00001677
1678 self.assertRaises(TypeError, pow)
1679
1680 def test_range(self):
1681 self.assertEqual(range(3), [0, 1, 2])
1682 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1683 self.assertEqual(range(0), [])
1684 self.assertEqual(range(-3), [])
1685 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1686 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1687
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001688 # Now test range() with longs
1689 self.assertEqual(range(-2**100), [])
1690 self.assertEqual(range(0, -2**100), [])
1691 self.assertEqual(range(0, 2**100, -1), [])
1692 self.assertEqual(range(0, 2**100, -1), [])
1693
1694 a = long(10 * sys.maxint)
1695 b = long(100 * sys.maxint)
1696 c = long(50 * sys.maxint)
1697
1698 self.assertEqual(range(a, a+2), [a, a+1])
1699 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1700 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1701
1702 seq = range(a, b, c)
1703 self.assert_(a in seq)
1704 self.assert_(b not in seq)
1705 self.assertEqual(len(seq), 2)
1706
1707 seq = range(b, a, -c)
1708 self.assert_(b in seq)
1709 self.assert_(a not in seq)
1710 self.assertEqual(len(seq), 2)
1711
1712 seq = range(-a, -b, -c)
1713 self.assert_(-a in seq)
1714 self.assert_(-b not in seq)
1715 self.assertEqual(len(seq), 2)
1716
Walter Dörwald919497e2003-01-19 16:23:59 +00001717 self.assertRaises(TypeError, range)
1718 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1719 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001720 self.assertRaises(ValueError, range, a, a + 1, long(0))
1721
1722 class badzero(int):
1723 def __cmp__(self, other):
1724 raise RuntimeError
1725 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001726
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001727 # Reject floats when it would require PyLongs to represent.
1728 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001729 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001730
Walter Dörwald357981e2003-04-15 18:59:28 +00001731 self.assertRaises(TypeError, range, 0, "spam")
1732 self.assertRaises(TypeError, range, 0, 42, "spam")
1733
1734 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1735 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1736
Walter Dörwald919497e2003-01-19 16:23:59 +00001737 def test_input_and_raw_input(self):
1738 self.write_testfile()
1739 fp = open(TESTFN, 'r')
1740 savestdin = sys.stdin
1741 savestdout = sys.stdout # Eats the echo
1742 try:
1743 sys.stdin = fp
1744 sys.stdout = BitBucket()
1745 self.assertEqual(input(), 2)
1746 self.assertEqual(input('testing\n'), 2)
1747 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1748 self.assertEqual(raw_input('testing\n'), 'Dear John')
Tim Peters8e24a962006-08-09 00:52:26 +00001749
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001750 # SF 1535165: don't segfault on closed stdin
1751 # sys.stdout must be a regular file for triggering
1752 sys.stdout = savestdout
1753 sys.stdin.close()
Georg Brandld336e982006-08-06 09:17:16 +00001754 self.assertRaises(ValueError, input)
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001755
1756 sys.stdout = BitBucket()
Walter Dörwald919497e2003-01-19 16:23:59 +00001757 sys.stdin = cStringIO.StringIO("NULL\0")
1758 self.assertRaises(TypeError, input, 42, 42)
1759 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1760 self.assertEqual(input(), 'whitespace')
1761 sys.stdin = cStringIO.StringIO()
1762 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001763
1764 # SF 876178: make sure input() respect future options.
1765 sys.stdin = cStringIO.StringIO('1/2')
1766 sys.stdout = cStringIO.StringIO()
1767 exec compile('print input()', 'test_builtin_tmp', 'exec')
1768 sys.stdin.seek(0, 0)
1769 exec compile('from __future__ import division;print input()',
1770 'test_builtin_tmp', 'exec')
1771 sys.stdin.seek(0, 0)
1772 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001773 # The result we expect depends on whether new division semantics
1774 # are already in effect.
1775 if 1/2 == 0:
1776 # This test was compiled with old semantics.
1777 expected = ['0', '0.5', '0']
1778 else:
1779 # This test was compiled with new semantics (e.g., -Qnew
1780 # was given on the command line.
1781 expected = ['0.5', '0.5', '0.5']
1782 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001783
Walter Dörwald919497e2003-01-19 16:23:59 +00001784 del sys.stdout
1785 self.assertRaises(RuntimeError, input, 'prompt')
1786 del sys.stdin
1787 self.assertRaises(RuntimeError, input, 'prompt')
1788 finally:
1789 sys.stdin = savestdin
1790 sys.stdout = savestdout
1791 fp.close()
1792 unlink(TESTFN)
1793
1794 def test_reduce(self):
1795 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1796 self.assertEqual(
1797 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1798 ['a','c','d','w']
1799 )
1800 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1801 self.assertEqual(
1802 reduce(lambda x, y: x*y, range(2,21), 1L),
1803 2432902008176640000L
1804 )
1805 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1806 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1807 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1808 self.assertRaises(TypeError, reduce)
1809 self.assertRaises(TypeError, reduce, 42, 42)
1810 self.assertRaises(TypeError, reduce, 42, 42, 42)
1811 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1812 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1813 self.assertRaises(TypeError, reduce, 42, (42, 42))
1814
1815 class BadSeq:
1816 def __getitem__(self, index):
1817 raise ValueError
1818 self.assertRaises(ValueError, reduce, 42, BadSeq())
1819
1820 def test_reload(self):
1821 import marshal
1822 reload(marshal)
1823 import string
1824 reload(string)
1825 ## import sys
1826 ## self.assertRaises(ImportError, reload, sys)
1827
1828 def test_repr(self):
1829 self.assertEqual(repr(''), '\'\'')
1830 self.assertEqual(repr(0), '0')
1831 self.assertEqual(repr(0L), '0L')
1832 self.assertEqual(repr(()), '()')
1833 self.assertEqual(repr([]), '[]')
1834 self.assertEqual(repr({}), '{}')
1835 a = []
1836 a.append(a)
1837 self.assertEqual(repr(a), '[[...]]')
1838 a = {}
1839 a[0] = a
1840 self.assertEqual(repr(a), '{0: {...}}')
1841
1842 def test_round(self):
1843 self.assertEqual(round(0.0), 0.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001844 self.assertEqual(type(round(0.0)), float) # Will be int in 3.0.
Walter Dörwald919497e2003-01-19 16:23:59 +00001845 self.assertEqual(round(1.0), 1.0)
1846 self.assertEqual(round(10.0), 10.0)
1847 self.assertEqual(round(1000000000.0), 1000000000.0)
1848 self.assertEqual(round(1e20), 1e20)
1849
1850 self.assertEqual(round(-1.0), -1.0)
1851 self.assertEqual(round(-10.0), -10.0)
1852 self.assertEqual(round(-1000000000.0), -1000000000.0)
1853 self.assertEqual(round(-1e20), -1e20)
1854
1855 self.assertEqual(round(0.1), 0.0)
1856 self.assertEqual(round(1.1), 1.0)
1857 self.assertEqual(round(10.1), 10.0)
1858 self.assertEqual(round(1000000000.1), 1000000000.0)
1859
1860 self.assertEqual(round(-1.1), -1.0)
1861 self.assertEqual(round(-10.1), -10.0)
1862 self.assertEqual(round(-1000000000.1), -1000000000.0)
1863
1864 self.assertEqual(round(0.9), 1.0)
1865 self.assertEqual(round(9.9), 10.0)
1866 self.assertEqual(round(999999999.9), 1000000000.0)
1867
1868 self.assertEqual(round(-0.9), -1.0)
1869 self.assertEqual(round(-9.9), -10.0)
1870 self.assertEqual(round(-999999999.9), -1000000000.0)
1871
1872 self.assertEqual(round(-8.0, -1), -10.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001873 self.assertEqual(type(round(-8.0, -1)), float)
1874
1875 self.assertEqual(type(round(-8.0, 0)), float)
1876 self.assertEqual(type(round(-8.0, 1)), float)
1877
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001878 # Check half rounding behaviour.
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001879 self.assertEqual(round(5.5), 6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001880 self.assertEqual(round(6.5), 7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001881 self.assertEqual(round(-5.5), -6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001882 self.assertEqual(round(-6.5), -7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001883
1884 # Check behavior on ints
1885 self.assertEqual(round(0), 0)
1886 self.assertEqual(round(8), 8)
1887 self.assertEqual(round(-8), -8)
1888 self.assertEqual(type(round(0)), float) # Will be int in 3.0.
1889 self.assertEqual(type(round(-8, -1)), float)
1890 self.assertEqual(type(round(-8, 0)), float)
1891 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001892
Georg Brandlccadf842006-03-31 18:54:53 +00001893 # test new kwargs
1894 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1895
Walter Dörwald919497e2003-01-19 16:23:59 +00001896 self.assertRaises(TypeError, round)
1897
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001898 # test generic rounding delegation for reals
1899 class TestRound(object):
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001900 def __float__(self):
1901 return 23.0
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001902
1903 class TestNoRound(object):
1904 pass
1905
1906 self.assertEqual(round(TestRound()), 23)
1907
1908 self.assertRaises(TypeError, round, 1, 2, 3)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001909 self.assertRaises(TypeError, round, TestNoRound())
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001910
1911 t = TestNoRound()
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001912 t.__float__ = lambda *args: args
1913 self.assertRaises(TypeError, round, t)
1914 self.assertRaises(TypeError, round, t, 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001915
Walter Dörwald919497e2003-01-19 16:23:59 +00001916 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001917 setattr(sys, 'spam', 1)
1918 self.assertEqual(sys.spam, 1)
1919 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1920 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001921
1922 def test_str(self):
1923 self.assertEqual(str(''), '')
1924 self.assertEqual(str(0), '0')
1925 self.assertEqual(str(0L), '0')
1926 self.assertEqual(str(()), '()')
1927 self.assertEqual(str([]), '[]')
1928 self.assertEqual(str({}), '{}')
1929 a = []
1930 a.append(a)
1931 self.assertEqual(str(a), '[[...]]')
1932 a = {}
1933 a[0] = a
1934 self.assertEqual(str(a), '{0: {...}}')
1935
Alex Martellia70b1912003-04-22 08:12:33 +00001936 def test_sum(self):
1937 self.assertEqual(sum([]), 0)
1938 self.assertEqual(sum(range(2,8)), 27)
1939 self.assertEqual(sum(iter(range(2,8))), 27)
1940 self.assertEqual(sum(Squares(10)), 285)
1941 self.assertEqual(sum(iter(Squares(10))), 285)
1942 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1943
1944 self.assertRaises(TypeError, sum)
1945 self.assertRaises(TypeError, sum, 42)
1946 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1947 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1948 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1949 self.assertRaises(TypeError, sum, [{2:3}])
1950 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1951
1952 class BadSeq:
1953 def __getitem__(self, index):
1954 raise ValueError
1955 self.assertRaises(ValueError, sum, BadSeq())
1956
Walter Dörwald919497e2003-01-19 16:23:59 +00001957 def test_tuple(self):
1958 self.assertEqual(tuple(()), ())
1959 t0_3 = (0, 1, 2, 3)
1960 t0_3_bis = tuple(t0_3)
1961 self.assert_(t0_3 is t0_3_bis)
1962 self.assertEqual(tuple([]), ())
1963 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1964 self.assertEqual(tuple(''), ())
1965 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1966
1967 def test_type(self):
1968 self.assertEqual(type(''), type('123'))
1969 self.assertNotEqual(type(''), type(()))
1970
1971 def test_unichr(self):
1972 if have_unicode:
1973 self.assertEqual(unichr(32), unicode(' '))
1974 self.assertEqual(unichr(65), unicode('A'))
1975 self.assertEqual(unichr(97), unicode('a'))
1976 self.assertEqual(
1977 unichr(sys.maxunicode),
1978 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1979 )
1980 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1981 self.assertRaises(TypeError, unichr)
1982
Guido van Rossumfee7b932005-01-16 00:21:28 +00001983 # We don't want self in vars(), so these are static methods
1984
1985 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001986 def get_vars_f0():
1987 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001988
Guido van Rossumfee7b932005-01-16 00:21:28 +00001989 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001990 def get_vars_f2():
1991 BuiltinTest.get_vars_f0()
1992 a = 1
1993 b = 2
1994 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001995
1996 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001997 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001998 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001999 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00002000 self.assertEqual(self.get_vars_f0(), {})
2001 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
2002 self.assertRaises(TypeError, vars, 42, 42)
2003 self.assertRaises(TypeError, vars, 42)
2004
2005 def test_zip(self):
2006 a = (1, 2, 3)
2007 b = (4, 5, 6)
2008 t = [(1, 4), (2, 5), (3, 6)]
2009 self.assertEqual(zip(a, b), t)
2010 b = [4, 5, 6]
2011 self.assertEqual(zip(a, b), t)
2012 b = (4, 5, 6, 7)
2013 self.assertEqual(zip(a, b), t)
2014 class I:
2015 def __getitem__(self, i):
2016 if i < 0 or i > 2: raise IndexError
2017 return i + 4
2018 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00002019 self.assertEqual(zip(), [])
2020 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00002021 self.assertRaises(TypeError, zip, None)
2022 class G:
2023 pass
2024 self.assertRaises(TypeError, zip, a, G())
2025
2026 # Make sure zip doesn't try to allocate a billion elements for the
2027 # result list when one of its arguments doesn't say how long it is.
2028 # A MemoryError is the most likely failure mode.
2029 class SequenceWithoutALength:
2030 def __getitem__(self, i):
2031 if i == 5:
2032 raise IndexError
2033 else:
2034 return i
2035 self.assertEqual(
2036 zip(SequenceWithoutALength(), xrange(2**30)),
2037 list(enumerate(range(5)))
2038 )
2039
2040 class BadSeq:
2041 def __getitem__(self, i):
2042 if i == 5:
2043 raise ValueError
2044 else:
2045 return i
2046 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
2047
Eric Smitha9f7d622008-02-17 19:46:49 +00002048 def test_format(self):
2049 # Test the basic machinery of the format() builtin. Don't test
2050 # the specifics of the various formatters
2051 self.assertEqual(format(3, ''), '3')
2052
2053 # Returns some classes to use for various tests. There's
2054 # an old-style version, and a new-style version
2055 def classes_new():
2056 class A(object):
2057 def __init__(self, x):
2058 self.x = x
2059 def __format__(self, format_spec):
2060 return str(self.x) + format_spec
2061 class DerivedFromA(A):
2062 pass
2063
2064 class Simple(object): pass
2065 class DerivedFromSimple(Simple):
2066 def __init__(self, x):
2067 self.x = x
2068 def __format__(self, format_spec):
2069 return str(self.x) + format_spec
2070 class DerivedFromSimple2(DerivedFromSimple): pass
2071 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
2072
2073 # In 3.0, classes_classic has the same meaning as classes_new
2074 def classes_classic():
2075 class A:
2076 def __init__(self, x):
2077 self.x = x
2078 def __format__(self, format_spec):
2079 return str(self.x) + format_spec
2080 class DerivedFromA(A):
2081 pass
2082
2083 class Simple: pass
2084 class DerivedFromSimple(Simple):
2085 def __init__(self, x):
2086 self.x = x
2087 def __format__(self, format_spec):
2088 return str(self.x) + format_spec
2089 class DerivedFromSimple2(DerivedFromSimple): pass
2090 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
2091
2092 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
2093 self.assertEqual(format(A(3), 'spec'), '3spec')
2094 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
2095 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
2096 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
2097 '10abcdef')
2098
2099 class_test(*classes_new())
2100 class_test(*classes_classic())
2101
2102 def empty_format_spec(value):
2103 # test that:
2104 # format(x, '') == str(x)
2105 # format(x) == str(x)
2106 self.assertEqual(format(value, ""), str(value))
2107 self.assertEqual(format(value), str(value))
2108
2109 # for builtin types, format(x, "") == str(x)
2110 empty_format_spec(17**13)
2111 empty_format_spec(1.0)
2112 empty_format_spec(3.1415e104)
2113 empty_format_spec(-3.1415e104)
2114 empty_format_spec(3.1415e-104)
2115 empty_format_spec(-3.1415e-104)
2116 empty_format_spec(object)
2117 empty_format_spec(None)
2118
2119 # TypeError because self.__format__ returns the wrong type
2120 class BadFormatResult:
2121 def __format__(self, format_spec):
2122 return 1.0
2123 self.assertRaises(TypeError, format, BadFormatResult(), "")
2124
2125 # TypeError because format_spec is not unicode or str
2126 self.assertRaises(TypeError, format, object(), 4)
2127 self.assertRaises(TypeError, format, object(), object())
2128
2129 # tests for object.__format__ really belong elsewhere, but
2130 # there's no good place to put them
2131 x = object().__format__('')
2132 self.assert_(x.startswith('<object object at'))
2133
2134 # first argument to object.__format__ must be string
2135 self.assertRaises(TypeError, object().__format__, 3)
2136 self.assertRaises(TypeError, object().__format__, object())
2137 self.assertRaises(TypeError, object().__format__, None)
2138
2139 # make sure we can take a subclass of str as a format spec
2140 class DerivedFromStr(str): pass
2141 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
2142
Eric Smithfb0742f2008-02-22 17:43:17 +00002143 def test_bin(self):
2144 self.assertEqual(bin(0), '0b0')
2145 self.assertEqual(bin(1), '0b1')
2146 self.assertEqual(bin(-1), '-0b1')
2147 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
2148 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
2149 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
2150 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
2151
Eric Smithce584d42008-02-21 20:17:08 +00002152class TestSorted(unittest.TestCase):
2153
2154 def test_basic(self):
2155 data = range(100)
2156 copy = data[:]
2157 random.shuffle(copy)
2158 self.assertEqual(data, sorted(copy))
2159 self.assertNotEqual(data, copy)
2160
2161 data.reverse()
2162 random.shuffle(copy)
2163 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
2164 self.assertNotEqual(data, copy)
2165 random.shuffle(copy)
2166 self.assertEqual(data, sorted(copy, key=lambda x: -x))
2167 self.assertNotEqual(data, copy)
2168 random.shuffle(copy)
2169 self.assertEqual(data, sorted(copy, reverse=1))
2170 self.assertNotEqual(data, copy)
2171
2172 def test_inputtypes(self):
2173 s = 'abracadabra'
2174 types = [list, tuple]
2175 if have_unicode:
2176 types.insert(0, unicode)
2177 for T in types:
2178 self.assertEqual(sorted(s), sorted(T(s)))
2179
2180 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
2181 types = [set, frozenset, list, tuple, dict.fromkeys]
2182 if have_unicode:
2183 types.insert(0, unicode)
2184 for T in types:
2185 self.assertEqual(sorted(s), sorted(T(s)))
2186
2187 def test_baddecorator(self):
2188 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
2189 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
2190
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00002191def test_main(verbose=None):
2192 test_classes = (BuiltinTest, TestSorted)
2193
2194 run_unittest(*test_classes)
2195
2196 # verify reference counting
2197 if verbose and hasattr(sys, "gettotalrefcount"):
2198 import gc
2199 counts = [None] * 5
2200 for i in xrange(len(counts)):
2201 run_unittest(*test_classes)
2202 gc.collect()
2203 counts[i] = sys.gettotalrefcount()
2204 print counts
2205
Walter Dörwald919497e2003-01-19 16:23:59 +00002206
2207if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00002208 test_main(verbose=True)