blob: 4057ba1c96358eb51747c65ad273ba9e74beb70f [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
856
Tim Petersb713ec22006-05-23 18:45:30 +0000857 # SF bug 1334662: int(string, base) wrong answers
858 # Various representations of 2**32 evaluated to 0
859 # rather than 2**32 in previous versions
860
861 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
862 self.assertEqual(int('102002022201221111211', 3), 4294967296L)
863 self.assertEqual(int('10000000000000000', 4), 4294967296L)
864 self.assertEqual(int('32244002423141', 5), 4294967296L)
865 self.assertEqual(int('1550104015504', 6), 4294967296L)
866 self.assertEqual(int('211301422354', 7), 4294967296L)
867 self.assertEqual(int('40000000000', 8), 4294967296L)
868 self.assertEqual(int('12068657454', 9), 4294967296L)
869 self.assertEqual(int('4294967296', 10), 4294967296L)
870 self.assertEqual(int('1904440554', 11), 4294967296L)
871 self.assertEqual(int('9ba461594', 12), 4294967296L)
872 self.assertEqual(int('535a79889', 13), 4294967296L)
873 self.assertEqual(int('2ca5b7464', 14), 4294967296L)
874 self.assertEqual(int('1a20dcd81', 15), 4294967296L)
875 self.assertEqual(int('100000000', 16), 4294967296L)
876 self.assertEqual(int('a7ffda91', 17), 4294967296L)
877 self.assertEqual(int('704he7g4', 18), 4294967296L)
878 self.assertEqual(int('4f5aff66', 19), 4294967296L)
879 self.assertEqual(int('3723ai4g', 20), 4294967296L)
880 self.assertEqual(int('281d55i4', 21), 4294967296L)
881 self.assertEqual(int('1fj8b184', 22), 4294967296L)
882 self.assertEqual(int('1606k7ic', 23), 4294967296L)
883 self.assertEqual(int('mb994ag', 24), 4294967296L)
884 self.assertEqual(int('hek2mgl', 25), 4294967296L)
885 self.assertEqual(int('dnchbnm', 26), 4294967296L)
886 self.assertEqual(int('b28jpdm', 27), 4294967296L)
887 self.assertEqual(int('8pfgih4', 28), 4294967296L)
888 self.assertEqual(int('76beigg', 29), 4294967296L)
889 self.assertEqual(int('5qmcpqg', 30), 4294967296L)
890 self.assertEqual(int('4q0jto4', 31), 4294967296L)
891 self.assertEqual(int('4000000', 32), 4294967296L)
892 self.assertEqual(int('3aokq94', 33), 4294967296L)
893 self.assertEqual(int('2qhxjli', 34), 4294967296L)
894 self.assertEqual(int('2br45qb', 35), 4294967296L)
895 self.assertEqual(int('1z141z4', 36), 4294967296L)
896
897 # SF bug 1334662: int(string, base) wrong answers
898 # Checks for proper evaluation of 2**32 + 1
899 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
900 self.assertEqual(int('102002022201221111212', 3), 4294967297L)
901 self.assertEqual(int('10000000000000001', 4), 4294967297L)
902 self.assertEqual(int('32244002423142', 5), 4294967297L)
903 self.assertEqual(int('1550104015505', 6), 4294967297L)
904 self.assertEqual(int('211301422355', 7), 4294967297L)
905 self.assertEqual(int('40000000001', 8), 4294967297L)
906 self.assertEqual(int('12068657455', 9), 4294967297L)
907 self.assertEqual(int('4294967297', 10), 4294967297L)
908 self.assertEqual(int('1904440555', 11), 4294967297L)
909 self.assertEqual(int('9ba461595', 12), 4294967297L)
910 self.assertEqual(int('535a7988a', 13), 4294967297L)
911 self.assertEqual(int('2ca5b7465', 14), 4294967297L)
912 self.assertEqual(int('1a20dcd82', 15), 4294967297L)
913 self.assertEqual(int('100000001', 16), 4294967297L)
914 self.assertEqual(int('a7ffda92', 17), 4294967297L)
915 self.assertEqual(int('704he7g5', 18), 4294967297L)
916 self.assertEqual(int('4f5aff67', 19), 4294967297L)
917 self.assertEqual(int('3723ai4h', 20), 4294967297L)
918 self.assertEqual(int('281d55i5', 21), 4294967297L)
919 self.assertEqual(int('1fj8b185', 22), 4294967297L)
920 self.assertEqual(int('1606k7id', 23), 4294967297L)
921 self.assertEqual(int('mb994ah', 24), 4294967297L)
922 self.assertEqual(int('hek2mgm', 25), 4294967297L)
923 self.assertEqual(int('dnchbnn', 26), 4294967297L)
924 self.assertEqual(int('b28jpdn', 27), 4294967297L)
925 self.assertEqual(int('8pfgih5', 28), 4294967297L)
926 self.assertEqual(int('76beigh', 29), 4294967297L)
927 self.assertEqual(int('5qmcpqh', 30), 4294967297L)
928 self.assertEqual(int('4q0jto5', 31), 4294967297L)
929 self.assertEqual(int('4000001', 32), 4294967297L)
930 self.assertEqual(int('3aokq95', 33), 4294967297L)
931 self.assertEqual(int('2qhxjlj', 34), 4294967297L)
932 self.assertEqual(int('2br45qc', 35), 4294967297L)
933 self.assertEqual(int('1z141z5', 36), 4294967297L)
934
Brett Cannonc3647ac2005-04-26 03:45:26 +0000935 def test_intconversion(self):
936 # Test __int__()
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +0000937 class ClassicMissingMethods:
938 pass
939 self.assertRaises(AttributeError, int, ClassicMissingMethods())
940
941 class MissingMethods(object):
942 pass
943 self.assertRaises(TypeError, int, MissingMethods())
944
Brett Cannonc3647ac2005-04-26 03:45:26 +0000945 class Foo0:
946 def __int__(self):
947 return 42
948
949 class Foo1(object):
950 def __int__(self):
951 return 42
952
953 class Foo2(int):
954 def __int__(self):
955 return 42
956
957 class Foo3(int):
958 def __int__(self):
959 return self
960
961 class Foo4(int):
962 def __int__(self):
963 return 42L
964
965 class Foo5(int):
966 def __int__(self):
967 return 42.
968
969 self.assertEqual(int(Foo0()), 42)
970 self.assertEqual(int(Foo1()), 42)
971 self.assertEqual(int(Foo2()), 42)
972 self.assertEqual(int(Foo3()), 0)
973 self.assertEqual(int(Foo4()), 42L)
974 self.assertRaises(TypeError, int, Foo5())
975
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +0000976 class Classic:
977 pass
978 for base in (object, Classic):
979 class IntOverridesTrunc(base):
980 def __int__(self):
981 return 42
982 def __trunc__(self):
983 return -12
984 self.assertEqual(int(IntOverridesTrunc()), 42)
985
986 class JustTrunc(base):
987 def __trunc__(self):
988 return 42
989 self.assertEqual(int(JustTrunc()), 42)
990
991 for trunc_result_base in (object, Classic):
992 class Integral(trunc_result_base):
993 def __int__(self):
994 return 42
995
996 class TruncReturnsNonInt(base):
997 def __trunc__(self):
998 return Integral()
999 self.assertEqual(int(TruncReturnsNonInt()), 42)
1000
1001 class NonIntegral(trunc_result_base):
1002 def __trunc__(self):
1003 # Check that we avoid infinite recursion.
1004 return NonIntegral()
1005
1006 class TruncReturnsNonIntegral(base):
1007 def __trunc__(self):
1008 return NonIntegral()
1009 try:
1010 int(TruncReturnsNonIntegral())
1011 except TypeError as e:
1012 self.assertEquals(str(e),
1013 "__trunc__ returned non-Integral"
1014 " (type NonIntegral)")
1015 else:
1016 self.fail("Failed to raise TypeError with %s" %
1017 ((base, trunc_result_base),))
1018
Walter Dörwald919497e2003-01-19 16:23:59 +00001019 def test_intern(self):
1020 self.assertRaises(TypeError, intern)
1021 s = "never interned before"
1022 self.assert_(intern(s) is s)
1023 s2 = s.swapcase().swapcase()
1024 self.assert_(intern(s2) is s)
1025
Jeremy Hylton4c989dd2004-08-07 19:20:05 +00001026 # Subclasses of string can't be interned, because they
1027 # provide too much opportunity for insane things to happen.
1028 # We don't want them in the interned dict and if they aren't
1029 # actually interned, we don't want to create the appearance
1030 # that they are by allowing intern() to succeeed.
1031 class S(str):
1032 def __hash__(self):
1033 return 123
1034
1035 self.assertRaises(TypeError, intern, S("abc"))
1036
1037 # It's still safe to pass these strings to routines that
1038 # call intern internally, e.g. PyObject_SetAttr().
1039 s = S("abc")
1040 setattr(s, s, s)
1041 self.assertEqual(getattr(s, s), s)
1042
Walter Dörwald919497e2003-01-19 16:23:59 +00001043 def test_iter(self):
1044 self.assertRaises(TypeError, iter)
1045 self.assertRaises(TypeError, iter, 42, 42)
1046 lists = [("1", "2"), ["1", "2"], "12"]
1047 if have_unicode:
1048 lists.append(unicode("12"))
1049 for l in lists:
1050 i = iter(l)
1051 self.assertEqual(i.next(), '1')
1052 self.assertEqual(i.next(), '2')
1053 self.assertRaises(StopIteration, i.next)
1054
1055 def test_isinstance(self):
1056 class C:
1057 pass
1058 class D(C):
1059 pass
1060 class E:
1061 pass
1062 c = C()
1063 d = D()
1064 e = E()
1065 self.assert_(isinstance(c, C))
1066 self.assert_(isinstance(d, C))
1067 self.assert_(not isinstance(e, C))
1068 self.assert_(not isinstance(c, D))
1069 self.assert_(not isinstance('foo', E))
1070 self.assertRaises(TypeError, isinstance, E, 'foo')
1071 self.assertRaises(TypeError, isinstance)
1072
1073 def test_issubclass(self):
1074 class C:
1075 pass
1076 class D(C):
1077 pass
1078 class E:
1079 pass
1080 c = C()
1081 d = D()
1082 e = E()
1083 self.assert_(issubclass(D, C))
1084 self.assert_(issubclass(C, C))
1085 self.assert_(not issubclass(C, D))
1086 self.assertRaises(TypeError, issubclass, 'foo', E)
1087 self.assertRaises(TypeError, issubclass, E, 'foo')
1088 self.assertRaises(TypeError, issubclass)
1089
1090 def test_len(self):
1091 self.assertEqual(len('123'), 3)
1092 self.assertEqual(len(()), 0)
1093 self.assertEqual(len((1, 2, 3, 4)), 4)
1094 self.assertEqual(len([1, 2, 3, 4]), 4)
1095 self.assertEqual(len({}), 0)
1096 self.assertEqual(len({'a':1, 'b': 2}), 2)
1097 class BadSeq:
1098 def __len__(self):
1099 raise ValueError
1100 self.assertRaises(ValueError, len, BadSeq())
1101
1102 def test_list(self):
1103 self.assertEqual(list([]), [])
1104 l0_3 = [0, 1, 2, 3]
1105 l0_3_bis = list(l0_3)
1106 self.assertEqual(l0_3, l0_3_bis)
1107 self.assert_(l0_3 is not l0_3_bis)
1108 self.assertEqual(list(()), [])
1109 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
1110 self.assertEqual(list(''), [])
1111 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
1112
1113 if sys.maxint == 0x7fffffff:
1114 # This test can currently only work on 32-bit machines.
1115 # XXX If/when PySequence_Length() returns a ssize_t, it should be
1116 # XXX re-enabled.
1117 # Verify clearing of bug #556025.
1118 # This assumes that the max data size (sys.maxint) == max
1119 # address size this also assumes that the address size is at
1120 # least 4 bytes with 8 byte addresses, the bug is not well
1121 # tested
1122 #
1123 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
1124 # earlier due to a newlib bug. See the following mailing list
1125 # thread for the details:
1126
1127 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
1128 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
1129
Raymond Hettingeraa241e02004-09-26 19:24:20 +00001130 # This code used to segfault in Py2.4a3
1131 x = []
1132 x.extend(-y for y in x)
1133 self.assertEqual(x, [])
1134
Walter Dörwald919497e2003-01-19 16:23:59 +00001135 def test_long(self):
1136 self.assertEqual(long(314), 314L)
1137 self.assertEqual(long(3.14), 3L)
1138 self.assertEqual(long(314L), 314L)
1139 # Check that conversion from float truncates towards zero
1140 self.assertEqual(long(-3.14), -3L)
1141 self.assertEqual(long(3.9), 3L)
1142 self.assertEqual(long(-3.9), -3L)
1143 self.assertEqual(long(3.5), 3L)
1144 self.assertEqual(long(-3.5), -3L)
1145 self.assertEqual(long("-3"), -3L)
1146 if have_unicode:
1147 self.assertEqual(long(unicode("-3")), -3L)
1148 # Different base:
1149 self.assertEqual(long("10",16), 16L)
1150 if have_unicode:
1151 self.assertEqual(long(unicode("10"),16), 16L)
1152 # Check conversions from string (same test set as for int(), and then some)
1153 LL = [
1154 ('1' + '0'*20, 10L**20),
1155 ('1' + '0'*100, 10L**100)
1156 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +00001157 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +00001158 if have_unicode:
1159 L2 += [
1160 (unicode('1') + unicode('0')*20, 10L**20),
1161 (unicode('1') + unicode('0')*100, 10L**100),
1162 ]
1163 for s, v in L2 + LL:
1164 for sign in "", "+", "-":
1165 for prefix in "", " ", "\t", " \t\t ":
1166 ss = prefix + sign + s
1167 vv = v
1168 if sign == "-" and v is not ValueError:
1169 vv = -v
1170 try:
1171 self.assertEqual(long(ss), long(vv))
1172 except v:
1173 pass
1174
1175 self.assertRaises(ValueError, long, '123\0')
1176 self.assertRaises(ValueError, long, '53', 40)
1177 self.assertRaises(TypeError, long, 1, 12)
1178
Georg Brandl00cd8182007-03-06 18:41:12 +00001179 # SF patch #1638879: embedded NULs were not detected with
1180 # explicit base
1181 self.assertRaises(ValueError, long, '123\0', 10)
1182 self.assertRaises(ValueError, long, '123\x00 245', 20)
1183
Tim Peters696cf432006-05-24 21:10:40 +00001184 self.assertEqual(long('100000000000000000000000000000000', 2),
1185 4294967296)
1186 self.assertEqual(long('102002022201221111211', 3), 4294967296)
1187 self.assertEqual(long('10000000000000000', 4), 4294967296)
1188 self.assertEqual(long('32244002423141', 5), 4294967296)
1189 self.assertEqual(long('1550104015504', 6), 4294967296)
1190 self.assertEqual(long('211301422354', 7), 4294967296)
1191 self.assertEqual(long('40000000000', 8), 4294967296)
1192 self.assertEqual(long('12068657454', 9), 4294967296)
1193 self.assertEqual(long('4294967296', 10), 4294967296)
1194 self.assertEqual(long('1904440554', 11), 4294967296)
1195 self.assertEqual(long('9ba461594', 12), 4294967296)
1196 self.assertEqual(long('535a79889', 13), 4294967296)
1197 self.assertEqual(long('2ca5b7464', 14), 4294967296)
1198 self.assertEqual(long('1a20dcd81', 15), 4294967296)
1199 self.assertEqual(long('100000000', 16), 4294967296)
1200 self.assertEqual(long('a7ffda91', 17), 4294967296)
1201 self.assertEqual(long('704he7g4', 18), 4294967296)
1202 self.assertEqual(long('4f5aff66', 19), 4294967296)
1203 self.assertEqual(long('3723ai4g', 20), 4294967296)
1204 self.assertEqual(long('281d55i4', 21), 4294967296)
1205 self.assertEqual(long('1fj8b184', 22), 4294967296)
1206 self.assertEqual(long('1606k7ic', 23), 4294967296)
1207 self.assertEqual(long('mb994ag', 24), 4294967296)
1208 self.assertEqual(long('hek2mgl', 25), 4294967296)
1209 self.assertEqual(long('dnchbnm', 26), 4294967296)
1210 self.assertEqual(long('b28jpdm', 27), 4294967296)
1211 self.assertEqual(long('8pfgih4', 28), 4294967296)
1212 self.assertEqual(long('76beigg', 29), 4294967296)
1213 self.assertEqual(long('5qmcpqg', 30), 4294967296)
1214 self.assertEqual(long('4q0jto4', 31), 4294967296)
1215 self.assertEqual(long('4000000', 32), 4294967296)
1216 self.assertEqual(long('3aokq94', 33), 4294967296)
1217 self.assertEqual(long('2qhxjli', 34), 4294967296)
1218 self.assertEqual(long('2br45qb', 35), 4294967296)
1219 self.assertEqual(long('1z141z4', 36), 4294967296)
1220
1221 self.assertEqual(long('100000000000000000000000000000001', 2),
1222 4294967297)
1223 self.assertEqual(long('102002022201221111212', 3), 4294967297)
1224 self.assertEqual(long('10000000000000001', 4), 4294967297)
1225 self.assertEqual(long('32244002423142', 5), 4294967297)
1226 self.assertEqual(long('1550104015505', 6), 4294967297)
1227 self.assertEqual(long('211301422355', 7), 4294967297)
1228 self.assertEqual(long('40000000001', 8), 4294967297)
1229 self.assertEqual(long('12068657455', 9), 4294967297)
1230 self.assertEqual(long('4294967297', 10), 4294967297)
1231 self.assertEqual(long('1904440555', 11), 4294967297)
1232 self.assertEqual(long('9ba461595', 12), 4294967297)
1233 self.assertEqual(long('535a7988a', 13), 4294967297)
1234 self.assertEqual(long('2ca5b7465', 14), 4294967297)
1235 self.assertEqual(long('1a20dcd82', 15), 4294967297)
1236 self.assertEqual(long('100000001', 16), 4294967297)
1237 self.assertEqual(long('a7ffda92', 17), 4294967297)
1238 self.assertEqual(long('704he7g5', 18), 4294967297)
1239 self.assertEqual(long('4f5aff67', 19), 4294967297)
1240 self.assertEqual(long('3723ai4h', 20), 4294967297)
1241 self.assertEqual(long('281d55i5', 21), 4294967297)
1242 self.assertEqual(long('1fj8b185', 22), 4294967297)
1243 self.assertEqual(long('1606k7id', 23), 4294967297)
1244 self.assertEqual(long('mb994ah', 24), 4294967297)
1245 self.assertEqual(long('hek2mgm', 25), 4294967297)
1246 self.assertEqual(long('dnchbnn', 26), 4294967297)
1247 self.assertEqual(long('b28jpdn', 27), 4294967297)
1248 self.assertEqual(long('8pfgih5', 28), 4294967297)
1249 self.assertEqual(long('76beigh', 29), 4294967297)
1250 self.assertEqual(long('5qmcpqh', 30), 4294967297)
1251 self.assertEqual(long('4q0jto5', 31), 4294967297)
1252 self.assertEqual(long('4000001', 32), 4294967297)
1253 self.assertEqual(long('3aokq95', 33), 4294967297)
1254 self.assertEqual(long('2qhxjlj', 34), 4294967297)
1255 self.assertEqual(long('2br45qc', 35), 4294967297)
1256 self.assertEqual(long('1z141z5', 36), 4294967297)
1257
1258
Brett Cannonc3647ac2005-04-26 03:45:26 +00001259 def test_longconversion(self):
1260 # Test __long__()
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001261 class ClassicMissingMethods:
1262 pass
1263 self.assertRaises(AttributeError, long, ClassicMissingMethods())
1264
1265 class MissingMethods(object):
1266 pass
1267 self.assertRaises(TypeError, long, MissingMethods())
1268
Brett Cannonc3647ac2005-04-26 03:45:26 +00001269 class Foo0:
1270 def __long__(self):
1271 return 42L
1272
1273 class Foo1(object):
1274 def __long__(self):
1275 return 42L
1276
1277 class Foo2(long):
1278 def __long__(self):
1279 return 42L
1280
1281 class Foo3(long):
1282 def __long__(self):
1283 return self
1284
1285 class Foo4(long):
1286 def __long__(self):
1287 return 42
1288
1289 class Foo5(long):
1290 def __long__(self):
1291 return 42.
1292
1293 self.assertEqual(long(Foo0()), 42L)
1294 self.assertEqual(long(Foo1()), 42L)
1295 self.assertEqual(long(Foo2()), 42L)
1296 self.assertEqual(long(Foo3()), 0)
1297 self.assertEqual(long(Foo4()), 42)
1298 self.assertRaises(TypeError, long, Foo5())
1299
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001300 class Classic:
1301 pass
1302 for base in (object, Classic):
1303 class LongOverridesTrunc(base):
1304 def __long__(self):
1305 return 42
1306 def __trunc__(self):
1307 return -12
1308 self.assertEqual(long(LongOverridesTrunc()), 42)
1309
1310 class JustTrunc(base):
1311 def __trunc__(self):
1312 return 42
1313 self.assertEqual(long(JustTrunc()), 42)
1314
1315 for trunc_result_base in (object, Classic):
1316 class Integral(trunc_result_base):
1317 def __int__(self):
1318 return 42
1319
1320 class TruncReturnsNonLong(base):
1321 def __trunc__(self):
1322 return Integral()
1323 self.assertEqual(long(TruncReturnsNonLong()), 42)
1324
1325 class NonIntegral(trunc_result_base):
1326 def __trunc__(self):
1327 # Check that we avoid infinite recursion.
1328 return NonIntegral()
1329
1330 class TruncReturnsNonIntegral(base):
1331 def __trunc__(self):
1332 return NonIntegral()
1333 try:
1334 long(TruncReturnsNonIntegral())
1335 except TypeError as e:
1336 self.assertEquals(str(e),
1337 "__trunc__ returned non-Integral"
1338 " (type NonIntegral)")
1339 else:
1340 self.fail("Failed to raise TypeError with %s" %
1341 ((base, trunc_result_base),))
1342
Walter Dörwald919497e2003-01-19 16:23:59 +00001343 def test_map(self):
1344 self.assertEqual(
1345 map(None, 'hello world'),
1346 ['h','e','l','l','o',' ','w','o','r','l','d']
1347 )
1348 self.assertEqual(
1349 map(None, 'abcd', 'efg'),
1350 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
1351 )
1352 self.assertEqual(
1353 map(None, range(10)),
1354 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1355 )
1356 self.assertEqual(
1357 map(lambda x: x*x, range(1,4)),
1358 [1, 4, 9]
1359 )
1360 try:
1361 from math import sqrt
1362 except ImportError:
1363 def sqrt(x):
1364 return pow(x, 0.5)
1365 self.assertEqual(
1366 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
1367 [[4.0, 2.0], [9.0, 3.0]]
1368 )
1369 self.assertEqual(
1370 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
1371 [10, 4, 6]
1372 )
1373
1374 def plus(*v):
1375 accu = 0
1376 for i in v: accu = accu + i
1377 return accu
1378 self.assertEqual(
1379 map(plus, [1, 3, 7]),
1380 [1, 3, 7]
1381 )
1382 self.assertEqual(
1383 map(plus, [1, 3, 7], [4, 9, 2]),
1384 [1+4, 3+9, 7+2]
1385 )
1386 self.assertEqual(
1387 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
1388 [1+4+1, 3+9+1, 7+2+0]
1389 )
1390 self.assertEqual(
1391 map(None, Squares(10)),
1392 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1393 )
1394 self.assertEqual(
1395 map(int, Squares(10)),
1396 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1397 )
1398 self.assertEqual(
1399 map(None, Squares(3), Squares(2)),
1400 [(0,0), (1,1), (4,None)]
1401 )
1402 self.assertEqual(
1403 map(max, Squares(3), Squares(2)),
1404 [0, 1, 4]
1405 )
1406 self.assertRaises(TypeError, map)
1407 self.assertRaises(TypeError, map, lambda x: x, 42)
1408 self.assertEqual(map(None, [42]), [42])
1409 class BadSeq:
1410 def __getitem__(self, index):
1411 raise ValueError
1412 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001413 def badfunc(x):
1414 raise RuntimeError
1415 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001416
1417 def test_max(self):
1418 self.assertEqual(max('123123'), '3')
1419 self.assertEqual(max(1, 2, 3), 3)
1420 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1421 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1422
1423 self.assertEqual(max(1, 2L, 3.0), 3.0)
1424 self.assertEqual(max(1L, 2.0, 3), 3)
1425 self.assertEqual(max(1.0, 2, 3L), 3L)
1426
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001427 for stmt in (
1428 "max(key=int)", # no args
1429 "max(1, key=int)", # single arg not iterable
1430 "max(1, 2, keystone=int)", # wrong keyword
1431 "max(1, 2, key=int, abc=int)", # two many keywords
1432 "max(1, 2, key=1)", # keyfunc is not callable
1433 ):
Tim Peters7f061872004-12-07 21:17:46 +00001434 try:
1435 exec(stmt) in globals()
1436 except TypeError:
1437 pass
1438 else:
1439 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001440
1441 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1442 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1443 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1444
1445 data = [random.randrange(200) for i in range(100)]
1446 keys = dict((elem, random.randrange(50)) for elem in data)
1447 f = keys.__getitem__
1448 self.assertEqual(max(data, key=f),
1449 sorted(reversed(data), key=f)[-1])
1450
Walter Dörwald919497e2003-01-19 16:23:59 +00001451 def test_min(self):
1452 self.assertEqual(min('123123'), '1')
1453 self.assertEqual(min(1, 2, 3), 1)
1454 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1455 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1456
1457 self.assertEqual(min(1, 2L, 3.0), 1)
1458 self.assertEqual(min(1L, 2.0, 3), 1L)
1459 self.assertEqual(min(1.0, 2, 3L), 1.0)
1460
1461 self.assertRaises(TypeError, min)
1462 self.assertRaises(TypeError, min, 42)
1463 self.assertRaises(ValueError, min, ())
1464 class BadSeq:
1465 def __getitem__(self, index):
1466 raise ValueError
1467 self.assertRaises(ValueError, min, BadSeq())
1468 class BadNumber:
1469 def __cmp__(self, other):
1470 raise ValueError
1471 self.assertRaises(ValueError, min, (42, BadNumber()))
1472
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001473 for stmt in (
1474 "min(key=int)", # no args
1475 "min(1, key=int)", # single arg not iterable
1476 "min(1, 2, keystone=int)", # wrong keyword
1477 "min(1, 2, key=int, abc=int)", # two many keywords
1478 "min(1, 2, key=1)", # keyfunc is not callable
1479 ):
Tim Peters7f061872004-12-07 21:17:46 +00001480 try:
1481 exec(stmt) in globals()
1482 except TypeError:
1483 pass
1484 else:
1485 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001486
1487 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1488 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1489 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1490
1491 data = [random.randrange(200) for i in range(100)]
1492 keys = dict((elem, random.randrange(50)) for elem in data)
1493 f = keys.__getitem__
1494 self.assertEqual(min(data, key=f),
1495 sorted(data, key=f)[0])
1496
Walter Dörwald919497e2003-01-19 16:23:59 +00001497 def test_oct(self):
1498 self.assertEqual(oct(100), '0144')
1499 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001500 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001501 self.assertEqual(oct(-100L), '-0144L')
1502 self.assertRaises(TypeError, oct, ())
1503
1504 def write_testfile(self):
1505 # NB the first 4 lines are also used to test input and raw_input, below
1506 fp = open(TESTFN, 'w')
1507 try:
1508 fp.write('1+1\n')
1509 fp.write('1+1\n')
1510 fp.write('The quick brown fox jumps over the lazy dog')
1511 fp.write('.\n')
1512 fp.write('Dear John\n')
1513 fp.write('XXX'*100)
1514 fp.write('YYY'*100)
1515 finally:
1516 fp.close()
1517
1518 def test_open(self):
1519 self.write_testfile()
1520 fp = open(TESTFN, 'r')
1521 try:
1522 self.assertEqual(fp.readline(4), '1+1\n')
1523 self.assertEqual(fp.readline(4), '1+1\n')
1524 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1525 self.assertEqual(fp.readline(4), 'Dear')
1526 self.assertEqual(fp.readline(100), ' John\n')
1527 self.assertEqual(fp.read(300), 'XXX'*100)
1528 self.assertEqual(fp.read(1000), 'YYY'*100)
1529 finally:
1530 fp.close()
1531 unlink(TESTFN)
1532
1533 def test_ord(self):
1534 self.assertEqual(ord(' '), 32)
1535 self.assertEqual(ord('A'), 65)
1536 self.assertEqual(ord('a'), 97)
1537 if have_unicode:
1538 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1539 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001540 if have_unicode:
1541 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001542
1543 def test_pow(self):
1544 self.assertEqual(pow(0,0), 1)
1545 self.assertEqual(pow(0,1), 0)
1546 self.assertEqual(pow(1,0), 1)
1547 self.assertEqual(pow(1,1), 1)
1548
1549 self.assertEqual(pow(2,0), 1)
1550 self.assertEqual(pow(2,10), 1024)
1551 self.assertEqual(pow(2,20), 1024*1024)
1552 self.assertEqual(pow(2,30), 1024*1024*1024)
1553
1554 self.assertEqual(pow(-2,0), 1)
1555 self.assertEqual(pow(-2,1), -2)
1556 self.assertEqual(pow(-2,2), 4)
1557 self.assertEqual(pow(-2,3), -8)
1558
1559 self.assertEqual(pow(0L,0), 1)
1560 self.assertEqual(pow(0L,1), 0)
1561 self.assertEqual(pow(1L,0), 1)
1562 self.assertEqual(pow(1L,1), 1)
1563
1564 self.assertEqual(pow(2L,0), 1)
1565 self.assertEqual(pow(2L,10), 1024)
1566 self.assertEqual(pow(2L,20), 1024*1024)
1567 self.assertEqual(pow(2L,30), 1024*1024*1024)
1568
1569 self.assertEqual(pow(-2L,0), 1)
1570 self.assertEqual(pow(-2L,1), -2)
1571 self.assertEqual(pow(-2L,2), 4)
1572 self.assertEqual(pow(-2L,3), -8)
1573
1574 self.assertAlmostEqual(pow(0.,0), 1.)
1575 self.assertAlmostEqual(pow(0.,1), 0.)
1576 self.assertAlmostEqual(pow(1.,0), 1.)
1577 self.assertAlmostEqual(pow(1.,1), 1.)
1578
1579 self.assertAlmostEqual(pow(2.,0), 1.)
1580 self.assertAlmostEqual(pow(2.,10), 1024.)
1581 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1582 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1583
1584 self.assertAlmostEqual(pow(-2.,0), 1.)
1585 self.assertAlmostEqual(pow(-2.,1), -2.)
1586 self.assertAlmostEqual(pow(-2.,2), 4.)
1587 self.assertAlmostEqual(pow(-2.,3), -8.)
1588
1589 for x in 2, 2L, 2.0:
1590 for y in 10, 10L, 10.0:
1591 for z in 1000, 1000L, 1000.0:
1592 if isinstance(x, float) or \
1593 isinstance(y, float) or \
1594 isinstance(z, float):
1595 self.assertRaises(TypeError, pow, x, y, z)
1596 else:
1597 self.assertAlmostEqual(pow(x, y, z), 24.0)
1598
1599 self.assertRaises(TypeError, pow, -1, -2, 3)
1600 self.assertRaises(ValueError, pow, 1, 2, 0)
1601 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1602 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001603 # Will return complex in 3.0:
1604 self.assertRaises(ValueError, pow, -342.43, 0.234)
Walter Dörwald919497e2003-01-19 16:23:59 +00001605
1606 self.assertRaises(TypeError, pow)
1607
1608 def test_range(self):
1609 self.assertEqual(range(3), [0, 1, 2])
1610 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1611 self.assertEqual(range(0), [])
1612 self.assertEqual(range(-3), [])
1613 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1614 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1615
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001616 # Now test range() with longs
1617 self.assertEqual(range(-2**100), [])
1618 self.assertEqual(range(0, -2**100), [])
1619 self.assertEqual(range(0, 2**100, -1), [])
1620 self.assertEqual(range(0, 2**100, -1), [])
1621
1622 a = long(10 * sys.maxint)
1623 b = long(100 * sys.maxint)
1624 c = long(50 * sys.maxint)
1625
1626 self.assertEqual(range(a, a+2), [a, a+1])
1627 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1628 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1629
1630 seq = range(a, b, c)
1631 self.assert_(a in seq)
1632 self.assert_(b not in seq)
1633 self.assertEqual(len(seq), 2)
1634
1635 seq = range(b, a, -c)
1636 self.assert_(b in seq)
1637 self.assert_(a not in seq)
1638 self.assertEqual(len(seq), 2)
1639
1640 seq = range(-a, -b, -c)
1641 self.assert_(-a in seq)
1642 self.assert_(-b not in seq)
1643 self.assertEqual(len(seq), 2)
1644
Walter Dörwald919497e2003-01-19 16:23:59 +00001645 self.assertRaises(TypeError, range)
1646 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1647 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001648 self.assertRaises(ValueError, range, a, a + 1, long(0))
1649
1650 class badzero(int):
1651 def __cmp__(self, other):
1652 raise RuntimeError
1653 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001654
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001655 # Reject floats when it would require PyLongs to represent.
1656 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001657 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001658
Walter Dörwald357981e2003-04-15 18:59:28 +00001659 self.assertRaises(TypeError, range, 0, "spam")
1660 self.assertRaises(TypeError, range, 0, 42, "spam")
1661
1662 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1663 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1664
Walter Dörwald919497e2003-01-19 16:23:59 +00001665 def test_input_and_raw_input(self):
1666 self.write_testfile()
1667 fp = open(TESTFN, 'r')
1668 savestdin = sys.stdin
1669 savestdout = sys.stdout # Eats the echo
1670 try:
1671 sys.stdin = fp
1672 sys.stdout = BitBucket()
1673 self.assertEqual(input(), 2)
1674 self.assertEqual(input('testing\n'), 2)
1675 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1676 self.assertEqual(raw_input('testing\n'), 'Dear John')
Tim Peters8e24a962006-08-09 00:52:26 +00001677
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001678 # SF 1535165: don't segfault on closed stdin
1679 # sys.stdout must be a regular file for triggering
1680 sys.stdout = savestdout
1681 sys.stdin.close()
Georg Brandld336e982006-08-06 09:17:16 +00001682 self.assertRaises(ValueError, input)
Georg Brandl7e3ba2a2006-08-06 08:23:54 +00001683
1684 sys.stdout = BitBucket()
Walter Dörwald919497e2003-01-19 16:23:59 +00001685 sys.stdin = cStringIO.StringIO("NULL\0")
1686 self.assertRaises(TypeError, input, 42, 42)
1687 sys.stdin = cStringIO.StringIO(" 'whitespace'")
1688 self.assertEqual(input(), 'whitespace')
1689 sys.stdin = cStringIO.StringIO()
1690 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001691
1692 # SF 876178: make sure input() respect future options.
1693 sys.stdin = cStringIO.StringIO('1/2')
1694 sys.stdout = cStringIO.StringIO()
1695 exec compile('print input()', 'test_builtin_tmp', 'exec')
1696 sys.stdin.seek(0, 0)
1697 exec compile('from __future__ import division;print input()',
1698 'test_builtin_tmp', 'exec')
1699 sys.stdin.seek(0, 0)
1700 exec compile('print input()', 'test_builtin_tmp', 'exec')
Tim Petersb82cb8d2006-03-28 07:39:22 +00001701 # The result we expect depends on whether new division semantics
1702 # are already in effect.
1703 if 1/2 == 0:
1704 # This test was compiled with old semantics.
1705 expected = ['0', '0.5', '0']
1706 else:
1707 # This test was compiled with new semantics (e.g., -Qnew
1708 # was given on the command line.
1709 expected = ['0.5', '0.5', '0.5']
1710 self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +00001711
Walter Dörwald919497e2003-01-19 16:23:59 +00001712 del sys.stdout
1713 self.assertRaises(RuntimeError, input, 'prompt')
1714 del sys.stdin
1715 self.assertRaises(RuntimeError, input, 'prompt')
1716 finally:
1717 sys.stdin = savestdin
1718 sys.stdout = savestdout
1719 fp.close()
1720 unlink(TESTFN)
1721
1722 def test_reduce(self):
1723 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1724 self.assertEqual(
1725 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1726 ['a','c','d','w']
1727 )
1728 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1729 self.assertEqual(
1730 reduce(lambda x, y: x*y, range(2,21), 1L),
1731 2432902008176640000L
1732 )
1733 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1734 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1735 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1736 self.assertRaises(TypeError, reduce)
1737 self.assertRaises(TypeError, reduce, 42, 42)
1738 self.assertRaises(TypeError, reduce, 42, 42, 42)
1739 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1740 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1741 self.assertRaises(TypeError, reduce, 42, (42, 42))
1742
1743 class BadSeq:
1744 def __getitem__(self, index):
1745 raise ValueError
1746 self.assertRaises(ValueError, reduce, 42, BadSeq())
1747
1748 def test_reload(self):
1749 import marshal
1750 reload(marshal)
1751 import string
1752 reload(string)
1753 ## import sys
1754 ## self.assertRaises(ImportError, reload, sys)
1755
1756 def test_repr(self):
1757 self.assertEqual(repr(''), '\'\'')
1758 self.assertEqual(repr(0), '0')
1759 self.assertEqual(repr(0L), '0L')
1760 self.assertEqual(repr(()), '()')
1761 self.assertEqual(repr([]), '[]')
1762 self.assertEqual(repr({}), '{}')
1763 a = []
1764 a.append(a)
1765 self.assertEqual(repr(a), '[[...]]')
1766 a = {}
1767 a[0] = a
1768 self.assertEqual(repr(a), '{0: {...}}')
1769
1770 def test_round(self):
1771 self.assertEqual(round(0.0), 0.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001772 self.assertEqual(type(round(0.0)), float) # Will be int in 3.0.
Walter Dörwald919497e2003-01-19 16:23:59 +00001773 self.assertEqual(round(1.0), 1.0)
1774 self.assertEqual(round(10.0), 10.0)
1775 self.assertEqual(round(1000000000.0), 1000000000.0)
1776 self.assertEqual(round(1e20), 1e20)
1777
1778 self.assertEqual(round(-1.0), -1.0)
1779 self.assertEqual(round(-10.0), -10.0)
1780 self.assertEqual(round(-1000000000.0), -1000000000.0)
1781 self.assertEqual(round(-1e20), -1e20)
1782
1783 self.assertEqual(round(0.1), 0.0)
1784 self.assertEqual(round(1.1), 1.0)
1785 self.assertEqual(round(10.1), 10.0)
1786 self.assertEqual(round(1000000000.1), 1000000000.0)
1787
1788 self.assertEqual(round(-1.1), -1.0)
1789 self.assertEqual(round(-10.1), -10.0)
1790 self.assertEqual(round(-1000000000.1), -1000000000.0)
1791
1792 self.assertEqual(round(0.9), 1.0)
1793 self.assertEqual(round(9.9), 10.0)
1794 self.assertEqual(round(999999999.9), 1000000000.0)
1795
1796 self.assertEqual(round(-0.9), -1.0)
1797 self.assertEqual(round(-9.9), -10.0)
1798 self.assertEqual(round(-999999999.9), -1000000000.0)
1799
1800 self.assertEqual(round(-8.0, -1), -10.0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001801 self.assertEqual(type(round(-8.0, -1)), float)
1802
1803 self.assertEqual(type(round(-8.0, 0)), float)
1804 self.assertEqual(type(round(-8.0, 1)), float)
1805
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001806 # Check half rounding behaviour.
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001807 self.assertEqual(round(5.5), 6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001808 self.assertEqual(round(6.5), 7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001809 self.assertEqual(round(-5.5), -6)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001810 self.assertEqual(round(-6.5), -7)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001811
1812 # Check behavior on ints
1813 self.assertEqual(round(0), 0)
1814 self.assertEqual(round(8), 8)
1815 self.assertEqual(round(-8), -8)
1816 self.assertEqual(type(round(0)), float) # Will be int in 3.0.
1817 self.assertEqual(type(round(-8, -1)), float)
1818 self.assertEqual(type(round(-8, 0)), float)
1819 self.assertEqual(type(round(-8, 1)), float)
Walter Dörwald919497e2003-01-19 16:23:59 +00001820
Georg Brandlccadf842006-03-31 18:54:53 +00001821 # test new kwargs
1822 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1823
Walter Dörwald919497e2003-01-19 16:23:59 +00001824 self.assertRaises(TypeError, round)
1825
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001826 # test generic rounding delegation for reals
1827 class TestRound(object):
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001828 def __float__(self):
1829 return 23.0
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001830
1831 class TestNoRound(object):
1832 pass
1833
1834 self.assertEqual(round(TestRound()), 23)
1835
1836 self.assertRaises(TypeError, round, 1, 2, 3)
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001837 self.assertRaises(TypeError, round, TestNoRound())
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001838
1839 t = TestNoRound()
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +00001840 t.__float__ = lambda *args: args
1841 self.assertRaises(TypeError, round, t)
1842 self.assertRaises(TypeError, round, t, 0)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001843
Walter Dörwald919497e2003-01-19 16:23:59 +00001844 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001845 setattr(sys, 'spam', 1)
1846 self.assertEqual(sys.spam, 1)
1847 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1848 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001849
1850 def test_str(self):
1851 self.assertEqual(str(''), '')
1852 self.assertEqual(str(0), '0')
1853 self.assertEqual(str(0L), '0')
1854 self.assertEqual(str(()), '()')
1855 self.assertEqual(str([]), '[]')
1856 self.assertEqual(str({}), '{}')
1857 a = []
1858 a.append(a)
1859 self.assertEqual(str(a), '[[...]]')
1860 a = {}
1861 a[0] = a
1862 self.assertEqual(str(a), '{0: {...}}')
1863
Alex Martellia70b1912003-04-22 08:12:33 +00001864 def test_sum(self):
1865 self.assertEqual(sum([]), 0)
1866 self.assertEqual(sum(range(2,8)), 27)
1867 self.assertEqual(sum(iter(range(2,8))), 27)
1868 self.assertEqual(sum(Squares(10)), 285)
1869 self.assertEqual(sum(iter(Squares(10))), 285)
1870 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1871
1872 self.assertRaises(TypeError, sum)
1873 self.assertRaises(TypeError, sum, 42)
1874 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1875 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1876 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1877 self.assertRaises(TypeError, sum, [{2:3}])
1878 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1879
1880 class BadSeq:
1881 def __getitem__(self, index):
1882 raise ValueError
1883 self.assertRaises(ValueError, sum, BadSeq())
1884
Walter Dörwald919497e2003-01-19 16:23:59 +00001885 def test_tuple(self):
1886 self.assertEqual(tuple(()), ())
1887 t0_3 = (0, 1, 2, 3)
1888 t0_3_bis = tuple(t0_3)
1889 self.assert_(t0_3 is t0_3_bis)
1890 self.assertEqual(tuple([]), ())
1891 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1892 self.assertEqual(tuple(''), ())
1893 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1894
1895 def test_type(self):
1896 self.assertEqual(type(''), type('123'))
1897 self.assertNotEqual(type(''), type(()))
1898
1899 def test_unichr(self):
1900 if have_unicode:
1901 self.assertEqual(unichr(32), unicode(' '))
1902 self.assertEqual(unichr(65), unicode('A'))
1903 self.assertEqual(unichr(97), unicode('a'))
1904 self.assertEqual(
1905 unichr(sys.maxunicode),
1906 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1907 )
1908 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1909 self.assertRaises(TypeError, unichr)
1910
Guido van Rossumfee7b932005-01-16 00:21:28 +00001911 # We don't want self in vars(), so these are static methods
1912
1913 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001914 def get_vars_f0():
1915 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001916
Guido van Rossumfee7b932005-01-16 00:21:28 +00001917 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001918 def get_vars_f2():
1919 BuiltinTest.get_vars_f0()
1920 a = 1
1921 b = 2
1922 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001923
1924 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001925 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001926 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001927 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001928 self.assertEqual(self.get_vars_f0(), {})
1929 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1930 self.assertRaises(TypeError, vars, 42, 42)
1931 self.assertRaises(TypeError, vars, 42)
1932
1933 def test_zip(self):
1934 a = (1, 2, 3)
1935 b = (4, 5, 6)
1936 t = [(1, 4), (2, 5), (3, 6)]
1937 self.assertEqual(zip(a, b), t)
1938 b = [4, 5, 6]
1939 self.assertEqual(zip(a, b), t)
1940 b = (4, 5, 6, 7)
1941 self.assertEqual(zip(a, b), t)
1942 class I:
1943 def __getitem__(self, i):
1944 if i < 0 or i > 2: raise IndexError
1945 return i + 4
1946 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001947 self.assertEqual(zip(), [])
1948 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001949 self.assertRaises(TypeError, zip, None)
1950 class G:
1951 pass
1952 self.assertRaises(TypeError, zip, a, G())
1953
1954 # Make sure zip doesn't try to allocate a billion elements for the
1955 # result list when one of its arguments doesn't say how long it is.
1956 # A MemoryError is the most likely failure mode.
1957 class SequenceWithoutALength:
1958 def __getitem__(self, i):
1959 if i == 5:
1960 raise IndexError
1961 else:
1962 return i
1963 self.assertEqual(
1964 zip(SequenceWithoutALength(), xrange(2**30)),
1965 list(enumerate(range(5)))
1966 )
1967
1968 class BadSeq:
1969 def __getitem__(self, i):
1970 if i == 5:
1971 raise ValueError
1972 else:
1973 return i
1974 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1975
Eric Smitha9f7d622008-02-17 19:46:49 +00001976 def test_format(self):
1977 # Test the basic machinery of the format() builtin. Don't test
1978 # the specifics of the various formatters
1979 self.assertEqual(format(3, ''), '3')
1980
1981 # Returns some classes to use for various tests. There's
1982 # an old-style version, and a new-style version
1983 def classes_new():
1984 class A(object):
1985 def __init__(self, x):
1986 self.x = x
1987 def __format__(self, format_spec):
1988 return str(self.x) + format_spec
1989 class DerivedFromA(A):
1990 pass
1991
1992 class Simple(object): pass
1993 class DerivedFromSimple(Simple):
1994 def __init__(self, x):
1995 self.x = x
1996 def __format__(self, format_spec):
1997 return str(self.x) + format_spec
1998 class DerivedFromSimple2(DerivedFromSimple): pass
1999 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
2000
2001 # In 3.0, classes_classic has the same meaning as classes_new
2002 def classes_classic():
2003 class A:
2004 def __init__(self, x):
2005 self.x = x
2006 def __format__(self, format_spec):
2007 return str(self.x) + format_spec
2008 class DerivedFromA(A):
2009 pass
2010
2011 class Simple: pass
2012 class DerivedFromSimple(Simple):
2013 def __init__(self, x):
2014 self.x = x
2015 def __format__(self, format_spec):
2016 return str(self.x) + format_spec
2017 class DerivedFromSimple2(DerivedFromSimple): pass
2018 return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
2019
2020 def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
2021 self.assertEqual(format(A(3), 'spec'), '3spec')
2022 self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
2023 self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
2024 self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
2025 '10abcdef')
2026
2027 class_test(*classes_new())
2028 class_test(*classes_classic())
2029
2030 def empty_format_spec(value):
2031 # test that:
2032 # format(x, '') == str(x)
2033 # format(x) == str(x)
2034 self.assertEqual(format(value, ""), str(value))
2035 self.assertEqual(format(value), str(value))
2036
2037 # for builtin types, format(x, "") == str(x)
2038 empty_format_spec(17**13)
2039 empty_format_spec(1.0)
2040 empty_format_spec(3.1415e104)
2041 empty_format_spec(-3.1415e104)
2042 empty_format_spec(3.1415e-104)
2043 empty_format_spec(-3.1415e-104)
2044 empty_format_spec(object)
2045 empty_format_spec(None)
2046
2047 # TypeError because self.__format__ returns the wrong type
2048 class BadFormatResult:
2049 def __format__(self, format_spec):
2050 return 1.0
2051 self.assertRaises(TypeError, format, BadFormatResult(), "")
2052
2053 # TypeError because format_spec is not unicode or str
2054 self.assertRaises(TypeError, format, object(), 4)
2055 self.assertRaises(TypeError, format, object(), object())
2056
2057 # tests for object.__format__ really belong elsewhere, but
2058 # there's no good place to put them
2059 x = object().__format__('')
2060 self.assert_(x.startswith('<object object at'))
2061
2062 # first argument to object.__format__ must be string
2063 self.assertRaises(TypeError, object().__format__, 3)
2064 self.assertRaises(TypeError, object().__format__, object())
2065 self.assertRaises(TypeError, object().__format__, None)
2066
2067 # make sure we can take a subclass of str as a format spec
2068 class DerivedFromStr(str): pass
2069 self.assertEqual(format(0, DerivedFromStr('10')), ' 0')
2070
Eric Smithfb0742f2008-02-22 17:43:17 +00002071 def test_bin(self):
2072 self.assertEqual(bin(0), '0b0')
2073 self.assertEqual(bin(1), '0b1')
2074 self.assertEqual(bin(-1), '-0b1')
2075 self.assertEqual(bin(2**65), '0b1' + '0' * 65)
2076 self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
2077 self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
2078 self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
2079
Eric Smithce584d42008-02-21 20:17:08 +00002080class TestSorted(unittest.TestCase):
2081
2082 def test_basic(self):
2083 data = range(100)
2084 copy = data[:]
2085 random.shuffle(copy)
2086 self.assertEqual(data, sorted(copy))
2087 self.assertNotEqual(data, copy)
2088
2089 data.reverse()
2090 random.shuffle(copy)
2091 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
2092 self.assertNotEqual(data, copy)
2093 random.shuffle(copy)
2094 self.assertEqual(data, sorted(copy, key=lambda x: -x))
2095 self.assertNotEqual(data, copy)
2096 random.shuffle(copy)
2097 self.assertEqual(data, sorted(copy, reverse=1))
2098 self.assertNotEqual(data, copy)
2099
2100 def test_inputtypes(self):
2101 s = 'abracadabra'
2102 types = [list, tuple]
2103 if have_unicode:
2104 types.insert(0, unicode)
2105 for T in types:
2106 self.assertEqual(sorted(s), sorted(T(s)))
2107
2108 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
2109 types = [set, frozenset, list, tuple, dict.fromkeys]
2110 if have_unicode:
2111 types.insert(0, unicode)
2112 for T in types:
2113 self.assertEqual(sorted(s), sorted(T(s)))
2114
2115 def test_baddecorator(self):
2116 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
2117 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
2118
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00002119def test_main(verbose=None):
2120 test_classes = (BuiltinTest, TestSorted)
2121
2122 run_unittest(*test_classes)
2123
2124 # verify reference counting
2125 if verbose and hasattr(sys, "gettotalrefcount"):
2126 import gc
2127 counts = [None] * 5
2128 for i in xrange(len(counts)):
2129 run_unittest(*test_classes)
2130 gc.collect()
2131 counts[i] = sys.gettotalrefcount()
2132 print counts
2133
Walter Dörwald919497e2003-01-19 16:23:59 +00002134
2135if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00002136 test_main(verbose=True)