blob: d4605e175281027148709967a939c4296107272c [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
Thomas Wouters477c8d52006-05-27 19:21:47 +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
Raymond Hettinger214b1c32004-07-02 06:41:07 +00008import sys, warnings, cStringIO, random, 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')
110 self.assertRaises(ImportError, __import__, 'spamspam')
111 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000112 self.assertRaises(ValueError, __import__, '')
Walter Dörwald919497e2003-01-19 16:23:59 +0000113
114 def test_abs(self):
115 # int
116 self.assertEqual(abs(0), 0)
117 self.assertEqual(abs(1234), 1234)
118 self.assertEqual(abs(-1234), 1234)
119 # float
120 self.assertEqual(abs(0.0), 0.0)
121 self.assertEqual(abs(3.14), 3.14)
122 self.assertEqual(abs(-3.14), 3.14)
123 # long
124 self.assertEqual(abs(0L), 0L)
125 self.assertEqual(abs(1234L), 1234L)
126 self.assertEqual(abs(-1234L), 1234L)
127 # str
128 self.assertRaises(TypeError, abs, 'a')
129
Raymond Hettinger96229b12005-03-11 06:49:40 +0000130 def test_all(self):
131 self.assertEqual(all([2, 4, 6]), True)
132 self.assertEqual(all([2, None, 6]), False)
133 self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
134 self.assertRaises(RuntimeError, all, TestFailingIter())
135 self.assertRaises(TypeError, all, 10) # Non-iterable
136 self.assertRaises(TypeError, all) # No args
137 self.assertRaises(TypeError, all, [2, 4, 6], []) # Too many args
138 self.assertEqual(all([]), True) # Empty iterator
139 S = [50, 60]
140 self.assertEqual(all(x > 42 for x in S), True)
141 S = [50, 40, 60]
142 self.assertEqual(all(x > 42 for x in S), False)
143
144 def test_any(self):
145 self.assertEqual(any([None, None, None]), False)
146 self.assertEqual(any([None, 4, None]), True)
147 self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
148 self.assertRaises(RuntimeError, all, TestFailingIter())
149 self.assertRaises(TypeError, any, 10) # Non-iterable
150 self.assertRaises(TypeError, any) # No args
151 self.assertRaises(TypeError, any, [2, 4, 6], []) # Too many args
152 self.assertEqual(any([]), False) # Empty iterator
153 S = [40, 60, 30]
154 self.assertEqual(any(x > 42 for x in S), True)
155 S = [10, 20, 30]
156 self.assertEqual(any(x > 42 for x in S), False)
157
Walter Dörwald919497e2003-01-19 16:23:59 +0000158 def test_callable(self):
159 self.assert_(callable(len))
160 def f(): pass
161 self.assert_(callable(f))
162 class C:
163 def meth(self): pass
164 self.assert_(callable(C))
165 x = C()
166 self.assert_(callable(x.meth))
167 self.assert_(not callable(x))
168 class D(C):
169 def __call__(self): pass
170 y = D()
171 self.assert_(callable(y))
172 y()
173
174 def test_chr(self):
175 self.assertEqual(chr(32), ' ')
176 self.assertEqual(chr(65), 'A')
177 self.assertEqual(chr(97), 'a')
178 self.assertEqual(chr(0xff), '\xff')
179 self.assertRaises(ValueError, chr, 256)
180 self.assertRaises(TypeError, chr)
181
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000182 def XXX_test_cmp(self):
183 # cmp() is no longer supported
Walter Dörwald919497e2003-01-19 16:23:59 +0000184 self.assertEqual(cmp(-1, 1), -1)
185 self.assertEqual(cmp(1, -1), 1)
186 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000187 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000188 a = []; a.append(a)
189 b = []; b.append(b)
190 from UserList import UserList
191 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000192 self.assertRaises(RuntimeError, cmp, a, b)
193 self.assertRaises(RuntimeError, cmp, b, c)
194 self.assertRaises(RuntimeError, cmp, c, a)
195 self.assertRaises(RuntimeError, cmp, a, c)
196 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000197 a.pop(); b.pop(); c.pop()
198 self.assertRaises(TypeError, cmp)
199
Walter Dörwald919497e2003-01-19 16:23:59 +0000200 def test_compile(self):
201 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000202 bom = '\xef\xbb\xbf'
203 compile(bom + 'print 1\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000204 self.assertRaises(TypeError, compile)
205 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
206 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000207 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000208 if have_unicode:
209 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000210 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
211 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000212
Walter Dörwald919497e2003-01-19 16:23:59 +0000213 def test_delattr(self):
214 import sys
215 sys.spam = 1
216 delattr(sys, 'spam')
217 self.assertRaises(TypeError, delattr)
218
219 def test_dir(self):
220 x = 1
221 self.assert_('x' in dir())
222 import sys
223 self.assert_('modules' in dir(sys))
224 self.assertRaises(TypeError, dir, 42, 42)
225
226 def test_divmod(self):
227 self.assertEqual(divmod(12, 7), (1, 5))
228 self.assertEqual(divmod(-12, 7), (-2, 2))
229 self.assertEqual(divmod(12, -7), (-2, -2))
230 self.assertEqual(divmod(-12, -7), (1, -5))
231
232 self.assertEqual(divmod(12L, 7L), (1L, 5L))
233 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
234 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
235 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
236
237 self.assertEqual(divmod(12, 7L), (1, 5L))
238 self.assertEqual(divmod(-12, 7L), (-2, 2L))
239 self.assertEqual(divmod(12L, -7), (-2L, -2))
240 self.assertEqual(divmod(-12L, -7), (1L, -5))
241
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000242 self.assertEqual(divmod(-sys.maxint-1, -1),
243 (sys.maxint+1, 0))
244
Walter Dörwald919497e2003-01-19 16:23:59 +0000245 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
246 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
247 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
248 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
249
250 self.assertRaises(TypeError, divmod)
251
252 def test_eval(self):
253 self.assertEqual(eval('1+1'), 2)
254 self.assertEqual(eval(' 1+1\n'), 2)
255 globals = {'a': 1, 'b': 2}
256 locals = {'b': 200, 'c': 300}
257 self.assertEqual(eval('a', globals) , 1)
258 self.assertEqual(eval('a', globals, locals), 1)
259 self.assertEqual(eval('b', globals, locals), 200)
260 self.assertEqual(eval('c', globals, locals), 300)
261 if have_unicode:
262 self.assertEqual(eval(unicode('1+1')), 2)
263 self.assertEqual(eval(unicode(' 1+1\n')), 2)
264 globals = {'a': 1, 'b': 2}
265 locals = {'b': 200, 'c': 300}
266 if have_unicode:
267 self.assertEqual(eval(unicode('a'), globals), 1)
268 self.assertEqual(eval(unicode('a'), globals, locals), 1)
269 self.assertEqual(eval(unicode('b'), globals, locals), 200)
270 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000271 bom = '\xef\xbb\xbf'
272 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000273 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
274 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000275 self.assertRaises(TypeError, eval)
276 self.assertRaises(TypeError, eval, ())
277
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000278 def test_general_eval(self):
279 # Tests that general mappings can be used for the locals argument
280
281 class M:
282 "Test mapping interface versus possible calls from eval()."
283 def __getitem__(self, key):
284 if key == 'a':
285 return 12
286 raise KeyError
287 def keys(self):
288 return list('xyz')
289
290 m = M()
291 g = globals()
292 self.assertEqual(eval('a', g, m), 12)
293 self.assertRaises(NameError, eval, 'b', g, m)
294 self.assertEqual(eval('dir()', g, m), list('xyz'))
295 self.assertEqual(eval('globals()', g, m), g)
296 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000297 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000298 class A:
299 "Non-mapping"
300 pass
301 m = A()
302 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000303
304 # Verify that dict subclasses work as well
305 class D(dict):
306 def __getitem__(self, key):
307 if key == 'a':
308 return 12
309 return dict.__getitem__(self, key)
310 def keys(self):
311 return list('xyz')
312
313 d = D()
314 self.assertEqual(eval('a', g, d), 12)
315 self.assertRaises(NameError, eval, 'b', g, d)
316 self.assertEqual(eval('dir()', g, d), list('xyz'))
317 self.assertEqual(eval('globals()', g, d), g)
318 self.assertEqual(eval('locals()', g, d), d)
319
320 # Verify locals stores (used by list comps)
321 eval('[locals() for i in (2,3)]', g, d)
322 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
323
324 class SpreadSheet:
325 "Sample application showing nested, calculated lookups."
326 _cells = {}
327 def __setitem__(self, key, formula):
328 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000329 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000330 return eval(self._cells[key], globals(), self)
331
332 ss = SpreadSheet()
333 ss['a1'] = '5'
334 ss['a2'] = 'a1*6'
335 ss['a3'] = 'a2*7'
336 self.assertEqual(ss['a3'], 210)
337
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000338 # Verify that dir() catches a non-list returned by eval
339 # SF bug #1004669
340 class C:
341 def __getitem__(self, item):
342 raise KeyError(item)
343 def keys(self):
344 return 'a'
345 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
346
Walter Dörwald919497e2003-01-19 16:23:59 +0000347 # Done outside of the method test_z to get the correct scope
348 z = 0
349 f = open(TESTFN, 'w')
350 f.write('z = z+1\n')
351 f.write('z = z*2\n')
352 f.close()
353 execfile(TESTFN)
354
355 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000356 global numruns
357 if numruns:
358 return
359 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000360
Walter Dörwald919497e2003-01-19 16:23:59 +0000361 globals = {'a': 1, 'b': 2}
362 locals = {'b': 200, 'c': 300}
363
364 self.assertEqual(self.__class__.z, 2)
365 globals['z'] = 0
366 execfile(TESTFN, globals)
367 self.assertEqual(globals['z'], 2)
368 locals['z'] = 0
369 execfile(TESTFN, globals, locals)
370 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000371
372 class M:
373 "Test mapping interface versus possible calls from execfile()."
374 def __init__(self):
375 self.z = 10
376 def __getitem__(self, key):
377 if key == 'z':
378 return self.z
379 raise KeyError
380 def __setitem__(self, key, value):
381 if key == 'z':
382 self.z = value
383 return
384 raise KeyError
385
386 locals = M()
387 locals['z'] = 0
388 execfile(TESTFN, globals, locals)
389 self.assertEqual(locals['z'], 2)
390
Walter Dörwald919497e2003-01-19 16:23:59 +0000391 unlink(TESTFN)
392 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000393 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000394 import os
395 self.assertRaises(IOError, execfile, os.curdir)
396 self.assertRaises(IOError, execfile, "I_dont_exist")
397
398 def test_filter(self):
399 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
400 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
401 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
402 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
403 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
404 def identity(item):
405 return 1
406 filter(identity, Squares(5))
407 self.assertRaises(TypeError, filter)
408 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000409 def __getitem__(self, index):
410 if index<4:
411 return 42
412 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000413 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
414 def badfunc():
415 pass
416 self.assertRaises(TypeError, filter, badfunc, range(5))
417
Walter Dörwaldbf517072003-01-27 15:57:14 +0000418 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000419 self.assertEqual(filter(None, (1, 2)), (1, 2))
420 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
421 self.assertRaises(TypeError, filter, 42, (1, 2))
422
Walter Dörwaldbf517072003-01-27 15:57:14 +0000423 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000424 self.assertEqual(filter(None, "12"), "12")
425 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
426 self.assertRaises(TypeError, filter, 42, "12")
427 class badstr(str):
428 def __getitem__(self, index):
429 raise ValueError
430 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000431
Walter Dörwald903f1e02003-02-04 16:28:00 +0000432 class badstr2(str):
433 def __getitem__(self, index):
434 return 42
435 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
436
437 class weirdstr(str):
438 def __getitem__(self, index):
439 return weirdstr(2*str.__getitem__(self, index))
440 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
441
Walter Dörwald5e61e242003-02-04 17:04:01 +0000442 class shiftstr(str):
443 def __getitem__(self, index):
444 return chr(ord(str.__getitem__(self, index))+1)
445 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
446
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000447 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000448 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000449 self.assertEqual(filter(None, unicode("12")), unicode("12"))
450 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
451 self.assertRaises(TypeError, filter, 42, unicode("12"))
452 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000453
Walter Dörwald903f1e02003-02-04 16:28:00 +0000454 class badunicode(unicode):
455 def __getitem__(self, index):
456 return 42
457 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
458
459 class weirdunicode(unicode):
460 def __getitem__(self, index):
461 return weirdunicode(2*unicode.__getitem__(self, index))
462 self.assertEqual(
463 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
464
Walter Dörwald5e61e242003-02-04 17:04:01 +0000465 class shiftunicode(unicode):
466 def __getitem__(self, index):
467 return unichr(ord(unicode.__getitem__(self, index))+1)
468 self.assertEqual(
469 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
470 unicode("345")
471 )
472
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000473 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000474 # test that filter() never returns tuple, str or unicode subclasses
475 # and that the result always goes through __getitem__
476 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000477 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000478 def __getitem__(self, index):
479 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000480 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000481 def __getitem__(self, index):
482 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000483 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000484 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000485 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000486 }
487 if have_unicode:
488 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000489 def __getitem__(self, index):
490 return 2*unicode.__getitem__(self, index)
491 inputs[unicode2] = {
492 unicode(): unicode(),
493 unicode("123"): unicode("112233")
494 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000495
Walter Dörwald1918f772003-02-10 13:19:13 +0000496 for (cls, inps) in inputs.iteritems():
497 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000498 # make sure the output goes through __getitem__
499 # even if func is None
500 self.assertEqual(
501 filter(funcs[0], cls(inp)),
502 filter(funcs[1], cls(inp))
503 )
504 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000505 outp = filter(func, cls(inp))
506 self.assertEqual(outp, exp)
507 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000508
Walter Dörwald919497e2003-01-19 16:23:59 +0000509 def test_float(self):
510 self.assertEqual(float(3.14), 3.14)
511 self.assertEqual(float(314), 314.0)
512 self.assertEqual(float(314L), 314.0)
513 self.assertEqual(float(" 3.14 "), 3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000514 self.assertRaises(ValueError, float, " 0x3.1 ")
515 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Walter Dörwald919497e2003-01-19 16:23:59 +0000516 if have_unicode:
517 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
518 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
Walter Dörwaldede187f2005-11-29 15:45:14 +0000519 # Implementation limitation in PyFloat_FromString()
520 self.assertRaises(ValueError, float, unicode("1"*10000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000521
Thomas Wouters477c8d52006-05-27 19:21:47 +0000522 @run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
Neal Norwitz5898fa22005-11-22 05:17:40 +0000523 def test_float_with_comma(self):
524 # set locale to something that doesn't use '.' for the decimal point
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000525 # float must not accept the locale specific decimal point but
526 # it still has to accept the normal python syntac
Thomas Wouters477c8d52006-05-27 19:21:47 +0000527 import locale
528 if not locale.localeconv()['decimal_point'] == ',':
Neal Norwitz5898fa22005-11-22 05:17:40 +0000529 return
530
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000531 self.assertEqual(float(" 3.14 "), 3.14)
532 self.assertEqual(float("+3.14 "), 3.14)
533 self.assertEqual(float("-3.14 "), -3.14)
534 self.assertEqual(float(".14 "), .14)
535 self.assertEqual(float("3. "), 3.0)
536 self.assertEqual(float("3.e3 "), 3000.0)
537 self.assertEqual(float("3.2e3 "), 3200.0)
538 self.assertEqual(float("2.5e-1 "), 0.25)
539 self.assertEqual(float("5e-1"), 0.5)
540 self.assertRaises(ValueError, float, " 3,14 ")
541 self.assertRaises(ValueError, float, " +3,14 ")
542 self.assertRaises(ValueError, float, " -3,14 ")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000543 self.assertRaises(ValueError, float, " 0x3.1 ")
544 self.assertRaises(ValueError, float, " -0x3.p-1 ")
545 self.assertEqual(float(" 25.e-1 "), 2.5)
546 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000547
Brett Cannonc3647ac2005-04-26 03:45:26 +0000548 def test_floatconversion(self):
549 # Make sure that calls to __float__() work properly
550 class Foo0:
551 def __float__(self):
552 return 42.
553
554 class Foo1(object):
555 def __float__(self):
556 return 42.
557
558 class Foo2(float):
559 def __float__(self):
560 return 42.
561
562 class Foo3(float):
563 def __new__(cls, value=0.):
564 return float.__new__(cls, 2*value)
565
566 def __float__(self):
567 return self
568
569 class Foo4(float):
570 def __float__(self):
571 return 42
572
573 self.assertAlmostEqual(float(Foo0()), 42.)
574 self.assertAlmostEqual(float(Foo1()), 42.)
575 self.assertAlmostEqual(float(Foo2()), 42.)
576 self.assertAlmostEqual(float(Foo3(21)), 42.)
577 self.assertRaises(TypeError, float, Foo4(42))
578
Walter Dörwald919497e2003-01-19 16:23:59 +0000579 def test_getattr(self):
580 import sys
581 self.assert_(getattr(sys, 'stdout') is sys.stdout)
582 self.assertRaises(TypeError, getattr, sys, 1)
583 self.assertRaises(TypeError, getattr, sys, 1, "foo")
584 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000585 if have_unicode:
586 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000587
588 def test_hasattr(self):
589 import sys
590 self.assert_(hasattr(sys, 'stdout'))
591 self.assertRaises(TypeError, hasattr, sys, 1)
592 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000593 if have_unicode:
594 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000595
596 def test_hash(self):
597 hash(None)
598 self.assertEqual(hash(1), hash(1L))
599 self.assertEqual(hash(1), hash(1.0))
600 hash('spam')
601 if have_unicode:
602 self.assertEqual(hash('spam'), hash(unicode('spam')))
603 hash((0,1,2,3))
604 def f(): pass
605 self.assertRaises(TypeError, hash, [])
606 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000607 # Bug 1536021: Allow hash to return long objects
608 class X:
609 def __hash__(self):
610 return 2**100
611 self.assertEquals(type(hash(X())), int)
612 class Y(object):
613 def __hash__(self):
614 return 2**100
615 self.assertEquals(type(hash(Y())), int)
616 class Z(long):
617 def __hash__(self):
618 return self
619 self.assertEquals(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000620
621 def test_hex(self):
622 self.assertEqual(hex(16), '0x10')
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000623 self.assertEqual(hex(16L), '0x10')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000624 self.assertEqual(hex(-16), '-0x10')
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000625 self.assertEqual(hex(-16L), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000626 self.assertRaises(TypeError, hex, {})
627
628 def test_id(self):
629 id(None)
630 id(1)
631 id(1L)
632 id(1.0)
633 id('spam')
634 id((0,1,2,3))
635 id([0,1,2,3])
636 id({'spam': 1, 'eggs': 2, 'ham': 3})
637
Walter Dörwald919497e2003-01-19 16:23:59 +0000638 def test_int(self):
639 self.assertEqual(int(314), 314)
640 self.assertEqual(int(3.14), 3)
641 self.assertEqual(int(314L), 314)
642 # Check that conversion from float truncates towards zero
643 self.assertEqual(int(-3.14), -3)
644 self.assertEqual(int(3.9), 3)
645 self.assertEqual(int(-3.9), -3)
646 self.assertEqual(int(3.5), 3)
647 self.assertEqual(int(-3.5), -3)
648 # Different base:
649 self.assertEqual(int("10",16), 16L)
650 if have_unicode:
651 self.assertEqual(int(unicode("10"),16), 16L)
652 # Test conversion from strings and various anomalies
653 for s, v in L:
654 for sign in "", "+", "-":
655 for prefix in "", " ", "\t", " \t\t ":
656 ss = prefix + sign + s
657 vv = v
658 if sign == "-" and v is not ValueError:
659 vv = -v
660 try:
661 self.assertEqual(int(ss), vv)
662 except v:
663 pass
664
Walter Dörwald70a6b492004-02-12 17:35:32 +0000665 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000666 self.assertEqual(int(s)+1, -sys.maxint)
667 # should return long
668 int(s[1:])
669
670 # should return long
671 x = int(1e100)
672 self.assert_(isinstance(x, long))
673 x = int(-1e100)
674 self.assert_(isinstance(x, long))
675
676
677 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
678 # Worked by accident in Windows release build, but failed in debug build.
679 # Failed in all Linux builds.
680 x = -1-sys.maxint
681 self.assertEqual(x >> 1, x//2)
682
683 self.assertRaises(ValueError, int, '123\0')
684 self.assertRaises(ValueError, int, '53', 40)
685
686 x = int('1' * 600)
687 self.assert_(isinstance(x, long))
688
689 if have_unicode:
690 x = int(unichr(0x661) * 600)
691 self.assert_(isinstance(x, long))
692
693 self.assertRaises(TypeError, int, 1, 12)
694
695 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000696 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000697
Thomas Wouters477c8d52006-05-27 19:21:47 +0000698 # SF bug 1334662: int(string, base) wrong answers
699 # Various representations of 2**32 evaluated to 0
700 # rather than 2**32 in previous versions
701
702 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
703 self.assertEqual(int('102002022201221111211', 3), 4294967296L)
704 self.assertEqual(int('10000000000000000', 4), 4294967296L)
705 self.assertEqual(int('32244002423141', 5), 4294967296L)
706 self.assertEqual(int('1550104015504', 6), 4294967296L)
707 self.assertEqual(int('211301422354', 7), 4294967296L)
708 self.assertEqual(int('40000000000', 8), 4294967296L)
709 self.assertEqual(int('12068657454', 9), 4294967296L)
710 self.assertEqual(int('4294967296', 10), 4294967296L)
711 self.assertEqual(int('1904440554', 11), 4294967296L)
712 self.assertEqual(int('9ba461594', 12), 4294967296L)
713 self.assertEqual(int('535a79889', 13), 4294967296L)
714 self.assertEqual(int('2ca5b7464', 14), 4294967296L)
715 self.assertEqual(int('1a20dcd81', 15), 4294967296L)
716 self.assertEqual(int('100000000', 16), 4294967296L)
717 self.assertEqual(int('a7ffda91', 17), 4294967296L)
718 self.assertEqual(int('704he7g4', 18), 4294967296L)
719 self.assertEqual(int('4f5aff66', 19), 4294967296L)
720 self.assertEqual(int('3723ai4g', 20), 4294967296L)
721 self.assertEqual(int('281d55i4', 21), 4294967296L)
722 self.assertEqual(int('1fj8b184', 22), 4294967296L)
723 self.assertEqual(int('1606k7ic', 23), 4294967296L)
724 self.assertEqual(int('mb994ag', 24), 4294967296L)
725 self.assertEqual(int('hek2mgl', 25), 4294967296L)
726 self.assertEqual(int('dnchbnm', 26), 4294967296L)
727 self.assertEqual(int('b28jpdm', 27), 4294967296L)
728 self.assertEqual(int('8pfgih4', 28), 4294967296L)
729 self.assertEqual(int('76beigg', 29), 4294967296L)
730 self.assertEqual(int('5qmcpqg', 30), 4294967296L)
731 self.assertEqual(int('4q0jto4', 31), 4294967296L)
732 self.assertEqual(int('4000000', 32), 4294967296L)
733 self.assertEqual(int('3aokq94', 33), 4294967296L)
734 self.assertEqual(int('2qhxjli', 34), 4294967296L)
735 self.assertEqual(int('2br45qb', 35), 4294967296L)
736 self.assertEqual(int('1z141z4', 36), 4294967296L)
737
738 # SF bug 1334662: int(string, base) wrong answers
739 # Checks for proper evaluation of 2**32 + 1
740 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
741 self.assertEqual(int('102002022201221111212', 3), 4294967297L)
742 self.assertEqual(int('10000000000000001', 4), 4294967297L)
743 self.assertEqual(int('32244002423142', 5), 4294967297L)
744 self.assertEqual(int('1550104015505', 6), 4294967297L)
745 self.assertEqual(int('211301422355', 7), 4294967297L)
746 self.assertEqual(int('40000000001', 8), 4294967297L)
747 self.assertEqual(int('12068657455', 9), 4294967297L)
748 self.assertEqual(int('4294967297', 10), 4294967297L)
749 self.assertEqual(int('1904440555', 11), 4294967297L)
750 self.assertEqual(int('9ba461595', 12), 4294967297L)
751 self.assertEqual(int('535a7988a', 13), 4294967297L)
752 self.assertEqual(int('2ca5b7465', 14), 4294967297L)
753 self.assertEqual(int('1a20dcd82', 15), 4294967297L)
754 self.assertEqual(int('100000001', 16), 4294967297L)
755 self.assertEqual(int('a7ffda92', 17), 4294967297L)
756 self.assertEqual(int('704he7g5', 18), 4294967297L)
757 self.assertEqual(int('4f5aff67', 19), 4294967297L)
758 self.assertEqual(int('3723ai4h', 20), 4294967297L)
759 self.assertEqual(int('281d55i5', 21), 4294967297L)
760 self.assertEqual(int('1fj8b185', 22), 4294967297L)
761 self.assertEqual(int('1606k7id', 23), 4294967297L)
762 self.assertEqual(int('mb994ah', 24), 4294967297L)
763 self.assertEqual(int('hek2mgm', 25), 4294967297L)
764 self.assertEqual(int('dnchbnn', 26), 4294967297L)
765 self.assertEqual(int('b28jpdn', 27), 4294967297L)
766 self.assertEqual(int('8pfgih5', 28), 4294967297L)
767 self.assertEqual(int('76beigh', 29), 4294967297L)
768 self.assertEqual(int('5qmcpqh', 30), 4294967297L)
769 self.assertEqual(int('4q0jto5', 31), 4294967297L)
770 self.assertEqual(int('4000001', 32), 4294967297L)
771 self.assertEqual(int('3aokq95', 33), 4294967297L)
772 self.assertEqual(int('2qhxjlj', 34), 4294967297L)
773 self.assertEqual(int('2br45qc', 35), 4294967297L)
774 self.assertEqual(int('1z141z5', 36), 4294967297L)
775
Brett Cannonc3647ac2005-04-26 03:45:26 +0000776 def test_intconversion(self):
777 # Test __int__()
778 class Foo0:
779 def __int__(self):
780 return 42
781
782 class Foo1(object):
783 def __int__(self):
784 return 42
785
786 class Foo2(int):
787 def __int__(self):
788 return 42
789
790 class Foo3(int):
791 def __int__(self):
792 return self
793
794 class Foo4(int):
795 def __int__(self):
796 return 42L
797
798 class Foo5(int):
799 def __int__(self):
800 return 42.
801
802 self.assertEqual(int(Foo0()), 42)
803 self.assertEqual(int(Foo1()), 42)
804 self.assertEqual(int(Foo2()), 42)
805 self.assertEqual(int(Foo3()), 0)
806 self.assertEqual(int(Foo4()), 42L)
807 self.assertRaises(TypeError, int, Foo5())
808
Walter Dörwald919497e2003-01-19 16:23:59 +0000809 def test_intern(self):
810 self.assertRaises(TypeError, intern)
811 s = "never interned before"
812 self.assert_(intern(s) is s)
813 s2 = s.swapcase().swapcase()
814 self.assert_(intern(s2) is s)
815
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000816 # Subclasses of string can't be interned, because they
817 # provide too much opportunity for insane things to happen.
818 # We don't want them in the interned dict and if they aren't
819 # actually interned, we don't want to create the appearance
820 # that they are by allowing intern() to succeeed.
821 class S(str):
822 def __hash__(self):
823 return 123
824
825 self.assertRaises(TypeError, intern, S("abc"))
826
827 # It's still safe to pass these strings to routines that
828 # call intern internally, e.g. PyObject_SetAttr().
829 s = S("abc")
830 setattr(s, s, s)
831 self.assertEqual(getattr(s, s), s)
832
Walter Dörwald919497e2003-01-19 16:23:59 +0000833 def test_iter(self):
834 self.assertRaises(TypeError, iter)
835 self.assertRaises(TypeError, iter, 42, 42)
836 lists = [("1", "2"), ["1", "2"], "12"]
837 if have_unicode:
838 lists.append(unicode("12"))
839 for l in lists:
840 i = iter(l)
841 self.assertEqual(i.next(), '1')
842 self.assertEqual(i.next(), '2')
843 self.assertRaises(StopIteration, i.next)
844
845 def test_isinstance(self):
846 class C:
847 pass
848 class D(C):
849 pass
850 class E:
851 pass
852 c = C()
853 d = D()
854 e = E()
855 self.assert_(isinstance(c, C))
856 self.assert_(isinstance(d, C))
857 self.assert_(not isinstance(e, C))
858 self.assert_(not isinstance(c, D))
859 self.assert_(not isinstance('foo', E))
860 self.assertRaises(TypeError, isinstance, E, 'foo')
861 self.assertRaises(TypeError, isinstance)
862
863 def test_issubclass(self):
864 class C:
865 pass
866 class D(C):
867 pass
868 class E:
869 pass
870 c = C()
871 d = D()
872 e = E()
873 self.assert_(issubclass(D, C))
874 self.assert_(issubclass(C, C))
875 self.assert_(not issubclass(C, D))
876 self.assertRaises(TypeError, issubclass, 'foo', E)
877 self.assertRaises(TypeError, issubclass, E, 'foo')
878 self.assertRaises(TypeError, issubclass)
879
880 def test_len(self):
881 self.assertEqual(len('123'), 3)
882 self.assertEqual(len(()), 0)
883 self.assertEqual(len((1, 2, 3, 4)), 4)
884 self.assertEqual(len([1, 2, 3, 4]), 4)
885 self.assertEqual(len({}), 0)
886 self.assertEqual(len({'a':1, 'b': 2}), 2)
887 class BadSeq:
888 def __len__(self):
889 raise ValueError
890 self.assertRaises(ValueError, len, BadSeq())
891
892 def test_list(self):
893 self.assertEqual(list([]), [])
894 l0_3 = [0, 1, 2, 3]
895 l0_3_bis = list(l0_3)
896 self.assertEqual(l0_3, l0_3_bis)
897 self.assert_(l0_3 is not l0_3_bis)
898 self.assertEqual(list(()), [])
899 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
900 self.assertEqual(list(''), [])
901 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
902
903 if sys.maxint == 0x7fffffff:
904 # This test can currently only work on 32-bit machines.
905 # XXX If/when PySequence_Length() returns a ssize_t, it should be
906 # XXX re-enabled.
907 # Verify clearing of bug #556025.
908 # This assumes that the max data size (sys.maxint) == max
909 # address size this also assumes that the address size is at
910 # least 4 bytes with 8 byte addresses, the bug is not well
911 # tested
912 #
913 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
914 # earlier due to a newlib bug. See the following mailing list
915 # thread for the details:
916
917 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
918 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
919
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000920 # This code used to segfault in Py2.4a3
921 x = []
922 x.extend(-y for y in x)
923 self.assertEqual(x, [])
924
Walter Dörwald919497e2003-01-19 16:23:59 +0000925 def test_long(self):
926 self.assertEqual(long(314), 314L)
927 self.assertEqual(long(3.14), 3L)
928 self.assertEqual(long(314L), 314L)
929 # Check that conversion from float truncates towards zero
930 self.assertEqual(long(-3.14), -3L)
931 self.assertEqual(long(3.9), 3L)
932 self.assertEqual(long(-3.9), -3L)
933 self.assertEqual(long(3.5), 3L)
934 self.assertEqual(long(-3.5), -3L)
935 self.assertEqual(long("-3"), -3L)
936 if have_unicode:
937 self.assertEqual(long(unicode("-3")), -3L)
938 # Different base:
939 self.assertEqual(long("10",16), 16L)
940 if have_unicode:
941 self.assertEqual(long(unicode("10"),16), 16L)
942 # Check conversions from string (same test set as for int(), and then some)
943 LL = [
944 ('1' + '0'*20, 10L**20),
945 ('1' + '0'*100, 10L**100)
946 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000947 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000948 if have_unicode:
949 L2 += [
950 (unicode('1') + unicode('0')*20, 10L**20),
951 (unicode('1') + unicode('0')*100, 10L**100),
952 ]
953 for s, v in L2 + LL:
954 for sign in "", "+", "-":
955 for prefix in "", " ", "\t", " \t\t ":
956 ss = prefix + sign + s
957 vv = v
958 if sign == "-" and v is not ValueError:
959 vv = -v
960 try:
961 self.assertEqual(long(ss), long(vv))
962 except v:
963 pass
964
965 self.assertRaises(ValueError, long, '123\0')
966 self.assertRaises(ValueError, long, '53', 40)
967 self.assertRaises(TypeError, long, 1, 12)
968
Thomas Wouters477c8d52006-05-27 19:21:47 +0000969 self.assertEqual(long('100000000000000000000000000000000', 2),
970 4294967296)
971 self.assertEqual(long('102002022201221111211', 3), 4294967296)
972 self.assertEqual(long('10000000000000000', 4), 4294967296)
973 self.assertEqual(long('32244002423141', 5), 4294967296)
974 self.assertEqual(long('1550104015504', 6), 4294967296)
975 self.assertEqual(long('211301422354', 7), 4294967296)
976 self.assertEqual(long('40000000000', 8), 4294967296)
977 self.assertEqual(long('12068657454', 9), 4294967296)
978 self.assertEqual(long('4294967296', 10), 4294967296)
979 self.assertEqual(long('1904440554', 11), 4294967296)
980 self.assertEqual(long('9ba461594', 12), 4294967296)
981 self.assertEqual(long('535a79889', 13), 4294967296)
982 self.assertEqual(long('2ca5b7464', 14), 4294967296)
983 self.assertEqual(long('1a20dcd81', 15), 4294967296)
984 self.assertEqual(long('100000000', 16), 4294967296)
985 self.assertEqual(long('a7ffda91', 17), 4294967296)
986 self.assertEqual(long('704he7g4', 18), 4294967296)
987 self.assertEqual(long('4f5aff66', 19), 4294967296)
988 self.assertEqual(long('3723ai4g', 20), 4294967296)
989 self.assertEqual(long('281d55i4', 21), 4294967296)
990 self.assertEqual(long('1fj8b184', 22), 4294967296)
991 self.assertEqual(long('1606k7ic', 23), 4294967296)
992 self.assertEqual(long('mb994ag', 24), 4294967296)
993 self.assertEqual(long('hek2mgl', 25), 4294967296)
994 self.assertEqual(long('dnchbnm', 26), 4294967296)
995 self.assertEqual(long('b28jpdm', 27), 4294967296)
996 self.assertEqual(long('8pfgih4', 28), 4294967296)
997 self.assertEqual(long('76beigg', 29), 4294967296)
998 self.assertEqual(long('5qmcpqg', 30), 4294967296)
999 self.assertEqual(long('4q0jto4', 31), 4294967296)
1000 self.assertEqual(long('4000000', 32), 4294967296)
1001 self.assertEqual(long('3aokq94', 33), 4294967296)
1002 self.assertEqual(long('2qhxjli', 34), 4294967296)
1003 self.assertEqual(long('2br45qb', 35), 4294967296)
1004 self.assertEqual(long('1z141z4', 36), 4294967296)
1005
1006 self.assertEqual(long('100000000000000000000000000000001', 2),
1007 4294967297)
1008 self.assertEqual(long('102002022201221111212', 3), 4294967297)
1009 self.assertEqual(long('10000000000000001', 4), 4294967297)
1010 self.assertEqual(long('32244002423142', 5), 4294967297)
1011 self.assertEqual(long('1550104015505', 6), 4294967297)
1012 self.assertEqual(long('211301422355', 7), 4294967297)
1013 self.assertEqual(long('40000000001', 8), 4294967297)
1014 self.assertEqual(long('12068657455', 9), 4294967297)
1015 self.assertEqual(long('4294967297', 10), 4294967297)
1016 self.assertEqual(long('1904440555', 11), 4294967297)
1017 self.assertEqual(long('9ba461595', 12), 4294967297)
1018 self.assertEqual(long('535a7988a', 13), 4294967297)
1019 self.assertEqual(long('2ca5b7465', 14), 4294967297)
1020 self.assertEqual(long('1a20dcd82', 15), 4294967297)
1021 self.assertEqual(long('100000001', 16), 4294967297)
1022 self.assertEqual(long('a7ffda92', 17), 4294967297)
1023 self.assertEqual(long('704he7g5', 18), 4294967297)
1024 self.assertEqual(long('4f5aff67', 19), 4294967297)
1025 self.assertEqual(long('3723ai4h', 20), 4294967297)
1026 self.assertEqual(long('281d55i5', 21), 4294967297)
1027 self.assertEqual(long('1fj8b185', 22), 4294967297)
1028 self.assertEqual(long('1606k7id', 23), 4294967297)
1029 self.assertEqual(long('mb994ah', 24), 4294967297)
1030 self.assertEqual(long('hek2mgm', 25), 4294967297)
1031 self.assertEqual(long('dnchbnn', 26), 4294967297)
1032 self.assertEqual(long('b28jpdn', 27), 4294967297)
1033 self.assertEqual(long('8pfgih5', 28), 4294967297)
1034 self.assertEqual(long('76beigh', 29), 4294967297)
1035 self.assertEqual(long('5qmcpqh', 30), 4294967297)
1036 self.assertEqual(long('4q0jto5', 31), 4294967297)
1037 self.assertEqual(long('4000001', 32), 4294967297)
1038 self.assertEqual(long('3aokq95', 33), 4294967297)
1039 self.assertEqual(long('2qhxjlj', 34), 4294967297)
1040 self.assertEqual(long('2br45qc', 35), 4294967297)
1041 self.assertEqual(long('1z141z5', 36), 4294967297)
1042
1043
Brett Cannonc3647ac2005-04-26 03:45:26 +00001044 def test_longconversion(self):
1045 # Test __long__()
1046 class Foo0:
1047 def __long__(self):
1048 return 42L
1049
1050 class Foo1(object):
1051 def __long__(self):
1052 return 42L
1053
1054 class Foo2(long):
1055 def __long__(self):
1056 return 42L
1057
1058 class Foo3(long):
1059 def __long__(self):
1060 return self
1061
1062 class Foo4(long):
1063 def __long__(self):
1064 return 42
1065
1066 class Foo5(long):
1067 def __long__(self):
1068 return 42.
1069
1070 self.assertEqual(long(Foo0()), 42L)
1071 self.assertEqual(long(Foo1()), 42L)
1072 self.assertEqual(long(Foo2()), 42L)
1073 self.assertEqual(long(Foo3()), 0)
1074 self.assertEqual(long(Foo4()), 42)
1075 self.assertRaises(TypeError, long, Foo5())
1076
Walter Dörwald919497e2003-01-19 16:23:59 +00001077 def test_map(self):
1078 self.assertEqual(
1079 map(None, 'hello world'),
1080 ['h','e','l','l','o',' ','w','o','r','l','d']
1081 )
1082 self.assertEqual(
1083 map(None, 'abcd', 'efg'),
1084 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
1085 )
1086 self.assertEqual(
1087 map(None, range(10)),
1088 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1089 )
1090 self.assertEqual(
1091 map(lambda x: x*x, range(1,4)),
1092 [1, 4, 9]
1093 )
1094 try:
1095 from math import sqrt
1096 except ImportError:
1097 def sqrt(x):
1098 return pow(x, 0.5)
1099 self.assertEqual(
1100 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
1101 [[4.0, 2.0], [9.0, 3.0]]
1102 )
1103 self.assertEqual(
1104 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
1105 [10, 4, 6]
1106 )
1107
1108 def plus(*v):
1109 accu = 0
1110 for i in v: accu = accu + i
1111 return accu
1112 self.assertEqual(
1113 map(plus, [1, 3, 7]),
1114 [1, 3, 7]
1115 )
1116 self.assertEqual(
1117 map(plus, [1, 3, 7], [4, 9, 2]),
1118 [1+4, 3+9, 7+2]
1119 )
1120 self.assertEqual(
1121 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
1122 [1+4+1, 3+9+1, 7+2+0]
1123 )
1124 self.assertEqual(
1125 map(None, Squares(10)),
1126 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1127 )
1128 self.assertEqual(
1129 map(int, Squares(10)),
1130 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1131 )
1132 self.assertEqual(
1133 map(None, Squares(3), Squares(2)),
1134 [(0,0), (1,1), (4,None)]
1135 )
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001136 def Max(a, b):
1137 if a is None:
1138 return b
1139 if b is None:
1140 return a
1141 return max(a, b)
Walter Dörwald919497e2003-01-19 16:23:59 +00001142 self.assertEqual(
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001143 map(Max, Squares(3), Squares(2)),
Walter Dörwald919497e2003-01-19 16:23:59 +00001144 [0, 1, 4]
1145 )
1146 self.assertRaises(TypeError, map)
1147 self.assertRaises(TypeError, map, lambda x: x, 42)
1148 self.assertEqual(map(None, [42]), [42])
1149 class BadSeq:
1150 def __getitem__(self, index):
1151 raise ValueError
1152 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001153 def badfunc(x):
1154 raise RuntimeError
1155 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001156
1157 def test_max(self):
1158 self.assertEqual(max('123123'), '3')
1159 self.assertEqual(max(1, 2, 3), 3)
1160 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1161 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1162
1163 self.assertEqual(max(1, 2L, 3.0), 3.0)
1164 self.assertEqual(max(1L, 2.0, 3), 3)
1165 self.assertEqual(max(1.0, 2, 3L), 3L)
1166
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001167 for stmt in (
1168 "max(key=int)", # no args
1169 "max(1, key=int)", # single arg not iterable
1170 "max(1, 2, keystone=int)", # wrong keyword
1171 "max(1, 2, key=int, abc=int)", # two many keywords
1172 "max(1, 2, key=1)", # keyfunc is not callable
1173 ):
Tim Peters7f061872004-12-07 21:17:46 +00001174 try:
1175 exec(stmt) in globals()
1176 except TypeError:
1177 pass
1178 else:
1179 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001180
1181 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1182 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1183 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1184
1185 data = [random.randrange(200) for i in range(100)]
1186 keys = dict((elem, random.randrange(50)) for elem in data)
1187 f = keys.__getitem__
1188 self.assertEqual(max(data, key=f),
1189 sorted(reversed(data), key=f)[-1])
1190
Walter Dörwald919497e2003-01-19 16:23:59 +00001191 def test_min(self):
1192 self.assertEqual(min('123123'), '1')
1193 self.assertEqual(min(1, 2, 3), 1)
1194 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1195 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1196
1197 self.assertEqual(min(1, 2L, 3.0), 1)
1198 self.assertEqual(min(1L, 2.0, 3), 1L)
1199 self.assertEqual(min(1.0, 2, 3L), 1.0)
1200
1201 self.assertRaises(TypeError, min)
1202 self.assertRaises(TypeError, min, 42)
1203 self.assertRaises(ValueError, min, ())
1204 class BadSeq:
1205 def __getitem__(self, index):
1206 raise ValueError
1207 self.assertRaises(ValueError, min, BadSeq())
1208 class BadNumber:
1209 def __cmp__(self, other):
1210 raise ValueError
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001211 self.assertRaises(TypeError, min, (42, BadNumber()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001212
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001213 for stmt in (
1214 "min(key=int)", # no args
1215 "min(1, key=int)", # single arg not iterable
1216 "min(1, 2, keystone=int)", # wrong keyword
1217 "min(1, 2, key=int, abc=int)", # two many keywords
1218 "min(1, 2, key=1)", # keyfunc is not callable
1219 ):
Tim Peters7f061872004-12-07 21:17:46 +00001220 try:
1221 exec(stmt) in globals()
1222 except TypeError:
1223 pass
1224 else:
1225 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001226
1227 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1228 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1229 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1230
1231 data = [random.randrange(200) for i in range(100)]
1232 keys = dict((elem, random.randrange(50)) for elem in data)
1233 f = keys.__getitem__
1234 self.assertEqual(min(data, key=f),
1235 sorted(data, key=f)[0])
1236
Walter Dörwald919497e2003-01-19 16:23:59 +00001237 def test_oct(self):
1238 self.assertEqual(oct(100), '0144')
Guido van Rossume2b70bc2006-08-18 22:13:04 +00001239 self.assertEqual(oct(100L), '0144')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001240 self.assertEqual(oct(-100), '-0144')
Guido van Rossume2b70bc2006-08-18 22:13:04 +00001241 self.assertEqual(oct(-100L), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001242 self.assertRaises(TypeError, oct, ())
1243
1244 def write_testfile(self):
Walter Dörwald919497e2003-01-19 16:23:59 +00001245 fp = open(TESTFN, 'w')
1246 try:
1247 fp.write('1+1\n')
1248 fp.write('1+1\n')
1249 fp.write('The quick brown fox jumps over the lazy dog')
1250 fp.write('.\n')
1251 fp.write('Dear John\n')
1252 fp.write('XXX'*100)
1253 fp.write('YYY'*100)
1254 finally:
1255 fp.close()
1256
1257 def test_open(self):
1258 self.write_testfile()
1259 fp = open(TESTFN, 'r')
1260 try:
1261 self.assertEqual(fp.readline(4), '1+1\n')
1262 self.assertEqual(fp.readline(4), '1+1\n')
1263 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1264 self.assertEqual(fp.readline(4), 'Dear')
1265 self.assertEqual(fp.readline(100), ' John\n')
1266 self.assertEqual(fp.read(300), 'XXX'*100)
1267 self.assertEqual(fp.read(1000), 'YYY'*100)
1268 finally:
1269 fp.close()
1270 unlink(TESTFN)
1271
1272 def test_ord(self):
1273 self.assertEqual(ord(' '), 32)
1274 self.assertEqual(ord('A'), 65)
1275 self.assertEqual(ord('a'), 97)
1276 if have_unicode:
1277 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1278 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001279 if have_unicode:
1280 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001281
1282 def test_pow(self):
1283 self.assertEqual(pow(0,0), 1)
1284 self.assertEqual(pow(0,1), 0)
1285 self.assertEqual(pow(1,0), 1)
1286 self.assertEqual(pow(1,1), 1)
1287
1288 self.assertEqual(pow(2,0), 1)
1289 self.assertEqual(pow(2,10), 1024)
1290 self.assertEqual(pow(2,20), 1024*1024)
1291 self.assertEqual(pow(2,30), 1024*1024*1024)
1292
1293 self.assertEqual(pow(-2,0), 1)
1294 self.assertEqual(pow(-2,1), -2)
1295 self.assertEqual(pow(-2,2), 4)
1296 self.assertEqual(pow(-2,3), -8)
1297
1298 self.assertEqual(pow(0L,0), 1)
1299 self.assertEqual(pow(0L,1), 0)
1300 self.assertEqual(pow(1L,0), 1)
1301 self.assertEqual(pow(1L,1), 1)
1302
1303 self.assertEqual(pow(2L,0), 1)
1304 self.assertEqual(pow(2L,10), 1024)
1305 self.assertEqual(pow(2L,20), 1024*1024)
1306 self.assertEqual(pow(2L,30), 1024*1024*1024)
1307
1308 self.assertEqual(pow(-2L,0), 1)
1309 self.assertEqual(pow(-2L,1), -2)
1310 self.assertEqual(pow(-2L,2), 4)
1311 self.assertEqual(pow(-2L,3), -8)
1312
1313 self.assertAlmostEqual(pow(0.,0), 1.)
1314 self.assertAlmostEqual(pow(0.,1), 0.)
1315 self.assertAlmostEqual(pow(1.,0), 1.)
1316 self.assertAlmostEqual(pow(1.,1), 1.)
1317
1318 self.assertAlmostEqual(pow(2.,0), 1.)
1319 self.assertAlmostEqual(pow(2.,10), 1024.)
1320 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1321 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1322
1323 self.assertAlmostEqual(pow(-2.,0), 1.)
1324 self.assertAlmostEqual(pow(-2.,1), -2.)
1325 self.assertAlmostEqual(pow(-2.,2), 4.)
1326 self.assertAlmostEqual(pow(-2.,3), -8.)
1327
1328 for x in 2, 2L, 2.0:
1329 for y in 10, 10L, 10.0:
1330 for z in 1000, 1000L, 1000.0:
1331 if isinstance(x, float) or \
1332 isinstance(y, float) or \
1333 isinstance(z, float):
1334 self.assertRaises(TypeError, pow, x, y, z)
1335 else:
1336 self.assertAlmostEqual(pow(x, y, z), 24.0)
1337
1338 self.assertRaises(TypeError, pow, -1, -2, 3)
1339 self.assertRaises(ValueError, pow, 1, 2, 0)
1340 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1341 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1342 self.assertRaises(ValueError, pow, -342.43, 0.234)
1343
1344 self.assertRaises(TypeError, pow)
1345
1346 def test_range(self):
1347 self.assertEqual(range(3), [0, 1, 2])
1348 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1349 self.assertEqual(range(0), [])
1350 self.assertEqual(range(-3), [])
1351 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1352 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1353
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001354 # Now test range() with longs
1355 self.assertEqual(range(-2**100), [])
1356 self.assertEqual(range(0, -2**100), [])
1357 self.assertEqual(range(0, 2**100, -1), [])
1358 self.assertEqual(range(0, 2**100, -1), [])
1359
1360 a = long(10 * sys.maxint)
1361 b = long(100 * sys.maxint)
1362 c = long(50 * sys.maxint)
1363
1364 self.assertEqual(range(a, a+2), [a, a+1])
1365 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1366 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1367
1368 seq = range(a, b, c)
1369 self.assert_(a in seq)
1370 self.assert_(b not in seq)
1371 self.assertEqual(len(seq), 2)
1372
1373 seq = range(b, a, -c)
1374 self.assert_(b in seq)
1375 self.assert_(a not in seq)
1376 self.assertEqual(len(seq), 2)
1377
1378 seq = range(-a, -b, -c)
1379 self.assert_(-a in seq)
1380 self.assert_(-b not in seq)
1381 self.assertEqual(len(seq), 2)
1382
Walter Dörwald919497e2003-01-19 16:23:59 +00001383 self.assertRaises(TypeError, range)
1384 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1385 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001386 self.assertRaises(ValueError, range, a, a + 1, long(0))
1387
1388 class badzero(int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001389 def __eq__(self, other):
Neal Norwitzfcf44352005-11-27 20:37:43 +00001390 raise RuntimeError
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001391 __ne__ = __lt__ = __gt__ = __le__ = __ge__ = __eq__
1392
1393 # XXX This won't (but should!) raise RuntimeError if a is an int...
Neal Norwitzfcf44352005-11-27 20:37:43 +00001394 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001395
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001396 # Reject floats when it would require PyLongs to represent.
1397 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001398 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001399
Walter Dörwald357981e2003-04-15 18:59:28 +00001400 self.assertRaises(TypeError, range, 0, "spam")
1401 self.assertRaises(TypeError, range, 0, 42, "spam")
1402
1403 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1404 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1405
Walter Dörwald919497e2003-01-19 16:23:59 +00001406 def test_reload(self):
1407 import marshal
1408 reload(marshal)
1409 import string
1410 reload(string)
1411 ## import sys
1412 ## self.assertRaises(ImportError, reload, sys)
1413
1414 def test_repr(self):
1415 self.assertEqual(repr(''), '\'\'')
1416 self.assertEqual(repr(0), '0')
Guido van Rossume2b70bc2006-08-18 22:13:04 +00001417 self.assertEqual(repr(0L), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001418 self.assertEqual(repr(()), '()')
1419 self.assertEqual(repr([]), '[]')
1420 self.assertEqual(repr({}), '{}')
1421 a = []
1422 a.append(a)
1423 self.assertEqual(repr(a), '[[...]]')
1424 a = {}
1425 a[0] = a
1426 self.assertEqual(repr(a), '{0: {...}}')
1427
1428 def test_round(self):
1429 self.assertEqual(round(0.0), 0.0)
1430 self.assertEqual(round(1.0), 1.0)
1431 self.assertEqual(round(10.0), 10.0)
1432 self.assertEqual(round(1000000000.0), 1000000000.0)
1433 self.assertEqual(round(1e20), 1e20)
1434
1435 self.assertEqual(round(-1.0), -1.0)
1436 self.assertEqual(round(-10.0), -10.0)
1437 self.assertEqual(round(-1000000000.0), -1000000000.0)
1438 self.assertEqual(round(-1e20), -1e20)
1439
1440 self.assertEqual(round(0.1), 0.0)
1441 self.assertEqual(round(1.1), 1.0)
1442 self.assertEqual(round(10.1), 10.0)
1443 self.assertEqual(round(1000000000.1), 1000000000.0)
1444
1445 self.assertEqual(round(-1.1), -1.0)
1446 self.assertEqual(round(-10.1), -10.0)
1447 self.assertEqual(round(-1000000000.1), -1000000000.0)
1448
1449 self.assertEqual(round(0.9), 1.0)
1450 self.assertEqual(round(9.9), 10.0)
1451 self.assertEqual(round(999999999.9), 1000000000.0)
1452
1453 self.assertEqual(round(-0.9), -1.0)
1454 self.assertEqual(round(-9.9), -10.0)
1455 self.assertEqual(round(-999999999.9), -1000000000.0)
1456
1457 self.assertEqual(round(-8.0, -1), -10.0)
1458
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001459 # test new kwargs
1460 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1461
Walter Dörwald919497e2003-01-19 16:23:59 +00001462 self.assertRaises(TypeError, round)
1463
1464 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001465 setattr(sys, 'spam', 1)
1466 self.assertEqual(sys.spam, 1)
1467 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1468 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001469
1470 def test_str(self):
1471 self.assertEqual(str(''), '')
1472 self.assertEqual(str(0), '0')
1473 self.assertEqual(str(0L), '0')
1474 self.assertEqual(str(()), '()')
1475 self.assertEqual(str([]), '[]')
1476 self.assertEqual(str({}), '{}')
1477 a = []
1478 a.append(a)
1479 self.assertEqual(str(a), '[[...]]')
1480 a = {}
1481 a[0] = a
1482 self.assertEqual(str(a), '{0: {...}}')
1483
Alex Martellia70b1912003-04-22 08:12:33 +00001484 def test_sum(self):
1485 self.assertEqual(sum([]), 0)
1486 self.assertEqual(sum(range(2,8)), 27)
1487 self.assertEqual(sum(iter(range(2,8))), 27)
1488 self.assertEqual(sum(Squares(10)), 285)
1489 self.assertEqual(sum(iter(Squares(10))), 285)
1490 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1491
1492 self.assertRaises(TypeError, sum)
1493 self.assertRaises(TypeError, sum, 42)
1494 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1495 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1496 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1497 self.assertRaises(TypeError, sum, [{2:3}])
1498 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1499
1500 class BadSeq:
1501 def __getitem__(self, index):
1502 raise ValueError
1503 self.assertRaises(ValueError, sum, BadSeq())
1504
Walter Dörwald919497e2003-01-19 16:23:59 +00001505 def test_tuple(self):
1506 self.assertEqual(tuple(()), ())
1507 t0_3 = (0, 1, 2, 3)
1508 t0_3_bis = tuple(t0_3)
1509 self.assert_(t0_3 is t0_3_bis)
1510 self.assertEqual(tuple([]), ())
1511 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1512 self.assertEqual(tuple(''), ())
1513 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1514
1515 def test_type(self):
1516 self.assertEqual(type(''), type('123'))
1517 self.assertNotEqual(type(''), type(()))
1518
1519 def test_unichr(self):
1520 if have_unicode:
1521 self.assertEqual(unichr(32), unicode(' '))
1522 self.assertEqual(unichr(65), unicode('A'))
1523 self.assertEqual(unichr(97), unicode('a'))
1524 self.assertEqual(
1525 unichr(sys.maxunicode),
1526 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1527 )
1528 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1529 self.assertRaises(TypeError, unichr)
1530
Guido van Rossumfee7b932005-01-16 00:21:28 +00001531 # We don't want self in vars(), so these are static methods
1532
1533 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001534 def get_vars_f0():
1535 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001536
Guido van Rossumfee7b932005-01-16 00:21:28 +00001537 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001538 def get_vars_f2():
1539 BuiltinTest.get_vars_f0()
1540 a = 1
1541 b = 2
1542 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001543
1544 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001545 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001546 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001547 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001548 self.assertEqual(self.get_vars_f0(), {})
1549 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1550 self.assertRaises(TypeError, vars, 42, 42)
1551 self.assertRaises(TypeError, vars, 42)
1552
1553 def test_zip(self):
1554 a = (1, 2, 3)
1555 b = (4, 5, 6)
1556 t = [(1, 4), (2, 5), (3, 6)]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001557 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001558 b = [4, 5, 6]
Guido van Rossum801f0d72006-08-24 19:48:10 +00001559 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001560 b = (4, 5, 6, 7)
Guido van Rossum801f0d72006-08-24 19:48:10 +00001561 self.assertEqual(list(zip(a, b)), t)
Walter Dörwald919497e2003-01-19 16:23:59 +00001562 class I:
1563 def __getitem__(self, i):
1564 if i < 0 or i > 2: raise IndexError
1565 return i + 4
Guido van Rossum801f0d72006-08-24 19:48:10 +00001566 self.assertEqual(list(zip(a, I())), t)
1567 self.assertEqual(list(zip()), [])
1568 self.assertEqual(list(zip(*[])), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001569 self.assertRaises(TypeError, zip, None)
1570 class G:
1571 pass
1572 self.assertRaises(TypeError, zip, a, G())
1573
1574 # Make sure zip doesn't try to allocate a billion elements for the
1575 # result list when one of its arguments doesn't say how long it is.
1576 # A MemoryError is the most likely failure mode.
1577 class SequenceWithoutALength:
1578 def __getitem__(self, i):
1579 if i == 5:
1580 raise IndexError
1581 else:
1582 return i
1583 self.assertEqual(
Guido van Rossum801f0d72006-08-24 19:48:10 +00001584 list(zip(SequenceWithoutALength(), xrange(2**30))),
Walter Dörwald919497e2003-01-19 16:23:59 +00001585 list(enumerate(range(5)))
1586 )
1587
1588 class BadSeq:
1589 def __getitem__(self, i):
1590 if i == 5:
1591 raise ValueError
1592 else:
1593 return i
Guido van Rossum801f0d72006-08-24 19:48:10 +00001594 self.assertRaises(ValueError, list, zip(BadSeq(), BadSeq()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001595
Raymond Hettinger64958a12003-12-17 20:43:33 +00001596class TestSorted(unittest.TestCase):
1597
1598 def test_basic(self):
1599 data = range(100)
1600 copy = data[:]
1601 random.shuffle(copy)
1602 self.assertEqual(data, sorted(copy))
1603 self.assertNotEqual(data, copy)
1604
1605 data.reverse()
1606 random.shuffle(copy)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001607 self.assertEqual(data, sorted(copy, cmp=lambda x, y: (x < y) - (x > y)))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001608 self.assertNotEqual(data, copy)
1609 random.shuffle(copy)
1610 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1611 self.assertNotEqual(data, copy)
1612 random.shuffle(copy)
1613 self.assertEqual(data, sorted(copy, reverse=1))
1614 self.assertNotEqual(data, copy)
1615
1616 def test_inputtypes(self):
1617 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001618 types = [list, tuple]
1619 if have_unicode:
1620 types.insert(0, unicode)
1621 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001622 self.assertEqual(sorted(s), sorted(T(s)))
1623
1624 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001625 types = [set, frozenset, list, tuple, dict.fromkeys]
1626 if have_unicode:
1627 types.insert(0, unicode)
1628 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001629 self.assertEqual(sorted(s), sorted(T(s)))
1630
1631 def test_baddecorator(self):
1632 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1633 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1634
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001635def test_main(verbose=None):
1636 test_classes = (BuiltinTest, TestSorted)
1637
1638 run_unittest(*test_classes)
1639
1640 # verify reference counting
1641 if verbose and hasattr(sys, "gettotalrefcount"):
1642 import gc
1643 counts = [None] * 5
1644 for i in xrange(len(counts)):
1645 run_unittest(*test_classes)
1646 gc.collect()
1647 counts[i] = sys.gettotalrefcount()
1648 print counts
1649
Walter Dörwald919497e2003-01-19 16:23:59 +00001650
1651if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001652 test_main(verbose=True)