blob: b0dbd4a17b6d407f1dff9f06934b46641dd7a92e [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
182 def test_cmp(self):
183 self.assertEqual(cmp(-1, 1), -1)
184 self.assertEqual(cmp(1, -1), 1)
185 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000186 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000187 a = []; a.append(a)
188 b = []; b.append(b)
189 from UserList import UserList
190 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000191 self.assertRaises(RuntimeError, cmp, a, b)
192 self.assertRaises(RuntimeError, cmp, b, c)
193 self.assertRaises(RuntimeError, cmp, c, a)
194 self.assertRaises(RuntimeError, cmp, a, c)
195 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000196 a.pop(); b.pop(); c.pop()
197 self.assertRaises(TypeError, cmp)
198
Walter Dörwald919497e2003-01-19 16:23:59 +0000199 def test_compile(self):
200 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000201 bom = '\xef\xbb\xbf'
202 compile(bom + 'print 1\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000203 self.assertRaises(TypeError, compile)
204 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
205 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000206 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000207 if have_unicode:
208 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000209 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
210 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000211
Walter Dörwald919497e2003-01-19 16:23:59 +0000212 def test_delattr(self):
213 import sys
214 sys.spam = 1
215 delattr(sys, 'spam')
216 self.assertRaises(TypeError, delattr)
217
218 def test_dir(self):
219 x = 1
220 self.assert_('x' in dir())
221 import sys
222 self.assert_('modules' in dir(sys))
223 self.assertRaises(TypeError, dir, 42, 42)
224
225 def test_divmod(self):
226 self.assertEqual(divmod(12, 7), (1, 5))
227 self.assertEqual(divmod(-12, 7), (-2, 2))
228 self.assertEqual(divmod(12, -7), (-2, -2))
229 self.assertEqual(divmod(-12, -7), (1, -5))
230
231 self.assertEqual(divmod(12L, 7L), (1L, 5L))
232 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
233 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
234 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
235
236 self.assertEqual(divmod(12, 7L), (1, 5L))
237 self.assertEqual(divmod(-12, 7L), (-2, 2L))
238 self.assertEqual(divmod(12L, -7), (-2L, -2))
239 self.assertEqual(divmod(-12L, -7), (1L, -5))
240
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000241 self.assertEqual(divmod(-sys.maxint-1, -1),
242 (sys.maxint+1, 0))
243
Walter Dörwald919497e2003-01-19 16:23:59 +0000244 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
245 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
246 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
247 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
248
249 self.assertRaises(TypeError, divmod)
250
251 def test_eval(self):
252 self.assertEqual(eval('1+1'), 2)
253 self.assertEqual(eval(' 1+1\n'), 2)
254 globals = {'a': 1, 'b': 2}
255 locals = {'b': 200, 'c': 300}
256 self.assertEqual(eval('a', globals) , 1)
257 self.assertEqual(eval('a', globals, locals), 1)
258 self.assertEqual(eval('b', globals, locals), 200)
259 self.assertEqual(eval('c', globals, locals), 300)
260 if have_unicode:
261 self.assertEqual(eval(unicode('1+1')), 2)
262 self.assertEqual(eval(unicode(' 1+1\n')), 2)
263 globals = {'a': 1, 'b': 2}
264 locals = {'b': 200, 'c': 300}
265 if have_unicode:
266 self.assertEqual(eval(unicode('a'), globals), 1)
267 self.assertEqual(eval(unicode('a'), globals, locals), 1)
268 self.assertEqual(eval(unicode('b'), globals, locals), 200)
269 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000270 bom = '\xef\xbb\xbf'
271 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000272 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
273 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000274 self.assertRaises(TypeError, eval)
275 self.assertRaises(TypeError, eval, ())
276
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000277 def test_general_eval(self):
278 # Tests that general mappings can be used for the locals argument
279
280 class M:
281 "Test mapping interface versus possible calls from eval()."
282 def __getitem__(self, key):
283 if key == 'a':
284 return 12
285 raise KeyError
286 def keys(self):
287 return list('xyz')
288
289 m = M()
290 g = globals()
291 self.assertEqual(eval('a', g, m), 12)
292 self.assertRaises(NameError, eval, 'b', g, m)
293 self.assertEqual(eval('dir()', g, m), list('xyz'))
294 self.assertEqual(eval('globals()', g, m), g)
295 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000296 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000297 class A:
298 "Non-mapping"
299 pass
300 m = A()
301 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000302
303 # Verify that dict subclasses work as well
304 class D(dict):
305 def __getitem__(self, key):
306 if key == 'a':
307 return 12
308 return dict.__getitem__(self, key)
309 def keys(self):
310 return list('xyz')
311
312 d = D()
313 self.assertEqual(eval('a', g, d), 12)
314 self.assertRaises(NameError, eval, 'b', g, d)
315 self.assertEqual(eval('dir()', g, d), list('xyz'))
316 self.assertEqual(eval('globals()', g, d), g)
317 self.assertEqual(eval('locals()', g, d), d)
318
319 # Verify locals stores (used by list comps)
320 eval('[locals() for i in (2,3)]', g, d)
321 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
322
323 class SpreadSheet:
324 "Sample application showing nested, calculated lookups."
325 _cells = {}
326 def __setitem__(self, key, formula):
327 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000328 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000329 return eval(self._cells[key], globals(), self)
330
331 ss = SpreadSheet()
332 ss['a1'] = '5'
333 ss['a2'] = 'a1*6'
334 ss['a3'] = 'a2*7'
335 self.assertEqual(ss['a3'], 210)
336
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000337 # Verify that dir() catches a non-list returned by eval
338 # SF bug #1004669
339 class C:
340 def __getitem__(self, item):
341 raise KeyError(item)
342 def keys(self):
343 return 'a'
344 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
345
Walter Dörwald919497e2003-01-19 16:23:59 +0000346 # Done outside of the method test_z to get the correct scope
347 z = 0
348 f = open(TESTFN, 'w')
349 f.write('z = z+1\n')
350 f.write('z = z*2\n')
351 f.close()
352 execfile(TESTFN)
353
354 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000355 global numruns
356 if numruns:
357 return
358 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000359
Walter Dörwald919497e2003-01-19 16:23:59 +0000360 globals = {'a': 1, 'b': 2}
361 locals = {'b': 200, 'c': 300}
362
363 self.assertEqual(self.__class__.z, 2)
364 globals['z'] = 0
365 execfile(TESTFN, globals)
366 self.assertEqual(globals['z'], 2)
367 locals['z'] = 0
368 execfile(TESTFN, globals, locals)
369 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000370
371 class M:
372 "Test mapping interface versus possible calls from execfile()."
373 def __init__(self):
374 self.z = 10
375 def __getitem__(self, key):
376 if key == 'z':
377 return self.z
378 raise KeyError
379 def __setitem__(self, key, value):
380 if key == 'z':
381 self.z = value
382 return
383 raise KeyError
384
385 locals = M()
386 locals['z'] = 0
387 execfile(TESTFN, globals, locals)
388 self.assertEqual(locals['z'], 2)
389
Walter Dörwald919497e2003-01-19 16:23:59 +0000390 unlink(TESTFN)
391 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000392 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000393 import os
394 self.assertRaises(IOError, execfile, os.curdir)
395 self.assertRaises(IOError, execfile, "I_dont_exist")
396
397 def test_filter(self):
398 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
399 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
400 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
401 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
402 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
403 def identity(item):
404 return 1
405 filter(identity, Squares(5))
406 self.assertRaises(TypeError, filter)
407 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000408 def __getitem__(self, index):
409 if index<4:
410 return 42
411 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000412 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
413 def badfunc():
414 pass
415 self.assertRaises(TypeError, filter, badfunc, range(5))
416
Walter Dörwaldbf517072003-01-27 15:57:14 +0000417 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000418 self.assertEqual(filter(None, (1, 2)), (1, 2))
419 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
420 self.assertRaises(TypeError, filter, 42, (1, 2))
421
Walter Dörwaldbf517072003-01-27 15:57:14 +0000422 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000423 self.assertEqual(filter(None, "12"), "12")
424 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
425 self.assertRaises(TypeError, filter, 42, "12")
426 class badstr(str):
427 def __getitem__(self, index):
428 raise ValueError
429 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000430
Walter Dörwald903f1e02003-02-04 16:28:00 +0000431 class badstr2(str):
432 def __getitem__(self, index):
433 return 42
434 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
435
436 class weirdstr(str):
437 def __getitem__(self, index):
438 return weirdstr(2*str.__getitem__(self, index))
439 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
440
Walter Dörwald5e61e242003-02-04 17:04:01 +0000441 class shiftstr(str):
442 def __getitem__(self, index):
443 return chr(ord(str.__getitem__(self, index))+1)
444 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
445
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000446 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000447 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000448 self.assertEqual(filter(None, unicode("12")), unicode("12"))
449 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
450 self.assertRaises(TypeError, filter, 42, unicode("12"))
451 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000452
Walter Dörwald903f1e02003-02-04 16:28:00 +0000453 class badunicode(unicode):
454 def __getitem__(self, index):
455 return 42
456 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
457
458 class weirdunicode(unicode):
459 def __getitem__(self, index):
460 return weirdunicode(2*unicode.__getitem__(self, index))
461 self.assertEqual(
462 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
463
Walter Dörwald5e61e242003-02-04 17:04:01 +0000464 class shiftunicode(unicode):
465 def __getitem__(self, index):
466 return unichr(ord(unicode.__getitem__(self, index))+1)
467 self.assertEqual(
468 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
469 unicode("345")
470 )
471
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000472 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000473 # test that filter() never returns tuple, str or unicode subclasses
474 # and that the result always goes through __getitem__
475 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000476 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000477 def __getitem__(self, index):
478 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000479 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000480 def __getitem__(self, index):
481 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000482 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000483 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000484 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000485 }
486 if have_unicode:
487 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000488 def __getitem__(self, index):
489 return 2*unicode.__getitem__(self, index)
490 inputs[unicode2] = {
491 unicode(): unicode(),
492 unicode("123"): unicode("112233")
493 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000494
Walter Dörwald1918f772003-02-10 13:19:13 +0000495 for (cls, inps) in inputs.iteritems():
496 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000497 # make sure the output goes through __getitem__
498 # even if func is None
499 self.assertEqual(
500 filter(funcs[0], cls(inp)),
501 filter(funcs[1], cls(inp))
502 )
503 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000504 outp = filter(func, cls(inp))
505 self.assertEqual(outp, exp)
506 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000507
Walter Dörwald919497e2003-01-19 16:23:59 +0000508 def test_float(self):
509 self.assertEqual(float(3.14), 3.14)
510 self.assertEqual(float(314), 314.0)
511 self.assertEqual(float(314L), 314.0)
512 self.assertEqual(float(" 3.14 "), 3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000513 self.assertRaises(ValueError, float, " 0x3.1 ")
514 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Walter Dörwald919497e2003-01-19 16:23:59 +0000515 if have_unicode:
516 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
517 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
Walter Dörwaldede187f2005-11-29 15:45:14 +0000518 # Implementation limitation in PyFloat_FromString()
519 self.assertRaises(ValueError, float, unicode("1"*10000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000520
Thomas Wouters477c8d52006-05-27 19:21:47 +0000521 @run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
Neal Norwitz5898fa22005-11-22 05:17:40 +0000522 def test_float_with_comma(self):
523 # set locale to something that doesn't use '.' for the decimal point
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000524 # float must not accept the locale specific decimal point but
525 # it still has to accept the normal python syntac
Thomas Wouters477c8d52006-05-27 19:21:47 +0000526 import locale
527 if not locale.localeconv()['decimal_point'] == ',':
Neal Norwitz5898fa22005-11-22 05:17:40 +0000528 return
529
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000530 self.assertEqual(float(" 3.14 "), 3.14)
531 self.assertEqual(float("+3.14 "), 3.14)
532 self.assertEqual(float("-3.14 "), -3.14)
533 self.assertEqual(float(".14 "), .14)
534 self.assertEqual(float("3. "), 3.0)
535 self.assertEqual(float("3.e3 "), 3000.0)
536 self.assertEqual(float("3.2e3 "), 3200.0)
537 self.assertEqual(float("2.5e-1 "), 0.25)
538 self.assertEqual(float("5e-1"), 0.5)
539 self.assertRaises(ValueError, float, " 3,14 ")
540 self.assertRaises(ValueError, float, " +3,14 ")
541 self.assertRaises(ValueError, float, " -3,14 ")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000542 self.assertRaises(ValueError, float, " 0x3.1 ")
543 self.assertRaises(ValueError, float, " -0x3.p-1 ")
544 self.assertEqual(float(" 25.e-1 "), 2.5)
545 self.assertEqual(fcmp(float(" .25e-1 "), .025), 0)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000546
Brett Cannonc3647ac2005-04-26 03:45:26 +0000547 def test_floatconversion(self):
548 # Make sure that calls to __float__() work properly
549 class Foo0:
550 def __float__(self):
551 return 42.
552
553 class Foo1(object):
554 def __float__(self):
555 return 42.
556
557 class Foo2(float):
558 def __float__(self):
559 return 42.
560
561 class Foo3(float):
562 def __new__(cls, value=0.):
563 return float.__new__(cls, 2*value)
564
565 def __float__(self):
566 return self
567
568 class Foo4(float):
569 def __float__(self):
570 return 42
571
572 self.assertAlmostEqual(float(Foo0()), 42.)
573 self.assertAlmostEqual(float(Foo1()), 42.)
574 self.assertAlmostEqual(float(Foo2()), 42.)
575 self.assertAlmostEqual(float(Foo3(21)), 42.)
576 self.assertRaises(TypeError, float, Foo4(42))
577
Walter Dörwald919497e2003-01-19 16:23:59 +0000578 def test_getattr(self):
579 import sys
580 self.assert_(getattr(sys, 'stdout') is sys.stdout)
581 self.assertRaises(TypeError, getattr, sys, 1)
582 self.assertRaises(TypeError, getattr, sys, 1, "foo")
583 self.assertRaises(TypeError, getattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000584 if have_unicode:
585 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000586
587 def test_hasattr(self):
588 import sys
589 self.assert_(hasattr(sys, 'stdout'))
590 self.assertRaises(TypeError, hasattr, sys, 1)
591 self.assertRaises(TypeError, hasattr)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +0000592 if have_unicode:
593 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
Walter Dörwald919497e2003-01-19 16:23:59 +0000594
595 def test_hash(self):
596 hash(None)
597 self.assertEqual(hash(1), hash(1L))
598 self.assertEqual(hash(1), hash(1.0))
599 hash('spam')
600 if have_unicode:
601 self.assertEqual(hash('spam'), hash(unicode('spam')))
602 hash((0,1,2,3))
603 def f(): pass
604 self.assertRaises(TypeError, hash, [])
605 self.assertRaises(TypeError, hash, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000606 # Bug 1536021: Allow hash to return long objects
607 class X:
608 def __hash__(self):
609 return 2**100
610 self.assertEquals(type(hash(X())), int)
611 class Y(object):
612 def __hash__(self):
613 return 2**100
614 self.assertEquals(type(hash(Y())), int)
615 class Z(long):
616 def __hash__(self):
617 return self
618 self.assertEquals(hash(Z(42)), hash(42L))
Walter Dörwald919497e2003-01-19 16:23:59 +0000619
620 def test_hex(self):
621 self.assertEqual(hex(16), '0x10')
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000622 self.assertEqual(hex(16L), '0x10')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000623 self.assertEqual(hex(-16), '-0x10')
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000624 self.assertEqual(hex(-16L), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000625 self.assertRaises(TypeError, hex, {})
626
627 def test_id(self):
628 id(None)
629 id(1)
630 id(1L)
631 id(1.0)
632 id('spam')
633 id((0,1,2,3))
634 id([0,1,2,3])
635 id({'spam': 1, 'eggs': 2, 'ham': 3})
636
Walter Dörwald919497e2003-01-19 16:23:59 +0000637 def test_int(self):
638 self.assertEqual(int(314), 314)
639 self.assertEqual(int(3.14), 3)
640 self.assertEqual(int(314L), 314)
641 # Check that conversion from float truncates towards zero
642 self.assertEqual(int(-3.14), -3)
643 self.assertEqual(int(3.9), 3)
644 self.assertEqual(int(-3.9), -3)
645 self.assertEqual(int(3.5), 3)
646 self.assertEqual(int(-3.5), -3)
647 # Different base:
648 self.assertEqual(int("10",16), 16L)
649 if have_unicode:
650 self.assertEqual(int(unicode("10"),16), 16L)
651 # Test conversion from strings and various anomalies
652 for s, v in L:
653 for sign in "", "+", "-":
654 for prefix in "", " ", "\t", " \t\t ":
655 ss = prefix + sign + s
656 vv = v
657 if sign == "-" and v is not ValueError:
658 vv = -v
659 try:
660 self.assertEqual(int(ss), vv)
661 except v:
662 pass
663
Walter Dörwald70a6b492004-02-12 17:35:32 +0000664 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000665 self.assertEqual(int(s)+1, -sys.maxint)
666 # should return long
667 int(s[1:])
668
669 # should return long
670 x = int(1e100)
671 self.assert_(isinstance(x, long))
672 x = int(-1e100)
673 self.assert_(isinstance(x, long))
674
675
676 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
677 # Worked by accident in Windows release build, but failed in debug build.
678 # Failed in all Linux builds.
679 x = -1-sys.maxint
680 self.assertEqual(x >> 1, x//2)
681
682 self.assertRaises(ValueError, int, '123\0')
683 self.assertRaises(ValueError, int, '53', 40)
684
685 x = int('1' * 600)
686 self.assert_(isinstance(x, long))
687
688 if have_unicode:
689 x = int(unichr(0x661) * 600)
690 self.assert_(isinstance(x, long))
691
692 self.assertRaises(TypeError, int, 1, 12)
693
694 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000695 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000696
Thomas Wouters477c8d52006-05-27 19:21:47 +0000697 # SF bug 1334662: int(string, base) wrong answers
698 # Various representations of 2**32 evaluated to 0
699 # rather than 2**32 in previous versions
700
701 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
702 self.assertEqual(int('102002022201221111211', 3), 4294967296L)
703 self.assertEqual(int('10000000000000000', 4), 4294967296L)
704 self.assertEqual(int('32244002423141', 5), 4294967296L)
705 self.assertEqual(int('1550104015504', 6), 4294967296L)
706 self.assertEqual(int('211301422354', 7), 4294967296L)
707 self.assertEqual(int('40000000000', 8), 4294967296L)
708 self.assertEqual(int('12068657454', 9), 4294967296L)
709 self.assertEqual(int('4294967296', 10), 4294967296L)
710 self.assertEqual(int('1904440554', 11), 4294967296L)
711 self.assertEqual(int('9ba461594', 12), 4294967296L)
712 self.assertEqual(int('535a79889', 13), 4294967296L)
713 self.assertEqual(int('2ca5b7464', 14), 4294967296L)
714 self.assertEqual(int('1a20dcd81', 15), 4294967296L)
715 self.assertEqual(int('100000000', 16), 4294967296L)
716 self.assertEqual(int('a7ffda91', 17), 4294967296L)
717 self.assertEqual(int('704he7g4', 18), 4294967296L)
718 self.assertEqual(int('4f5aff66', 19), 4294967296L)
719 self.assertEqual(int('3723ai4g', 20), 4294967296L)
720 self.assertEqual(int('281d55i4', 21), 4294967296L)
721 self.assertEqual(int('1fj8b184', 22), 4294967296L)
722 self.assertEqual(int('1606k7ic', 23), 4294967296L)
723 self.assertEqual(int('mb994ag', 24), 4294967296L)
724 self.assertEqual(int('hek2mgl', 25), 4294967296L)
725 self.assertEqual(int('dnchbnm', 26), 4294967296L)
726 self.assertEqual(int('b28jpdm', 27), 4294967296L)
727 self.assertEqual(int('8pfgih4', 28), 4294967296L)
728 self.assertEqual(int('76beigg', 29), 4294967296L)
729 self.assertEqual(int('5qmcpqg', 30), 4294967296L)
730 self.assertEqual(int('4q0jto4', 31), 4294967296L)
731 self.assertEqual(int('4000000', 32), 4294967296L)
732 self.assertEqual(int('3aokq94', 33), 4294967296L)
733 self.assertEqual(int('2qhxjli', 34), 4294967296L)
734 self.assertEqual(int('2br45qb', 35), 4294967296L)
735 self.assertEqual(int('1z141z4', 36), 4294967296L)
736
737 # SF bug 1334662: int(string, base) wrong answers
738 # Checks for proper evaluation of 2**32 + 1
739 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
740 self.assertEqual(int('102002022201221111212', 3), 4294967297L)
741 self.assertEqual(int('10000000000000001', 4), 4294967297L)
742 self.assertEqual(int('32244002423142', 5), 4294967297L)
743 self.assertEqual(int('1550104015505', 6), 4294967297L)
744 self.assertEqual(int('211301422355', 7), 4294967297L)
745 self.assertEqual(int('40000000001', 8), 4294967297L)
746 self.assertEqual(int('12068657455', 9), 4294967297L)
747 self.assertEqual(int('4294967297', 10), 4294967297L)
748 self.assertEqual(int('1904440555', 11), 4294967297L)
749 self.assertEqual(int('9ba461595', 12), 4294967297L)
750 self.assertEqual(int('535a7988a', 13), 4294967297L)
751 self.assertEqual(int('2ca5b7465', 14), 4294967297L)
752 self.assertEqual(int('1a20dcd82', 15), 4294967297L)
753 self.assertEqual(int('100000001', 16), 4294967297L)
754 self.assertEqual(int('a7ffda92', 17), 4294967297L)
755 self.assertEqual(int('704he7g5', 18), 4294967297L)
756 self.assertEqual(int('4f5aff67', 19), 4294967297L)
757 self.assertEqual(int('3723ai4h', 20), 4294967297L)
758 self.assertEqual(int('281d55i5', 21), 4294967297L)
759 self.assertEqual(int('1fj8b185', 22), 4294967297L)
760 self.assertEqual(int('1606k7id', 23), 4294967297L)
761 self.assertEqual(int('mb994ah', 24), 4294967297L)
762 self.assertEqual(int('hek2mgm', 25), 4294967297L)
763 self.assertEqual(int('dnchbnn', 26), 4294967297L)
764 self.assertEqual(int('b28jpdn', 27), 4294967297L)
765 self.assertEqual(int('8pfgih5', 28), 4294967297L)
766 self.assertEqual(int('76beigh', 29), 4294967297L)
767 self.assertEqual(int('5qmcpqh', 30), 4294967297L)
768 self.assertEqual(int('4q0jto5', 31), 4294967297L)
769 self.assertEqual(int('4000001', 32), 4294967297L)
770 self.assertEqual(int('3aokq95', 33), 4294967297L)
771 self.assertEqual(int('2qhxjlj', 34), 4294967297L)
772 self.assertEqual(int('2br45qc', 35), 4294967297L)
773 self.assertEqual(int('1z141z5', 36), 4294967297L)
774
Brett Cannonc3647ac2005-04-26 03:45:26 +0000775 def test_intconversion(self):
776 # Test __int__()
777 class Foo0:
778 def __int__(self):
779 return 42
780
781 class Foo1(object):
782 def __int__(self):
783 return 42
784
785 class Foo2(int):
786 def __int__(self):
787 return 42
788
789 class Foo3(int):
790 def __int__(self):
791 return self
792
793 class Foo4(int):
794 def __int__(self):
795 return 42L
796
797 class Foo5(int):
798 def __int__(self):
799 return 42.
800
801 self.assertEqual(int(Foo0()), 42)
802 self.assertEqual(int(Foo1()), 42)
803 self.assertEqual(int(Foo2()), 42)
804 self.assertEqual(int(Foo3()), 0)
805 self.assertEqual(int(Foo4()), 42L)
806 self.assertRaises(TypeError, int, Foo5())
807
Walter Dörwald919497e2003-01-19 16:23:59 +0000808 def test_intern(self):
809 self.assertRaises(TypeError, intern)
810 s = "never interned before"
811 self.assert_(intern(s) is s)
812 s2 = s.swapcase().swapcase()
813 self.assert_(intern(s2) is s)
814
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000815 # Subclasses of string can't be interned, because they
816 # provide too much opportunity for insane things to happen.
817 # We don't want them in the interned dict and if they aren't
818 # actually interned, we don't want to create the appearance
819 # that they are by allowing intern() to succeeed.
820 class S(str):
821 def __hash__(self):
822 return 123
823
824 self.assertRaises(TypeError, intern, S("abc"))
825
826 # It's still safe to pass these strings to routines that
827 # call intern internally, e.g. PyObject_SetAttr().
828 s = S("abc")
829 setattr(s, s, s)
830 self.assertEqual(getattr(s, s), s)
831
Walter Dörwald919497e2003-01-19 16:23:59 +0000832 def test_iter(self):
833 self.assertRaises(TypeError, iter)
834 self.assertRaises(TypeError, iter, 42, 42)
835 lists = [("1", "2"), ["1", "2"], "12"]
836 if have_unicode:
837 lists.append(unicode("12"))
838 for l in lists:
839 i = iter(l)
840 self.assertEqual(i.next(), '1')
841 self.assertEqual(i.next(), '2')
842 self.assertRaises(StopIteration, i.next)
843
844 def test_isinstance(self):
845 class C:
846 pass
847 class D(C):
848 pass
849 class E:
850 pass
851 c = C()
852 d = D()
853 e = E()
854 self.assert_(isinstance(c, C))
855 self.assert_(isinstance(d, C))
856 self.assert_(not isinstance(e, C))
857 self.assert_(not isinstance(c, D))
858 self.assert_(not isinstance('foo', E))
859 self.assertRaises(TypeError, isinstance, E, 'foo')
860 self.assertRaises(TypeError, isinstance)
861
862 def test_issubclass(self):
863 class C:
864 pass
865 class D(C):
866 pass
867 class E:
868 pass
869 c = C()
870 d = D()
871 e = E()
872 self.assert_(issubclass(D, C))
873 self.assert_(issubclass(C, C))
874 self.assert_(not issubclass(C, D))
875 self.assertRaises(TypeError, issubclass, 'foo', E)
876 self.assertRaises(TypeError, issubclass, E, 'foo')
877 self.assertRaises(TypeError, issubclass)
878
879 def test_len(self):
880 self.assertEqual(len('123'), 3)
881 self.assertEqual(len(()), 0)
882 self.assertEqual(len((1, 2, 3, 4)), 4)
883 self.assertEqual(len([1, 2, 3, 4]), 4)
884 self.assertEqual(len({}), 0)
885 self.assertEqual(len({'a':1, 'b': 2}), 2)
886 class BadSeq:
887 def __len__(self):
888 raise ValueError
889 self.assertRaises(ValueError, len, BadSeq())
890
891 def test_list(self):
892 self.assertEqual(list([]), [])
893 l0_3 = [0, 1, 2, 3]
894 l0_3_bis = list(l0_3)
895 self.assertEqual(l0_3, l0_3_bis)
896 self.assert_(l0_3 is not l0_3_bis)
897 self.assertEqual(list(()), [])
898 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
899 self.assertEqual(list(''), [])
900 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
901
902 if sys.maxint == 0x7fffffff:
903 # This test can currently only work on 32-bit machines.
904 # XXX If/when PySequence_Length() returns a ssize_t, it should be
905 # XXX re-enabled.
906 # Verify clearing of bug #556025.
907 # This assumes that the max data size (sys.maxint) == max
908 # address size this also assumes that the address size is at
909 # least 4 bytes with 8 byte addresses, the bug is not well
910 # tested
911 #
912 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
913 # earlier due to a newlib bug. See the following mailing list
914 # thread for the details:
915
916 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
917 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
918
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000919 # This code used to segfault in Py2.4a3
920 x = []
921 x.extend(-y for y in x)
922 self.assertEqual(x, [])
923
Walter Dörwald919497e2003-01-19 16:23:59 +0000924 def test_long(self):
925 self.assertEqual(long(314), 314L)
926 self.assertEqual(long(3.14), 3L)
927 self.assertEqual(long(314L), 314L)
928 # Check that conversion from float truncates towards zero
929 self.assertEqual(long(-3.14), -3L)
930 self.assertEqual(long(3.9), 3L)
931 self.assertEqual(long(-3.9), -3L)
932 self.assertEqual(long(3.5), 3L)
933 self.assertEqual(long(-3.5), -3L)
934 self.assertEqual(long("-3"), -3L)
935 if have_unicode:
936 self.assertEqual(long(unicode("-3")), -3L)
937 # Different base:
938 self.assertEqual(long("10",16), 16L)
939 if have_unicode:
940 self.assertEqual(long(unicode("10"),16), 16L)
941 # Check conversions from string (same test set as for int(), and then some)
942 LL = [
943 ('1' + '0'*20, 10L**20),
944 ('1' + '0'*100, 10L**100)
945 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000946 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000947 if have_unicode:
948 L2 += [
949 (unicode('1') + unicode('0')*20, 10L**20),
950 (unicode('1') + unicode('0')*100, 10L**100),
951 ]
952 for s, v in L2 + LL:
953 for sign in "", "+", "-":
954 for prefix in "", " ", "\t", " \t\t ":
955 ss = prefix + sign + s
956 vv = v
957 if sign == "-" and v is not ValueError:
958 vv = -v
959 try:
960 self.assertEqual(long(ss), long(vv))
961 except v:
962 pass
963
964 self.assertRaises(ValueError, long, '123\0')
965 self.assertRaises(ValueError, long, '53', 40)
966 self.assertRaises(TypeError, long, 1, 12)
967
Thomas Wouters477c8d52006-05-27 19:21:47 +0000968 self.assertEqual(long('100000000000000000000000000000000', 2),
969 4294967296)
970 self.assertEqual(long('102002022201221111211', 3), 4294967296)
971 self.assertEqual(long('10000000000000000', 4), 4294967296)
972 self.assertEqual(long('32244002423141', 5), 4294967296)
973 self.assertEqual(long('1550104015504', 6), 4294967296)
974 self.assertEqual(long('211301422354', 7), 4294967296)
975 self.assertEqual(long('40000000000', 8), 4294967296)
976 self.assertEqual(long('12068657454', 9), 4294967296)
977 self.assertEqual(long('4294967296', 10), 4294967296)
978 self.assertEqual(long('1904440554', 11), 4294967296)
979 self.assertEqual(long('9ba461594', 12), 4294967296)
980 self.assertEqual(long('535a79889', 13), 4294967296)
981 self.assertEqual(long('2ca5b7464', 14), 4294967296)
982 self.assertEqual(long('1a20dcd81', 15), 4294967296)
983 self.assertEqual(long('100000000', 16), 4294967296)
984 self.assertEqual(long('a7ffda91', 17), 4294967296)
985 self.assertEqual(long('704he7g4', 18), 4294967296)
986 self.assertEqual(long('4f5aff66', 19), 4294967296)
987 self.assertEqual(long('3723ai4g', 20), 4294967296)
988 self.assertEqual(long('281d55i4', 21), 4294967296)
989 self.assertEqual(long('1fj8b184', 22), 4294967296)
990 self.assertEqual(long('1606k7ic', 23), 4294967296)
991 self.assertEqual(long('mb994ag', 24), 4294967296)
992 self.assertEqual(long('hek2mgl', 25), 4294967296)
993 self.assertEqual(long('dnchbnm', 26), 4294967296)
994 self.assertEqual(long('b28jpdm', 27), 4294967296)
995 self.assertEqual(long('8pfgih4', 28), 4294967296)
996 self.assertEqual(long('76beigg', 29), 4294967296)
997 self.assertEqual(long('5qmcpqg', 30), 4294967296)
998 self.assertEqual(long('4q0jto4', 31), 4294967296)
999 self.assertEqual(long('4000000', 32), 4294967296)
1000 self.assertEqual(long('3aokq94', 33), 4294967296)
1001 self.assertEqual(long('2qhxjli', 34), 4294967296)
1002 self.assertEqual(long('2br45qb', 35), 4294967296)
1003 self.assertEqual(long('1z141z4', 36), 4294967296)
1004
1005 self.assertEqual(long('100000000000000000000000000000001', 2),
1006 4294967297)
1007 self.assertEqual(long('102002022201221111212', 3), 4294967297)
1008 self.assertEqual(long('10000000000000001', 4), 4294967297)
1009 self.assertEqual(long('32244002423142', 5), 4294967297)
1010 self.assertEqual(long('1550104015505', 6), 4294967297)
1011 self.assertEqual(long('211301422355', 7), 4294967297)
1012 self.assertEqual(long('40000000001', 8), 4294967297)
1013 self.assertEqual(long('12068657455', 9), 4294967297)
1014 self.assertEqual(long('4294967297', 10), 4294967297)
1015 self.assertEqual(long('1904440555', 11), 4294967297)
1016 self.assertEqual(long('9ba461595', 12), 4294967297)
1017 self.assertEqual(long('535a7988a', 13), 4294967297)
1018 self.assertEqual(long('2ca5b7465', 14), 4294967297)
1019 self.assertEqual(long('1a20dcd82', 15), 4294967297)
1020 self.assertEqual(long('100000001', 16), 4294967297)
1021 self.assertEqual(long('a7ffda92', 17), 4294967297)
1022 self.assertEqual(long('704he7g5', 18), 4294967297)
1023 self.assertEqual(long('4f5aff67', 19), 4294967297)
1024 self.assertEqual(long('3723ai4h', 20), 4294967297)
1025 self.assertEqual(long('281d55i5', 21), 4294967297)
1026 self.assertEqual(long('1fj8b185', 22), 4294967297)
1027 self.assertEqual(long('1606k7id', 23), 4294967297)
1028 self.assertEqual(long('mb994ah', 24), 4294967297)
1029 self.assertEqual(long('hek2mgm', 25), 4294967297)
1030 self.assertEqual(long('dnchbnn', 26), 4294967297)
1031 self.assertEqual(long('b28jpdn', 27), 4294967297)
1032 self.assertEqual(long('8pfgih5', 28), 4294967297)
1033 self.assertEqual(long('76beigh', 29), 4294967297)
1034 self.assertEqual(long('5qmcpqh', 30), 4294967297)
1035 self.assertEqual(long('4q0jto5', 31), 4294967297)
1036 self.assertEqual(long('4000001', 32), 4294967297)
1037 self.assertEqual(long('3aokq95', 33), 4294967297)
1038 self.assertEqual(long('2qhxjlj', 34), 4294967297)
1039 self.assertEqual(long('2br45qc', 35), 4294967297)
1040 self.assertEqual(long('1z141z5', 36), 4294967297)
1041
1042
Brett Cannonc3647ac2005-04-26 03:45:26 +00001043 def test_longconversion(self):
1044 # Test __long__()
1045 class Foo0:
1046 def __long__(self):
1047 return 42L
1048
1049 class Foo1(object):
1050 def __long__(self):
1051 return 42L
1052
1053 class Foo2(long):
1054 def __long__(self):
1055 return 42L
1056
1057 class Foo3(long):
1058 def __long__(self):
1059 return self
1060
1061 class Foo4(long):
1062 def __long__(self):
1063 return 42
1064
1065 class Foo5(long):
1066 def __long__(self):
1067 return 42.
1068
1069 self.assertEqual(long(Foo0()), 42L)
1070 self.assertEqual(long(Foo1()), 42L)
1071 self.assertEqual(long(Foo2()), 42L)
1072 self.assertEqual(long(Foo3()), 0)
1073 self.assertEqual(long(Foo4()), 42)
1074 self.assertRaises(TypeError, long, Foo5())
1075
Walter Dörwald919497e2003-01-19 16:23:59 +00001076 def test_map(self):
1077 self.assertEqual(
1078 map(None, 'hello world'),
1079 ['h','e','l','l','o',' ','w','o','r','l','d']
1080 )
1081 self.assertEqual(
1082 map(None, 'abcd', 'efg'),
1083 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
1084 )
1085 self.assertEqual(
1086 map(None, range(10)),
1087 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1088 )
1089 self.assertEqual(
1090 map(lambda x: x*x, range(1,4)),
1091 [1, 4, 9]
1092 )
1093 try:
1094 from math import sqrt
1095 except ImportError:
1096 def sqrt(x):
1097 return pow(x, 0.5)
1098 self.assertEqual(
1099 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
1100 [[4.0, 2.0], [9.0, 3.0]]
1101 )
1102 self.assertEqual(
1103 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
1104 [10, 4, 6]
1105 )
1106
1107 def plus(*v):
1108 accu = 0
1109 for i in v: accu = accu + i
1110 return accu
1111 self.assertEqual(
1112 map(plus, [1, 3, 7]),
1113 [1, 3, 7]
1114 )
1115 self.assertEqual(
1116 map(plus, [1, 3, 7], [4, 9, 2]),
1117 [1+4, 3+9, 7+2]
1118 )
1119 self.assertEqual(
1120 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
1121 [1+4+1, 3+9+1, 7+2+0]
1122 )
1123 self.assertEqual(
1124 map(None, Squares(10)),
1125 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1126 )
1127 self.assertEqual(
1128 map(int, Squares(10)),
1129 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1130 )
1131 self.assertEqual(
1132 map(None, Squares(3), Squares(2)),
1133 [(0,0), (1,1), (4,None)]
1134 )
1135 self.assertEqual(
1136 map(max, Squares(3), Squares(2)),
1137 [0, 1, 4]
1138 )
1139 self.assertRaises(TypeError, map)
1140 self.assertRaises(TypeError, map, lambda x: x, 42)
1141 self.assertEqual(map(None, [42]), [42])
1142 class BadSeq:
1143 def __getitem__(self, index):
1144 raise ValueError
1145 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001146 def badfunc(x):
1147 raise RuntimeError
1148 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001149
1150 def test_max(self):
1151 self.assertEqual(max('123123'), '3')
1152 self.assertEqual(max(1, 2, 3), 3)
1153 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1154 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1155
1156 self.assertEqual(max(1, 2L, 3.0), 3.0)
1157 self.assertEqual(max(1L, 2.0, 3), 3)
1158 self.assertEqual(max(1.0, 2, 3L), 3L)
1159
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001160 for stmt in (
1161 "max(key=int)", # no args
1162 "max(1, key=int)", # single arg not iterable
1163 "max(1, 2, keystone=int)", # wrong keyword
1164 "max(1, 2, key=int, abc=int)", # two many keywords
1165 "max(1, 2, key=1)", # keyfunc is not callable
1166 ):
Tim Peters7f061872004-12-07 21:17:46 +00001167 try:
1168 exec(stmt) in globals()
1169 except TypeError:
1170 pass
1171 else:
1172 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001173
1174 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1175 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1176 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1177
1178 data = [random.randrange(200) for i in range(100)]
1179 keys = dict((elem, random.randrange(50)) for elem in data)
1180 f = keys.__getitem__
1181 self.assertEqual(max(data, key=f),
1182 sorted(reversed(data), key=f)[-1])
1183
Walter Dörwald919497e2003-01-19 16:23:59 +00001184 def test_min(self):
1185 self.assertEqual(min('123123'), '1')
1186 self.assertEqual(min(1, 2, 3), 1)
1187 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1188 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1189
1190 self.assertEqual(min(1, 2L, 3.0), 1)
1191 self.assertEqual(min(1L, 2.0, 3), 1L)
1192 self.assertEqual(min(1.0, 2, 3L), 1.0)
1193
1194 self.assertRaises(TypeError, min)
1195 self.assertRaises(TypeError, min, 42)
1196 self.assertRaises(ValueError, min, ())
1197 class BadSeq:
1198 def __getitem__(self, index):
1199 raise ValueError
1200 self.assertRaises(ValueError, min, BadSeq())
1201 class BadNumber:
1202 def __cmp__(self, other):
1203 raise ValueError
1204 self.assertRaises(ValueError, min, (42, BadNumber()))
1205
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001206 for stmt in (
1207 "min(key=int)", # no args
1208 "min(1, key=int)", # single arg not iterable
1209 "min(1, 2, keystone=int)", # wrong keyword
1210 "min(1, 2, key=int, abc=int)", # two many keywords
1211 "min(1, 2, key=1)", # keyfunc is not callable
1212 ):
Tim Peters7f061872004-12-07 21:17:46 +00001213 try:
1214 exec(stmt) in globals()
1215 except TypeError:
1216 pass
1217 else:
1218 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001219
1220 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1221 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1222 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1223
1224 data = [random.randrange(200) for i in range(100)]
1225 keys = dict((elem, random.randrange(50)) for elem in data)
1226 f = keys.__getitem__
1227 self.assertEqual(min(data, key=f),
1228 sorted(data, key=f)[0])
1229
Walter Dörwald919497e2003-01-19 16:23:59 +00001230 def test_oct(self):
1231 self.assertEqual(oct(100), '0144')
Guido van Rossume2b70bc2006-08-18 22:13:04 +00001232 self.assertEqual(oct(100L), '0144')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001233 self.assertEqual(oct(-100), '-0144')
Guido van Rossume2b70bc2006-08-18 22:13:04 +00001234 self.assertEqual(oct(-100L), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001235 self.assertRaises(TypeError, oct, ())
1236
1237 def write_testfile(self):
Walter Dörwald919497e2003-01-19 16:23:59 +00001238 fp = open(TESTFN, 'w')
1239 try:
1240 fp.write('1+1\n')
1241 fp.write('1+1\n')
1242 fp.write('The quick brown fox jumps over the lazy dog')
1243 fp.write('.\n')
1244 fp.write('Dear John\n')
1245 fp.write('XXX'*100)
1246 fp.write('YYY'*100)
1247 finally:
1248 fp.close()
1249
1250 def test_open(self):
1251 self.write_testfile()
1252 fp = open(TESTFN, 'r')
1253 try:
1254 self.assertEqual(fp.readline(4), '1+1\n')
1255 self.assertEqual(fp.readline(4), '1+1\n')
1256 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1257 self.assertEqual(fp.readline(4), 'Dear')
1258 self.assertEqual(fp.readline(100), ' John\n')
1259 self.assertEqual(fp.read(300), 'XXX'*100)
1260 self.assertEqual(fp.read(1000), 'YYY'*100)
1261 finally:
1262 fp.close()
1263 unlink(TESTFN)
1264
1265 def test_ord(self):
1266 self.assertEqual(ord(' '), 32)
1267 self.assertEqual(ord('A'), 65)
1268 self.assertEqual(ord('a'), 97)
1269 if have_unicode:
1270 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1271 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001272 if have_unicode:
1273 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001274
1275 def test_pow(self):
1276 self.assertEqual(pow(0,0), 1)
1277 self.assertEqual(pow(0,1), 0)
1278 self.assertEqual(pow(1,0), 1)
1279 self.assertEqual(pow(1,1), 1)
1280
1281 self.assertEqual(pow(2,0), 1)
1282 self.assertEqual(pow(2,10), 1024)
1283 self.assertEqual(pow(2,20), 1024*1024)
1284 self.assertEqual(pow(2,30), 1024*1024*1024)
1285
1286 self.assertEqual(pow(-2,0), 1)
1287 self.assertEqual(pow(-2,1), -2)
1288 self.assertEqual(pow(-2,2), 4)
1289 self.assertEqual(pow(-2,3), -8)
1290
1291 self.assertEqual(pow(0L,0), 1)
1292 self.assertEqual(pow(0L,1), 0)
1293 self.assertEqual(pow(1L,0), 1)
1294 self.assertEqual(pow(1L,1), 1)
1295
1296 self.assertEqual(pow(2L,0), 1)
1297 self.assertEqual(pow(2L,10), 1024)
1298 self.assertEqual(pow(2L,20), 1024*1024)
1299 self.assertEqual(pow(2L,30), 1024*1024*1024)
1300
1301 self.assertEqual(pow(-2L,0), 1)
1302 self.assertEqual(pow(-2L,1), -2)
1303 self.assertEqual(pow(-2L,2), 4)
1304 self.assertEqual(pow(-2L,3), -8)
1305
1306 self.assertAlmostEqual(pow(0.,0), 1.)
1307 self.assertAlmostEqual(pow(0.,1), 0.)
1308 self.assertAlmostEqual(pow(1.,0), 1.)
1309 self.assertAlmostEqual(pow(1.,1), 1.)
1310
1311 self.assertAlmostEqual(pow(2.,0), 1.)
1312 self.assertAlmostEqual(pow(2.,10), 1024.)
1313 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1314 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1315
1316 self.assertAlmostEqual(pow(-2.,0), 1.)
1317 self.assertAlmostEqual(pow(-2.,1), -2.)
1318 self.assertAlmostEqual(pow(-2.,2), 4.)
1319 self.assertAlmostEqual(pow(-2.,3), -8.)
1320
1321 for x in 2, 2L, 2.0:
1322 for y in 10, 10L, 10.0:
1323 for z in 1000, 1000L, 1000.0:
1324 if isinstance(x, float) or \
1325 isinstance(y, float) or \
1326 isinstance(z, float):
1327 self.assertRaises(TypeError, pow, x, y, z)
1328 else:
1329 self.assertAlmostEqual(pow(x, y, z), 24.0)
1330
1331 self.assertRaises(TypeError, pow, -1, -2, 3)
1332 self.assertRaises(ValueError, pow, 1, 2, 0)
1333 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1334 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1335 self.assertRaises(ValueError, pow, -342.43, 0.234)
1336
1337 self.assertRaises(TypeError, pow)
1338
1339 def test_range(self):
1340 self.assertEqual(range(3), [0, 1, 2])
1341 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1342 self.assertEqual(range(0), [])
1343 self.assertEqual(range(-3), [])
1344 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1345 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1346
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001347 # Now test range() with longs
1348 self.assertEqual(range(-2**100), [])
1349 self.assertEqual(range(0, -2**100), [])
1350 self.assertEqual(range(0, 2**100, -1), [])
1351 self.assertEqual(range(0, 2**100, -1), [])
1352
1353 a = long(10 * sys.maxint)
1354 b = long(100 * sys.maxint)
1355 c = long(50 * sys.maxint)
1356
1357 self.assertEqual(range(a, a+2), [a, a+1])
1358 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1359 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1360
1361 seq = range(a, b, c)
1362 self.assert_(a in seq)
1363 self.assert_(b not in seq)
1364 self.assertEqual(len(seq), 2)
1365
1366 seq = range(b, a, -c)
1367 self.assert_(b in seq)
1368 self.assert_(a not in seq)
1369 self.assertEqual(len(seq), 2)
1370
1371 seq = range(-a, -b, -c)
1372 self.assert_(-a in seq)
1373 self.assert_(-b not in seq)
1374 self.assertEqual(len(seq), 2)
1375
Walter Dörwald919497e2003-01-19 16:23:59 +00001376 self.assertRaises(TypeError, range)
1377 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1378 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001379 self.assertRaises(ValueError, range, a, a + 1, long(0))
1380
1381 class badzero(int):
1382 def __cmp__(self, other):
1383 raise RuntimeError
1384 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001385
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001386 # Reject floats when it would require PyLongs to represent.
1387 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001388 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001389
Walter Dörwald357981e2003-04-15 18:59:28 +00001390 self.assertRaises(TypeError, range, 0, "spam")
1391 self.assertRaises(TypeError, range, 0, 42, "spam")
1392
1393 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1394 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1395
Walter Dörwald919497e2003-01-19 16:23:59 +00001396 def test_reload(self):
1397 import marshal
1398 reload(marshal)
1399 import string
1400 reload(string)
1401 ## import sys
1402 ## self.assertRaises(ImportError, reload, sys)
1403
1404 def test_repr(self):
1405 self.assertEqual(repr(''), '\'\'')
1406 self.assertEqual(repr(0), '0')
Guido van Rossume2b70bc2006-08-18 22:13:04 +00001407 self.assertEqual(repr(0L), '0')
Walter Dörwald919497e2003-01-19 16:23:59 +00001408 self.assertEqual(repr(()), '()')
1409 self.assertEqual(repr([]), '[]')
1410 self.assertEqual(repr({}), '{}')
1411 a = []
1412 a.append(a)
1413 self.assertEqual(repr(a), '[[...]]')
1414 a = {}
1415 a[0] = a
1416 self.assertEqual(repr(a), '{0: {...}}')
1417
1418 def test_round(self):
1419 self.assertEqual(round(0.0), 0.0)
1420 self.assertEqual(round(1.0), 1.0)
1421 self.assertEqual(round(10.0), 10.0)
1422 self.assertEqual(round(1000000000.0), 1000000000.0)
1423 self.assertEqual(round(1e20), 1e20)
1424
1425 self.assertEqual(round(-1.0), -1.0)
1426 self.assertEqual(round(-10.0), -10.0)
1427 self.assertEqual(round(-1000000000.0), -1000000000.0)
1428 self.assertEqual(round(-1e20), -1e20)
1429
1430 self.assertEqual(round(0.1), 0.0)
1431 self.assertEqual(round(1.1), 1.0)
1432 self.assertEqual(round(10.1), 10.0)
1433 self.assertEqual(round(1000000000.1), 1000000000.0)
1434
1435 self.assertEqual(round(-1.1), -1.0)
1436 self.assertEqual(round(-10.1), -10.0)
1437 self.assertEqual(round(-1000000000.1), -1000000000.0)
1438
1439 self.assertEqual(round(0.9), 1.0)
1440 self.assertEqual(round(9.9), 10.0)
1441 self.assertEqual(round(999999999.9), 1000000000.0)
1442
1443 self.assertEqual(round(-0.9), -1.0)
1444 self.assertEqual(round(-9.9), -10.0)
1445 self.assertEqual(round(-999999999.9), -1000000000.0)
1446
1447 self.assertEqual(round(-8.0, -1), -10.0)
1448
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001449 # test new kwargs
1450 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1451
Walter Dörwald919497e2003-01-19 16:23:59 +00001452 self.assertRaises(TypeError, round)
1453
1454 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001455 setattr(sys, 'spam', 1)
1456 self.assertEqual(sys.spam, 1)
1457 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1458 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001459
1460 def test_str(self):
1461 self.assertEqual(str(''), '')
1462 self.assertEqual(str(0), '0')
1463 self.assertEqual(str(0L), '0')
1464 self.assertEqual(str(()), '()')
1465 self.assertEqual(str([]), '[]')
1466 self.assertEqual(str({}), '{}')
1467 a = []
1468 a.append(a)
1469 self.assertEqual(str(a), '[[...]]')
1470 a = {}
1471 a[0] = a
1472 self.assertEqual(str(a), '{0: {...}}')
1473
Alex Martellia70b1912003-04-22 08:12:33 +00001474 def test_sum(self):
1475 self.assertEqual(sum([]), 0)
1476 self.assertEqual(sum(range(2,8)), 27)
1477 self.assertEqual(sum(iter(range(2,8))), 27)
1478 self.assertEqual(sum(Squares(10)), 285)
1479 self.assertEqual(sum(iter(Squares(10))), 285)
1480 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1481
1482 self.assertRaises(TypeError, sum)
1483 self.assertRaises(TypeError, sum, 42)
1484 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1485 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1486 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1487 self.assertRaises(TypeError, sum, [{2:3}])
1488 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1489
1490 class BadSeq:
1491 def __getitem__(self, index):
1492 raise ValueError
1493 self.assertRaises(ValueError, sum, BadSeq())
1494
Walter Dörwald919497e2003-01-19 16:23:59 +00001495 def test_tuple(self):
1496 self.assertEqual(tuple(()), ())
1497 t0_3 = (0, 1, 2, 3)
1498 t0_3_bis = tuple(t0_3)
1499 self.assert_(t0_3 is t0_3_bis)
1500 self.assertEqual(tuple([]), ())
1501 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1502 self.assertEqual(tuple(''), ())
1503 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1504
1505 def test_type(self):
1506 self.assertEqual(type(''), type('123'))
1507 self.assertNotEqual(type(''), type(()))
1508
1509 def test_unichr(self):
1510 if have_unicode:
1511 self.assertEqual(unichr(32), unicode(' '))
1512 self.assertEqual(unichr(65), unicode('A'))
1513 self.assertEqual(unichr(97), unicode('a'))
1514 self.assertEqual(
1515 unichr(sys.maxunicode),
1516 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1517 )
1518 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1519 self.assertRaises(TypeError, unichr)
1520
Guido van Rossumfee7b932005-01-16 00:21:28 +00001521 # We don't want self in vars(), so these are static methods
1522
1523 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001524 def get_vars_f0():
1525 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001526
Guido van Rossumfee7b932005-01-16 00:21:28 +00001527 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001528 def get_vars_f2():
1529 BuiltinTest.get_vars_f0()
1530 a = 1
1531 b = 2
1532 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001533
1534 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001535 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001536 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001537 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001538 self.assertEqual(self.get_vars_f0(), {})
1539 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1540 self.assertRaises(TypeError, vars, 42, 42)
1541 self.assertRaises(TypeError, vars, 42)
1542
1543 def test_zip(self):
1544 a = (1, 2, 3)
1545 b = (4, 5, 6)
1546 t = [(1, 4), (2, 5), (3, 6)]
1547 self.assertEqual(zip(a, b), t)
1548 b = [4, 5, 6]
1549 self.assertEqual(zip(a, b), t)
1550 b = (4, 5, 6, 7)
1551 self.assertEqual(zip(a, b), t)
1552 class I:
1553 def __getitem__(self, i):
1554 if i < 0 or i > 2: raise IndexError
1555 return i + 4
1556 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001557 self.assertEqual(zip(), [])
1558 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001559 self.assertRaises(TypeError, zip, None)
1560 class G:
1561 pass
1562 self.assertRaises(TypeError, zip, a, G())
1563
1564 # Make sure zip doesn't try to allocate a billion elements for the
1565 # result list when one of its arguments doesn't say how long it is.
1566 # A MemoryError is the most likely failure mode.
1567 class SequenceWithoutALength:
1568 def __getitem__(self, i):
1569 if i == 5:
1570 raise IndexError
1571 else:
1572 return i
1573 self.assertEqual(
1574 zip(SequenceWithoutALength(), xrange(2**30)),
1575 list(enumerate(range(5)))
1576 )
1577
1578 class BadSeq:
1579 def __getitem__(self, i):
1580 if i == 5:
1581 raise ValueError
1582 else:
1583 return i
1584 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1585
Raymond Hettinger64958a12003-12-17 20:43:33 +00001586class TestSorted(unittest.TestCase):
1587
1588 def test_basic(self):
1589 data = range(100)
1590 copy = data[:]
1591 random.shuffle(copy)
1592 self.assertEqual(data, sorted(copy))
1593 self.assertNotEqual(data, copy)
1594
1595 data.reverse()
1596 random.shuffle(copy)
1597 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1598 self.assertNotEqual(data, copy)
1599 random.shuffle(copy)
1600 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1601 self.assertNotEqual(data, copy)
1602 random.shuffle(copy)
1603 self.assertEqual(data, sorted(copy, reverse=1))
1604 self.assertNotEqual(data, copy)
1605
1606 def test_inputtypes(self):
1607 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001608 types = [list, tuple]
1609 if have_unicode:
1610 types.insert(0, unicode)
1611 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001612 self.assertEqual(sorted(s), sorted(T(s)))
1613
1614 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001615 types = [set, frozenset, list, tuple, dict.fromkeys]
1616 if have_unicode:
1617 types.insert(0, unicode)
1618 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001619 self.assertEqual(sorted(s), sorted(T(s)))
1620
1621 def test_baddecorator(self):
1622 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1623 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1624
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001625def test_main(verbose=None):
1626 test_classes = (BuiltinTest, TestSorted)
1627
1628 run_unittest(*test_classes)
1629
1630 # verify reference counting
1631 if verbose and hasattr(sys, "gettotalrefcount"):
1632 import gc
1633 counts = [None] * 5
1634 for i in xrange(len(counts)):
1635 run_unittest(*test_classes)
1636 gc.collect()
1637 counts[i] = sys.gettotalrefcount()
1638 print counts
1639
Walter Dörwald919497e2003-01-19 16:23:59 +00001640
1641if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001642 test_main(verbose=True)