blob: e6e44407a39d4ef9d83ad633c674768fb8db5687 [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
199 def test_coerce(self):
200 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
201 self.assertEqual(coerce(1, 1L), (1L, 1L))
202 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
203 self.assertRaises(TypeError, coerce)
204 class BadNumber:
205 def __coerce__(self, other):
206 raise ValueError
207 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000208 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000209
210 def test_compile(self):
211 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000212 bom = '\xef\xbb\xbf'
213 compile(bom + 'print 1\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000214 self.assertRaises(TypeError, compile)
215 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
216 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000217 self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000218 if have_unicode:
219 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Neal Norwitzfcf44352005-11-27 20:37:43 +0000220 self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
221 self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
Walter Dörwald919497e2003-01-19 16:23:59 +0000222
Walter Dörwald919497e2003-01-19 16:23:59 +0000223 def test_delattr(self):
224 import sys
225 sys.spam = 1
226 delattr(sys, 'spam')
227 self.assertRaises(TypeError, delattr)
228
229 def test_dir(self):
230 x = 1
231 self.assert_('x' in dir())
232 import sys
233 self.assert_('modules' in dir(sys))
234 self.assertRaises(TypeError, dir, 42, 42)
235
236 def test_divmod(self):
237 self.assertEqual(divmod(12, 7), (1, 5))
238 self.assertEqual(divmod(-12, 7), (-2, 2))
239 self.assertEqual(divmod(12, -7), (-2, -2))
240 self.assertEqual(divmod(-12, -7), (1, -5))
241
242 self.assertEqual(divmod(12L, 7L), (1L, 5L))
243 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
244 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
245 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
246
247 self.assertEqual(divmod(12, 7L), (1, 5L))
248 self.assertEqual(divmod(-12, 7L), (-2, 2L))
249 self.assertEqual(divmod(12L, -7), (-2L, -2))
250 self.assertEqual(divmod(-12L, -7), (1L, -5))
251
Raymond Hettinger5ea7e312004-09-30 07:47:20 +0000252 self.assertEqual(divmod(-sys.maxint-1, -1),
253 (sys.maxint+1, 0))
254
Walter Dörwald919497e2003-01-19 16:23:59 +0000255 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
256 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
257 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
258 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
259
260 self.assertRaises(TypeError, divmod)
261
262 def test_eval(self):
263 self.assertEqual(eval('1+1'), 2)
264 self.assertEqual(eval(' 1+1\n'), 2)
265 globals = {'a': 1, 'b': 2}
266 locals = {'b': 200, 'c': 300}
267 self.assertEqual(eval('a', globals) , 1)
268 self.assertEqual(eval('a', globals, locals), 1)
269 self.assertEqual(eval('b', globals, locals), 200)
270 self.assertEqual(eval('c', globals, locals), 300)
271 if have_unicode:
272 self.assertEqual(eval(unicode('1+1')), 2)
273 self.assertEqual(eval(unicode(' 1+1\n')), 2)
274 globals = {'a': 1, 'b': 2}
275 locals = {'b': 200, 'c': 300}
276 if have_unicode:
277 self.assertEqual(eval(unicode('a'), globals), 1)
278 self.assertEqual(eval(unicode('a'), globals, locals), 1)
279 self.assertEqual(eval(unicode('b'), globals, locals), 200)
280 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000281 bom = '\xef\xbb\xbf'
282 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000283 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
284 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000285 self.assertRaises(TypeError, eval)
286 self.assertRaises(TypeError, eval, ())
287
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000288 def test_general_eval(self):
289 # Tests that general mappings can be used for the locals argument
290
291 class M:
292 "Test mapping interface versus possible calls from eval()."
293 def __getitem__(self, key):
294 if key == 'a':
295 return 12
296 raise KeyError
297 def keys(self):
298 return list('xyz')
299
300 m = M()
301 g = globals()
302 self.assertEqual(eval('a', g, m), 12)
303 self.assertRaises(NameError, eval, 'b', g, m)
304 self.assertEqual(eval('dir()', g, m), list('xyz'))
305 self.assertEqual(eval('globals()', g, m), g)
306 self.assertEqual(eval('locals()', g, m), m)
Raymond Hettinger513ffe82004-07-06 13:44:41 +0000307 self.assertRaises(TypeError, eval, 'a', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000308 class A:
309 "Non-mapping"
310 pass
311 m = A()
312 self.assertRaises(TypeError, eval, 'a', g, m)
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000313
314 # Verify that dict subclasses work as well
315 class D(dict):
316 def __getitem__(self, key):
317 if key == 'a':
318 return 12
319 return dict.__getitem__(self, key)
320 def keys(self):
321 return list('xyz')
322
323 d = D()
324 self.assertEqual(eval('a', g, d), 12)
325 self.assertRaises(NameError, eval, 'b', g, d)
326 self.assertEqual(eval('dir()', g, d), list('xyz'))
327 self.assertEqual(eval('globals()', g, d), g)
328 self.assertEqual(eval('locals()', g, d), d)
329
330 # Verify locals stores (used by list comps)
331 eval('[locals() for i in (2,3)]', g, d)
332 eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
333
334 class SpreadSheet:
335 "Sample application showing nested, calculated lookups."
336 _cells = {}
337 def __setitem__(self, key, formula):
338 self._cells[key] = formula
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000339 def __getitem__(self, key):
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000340 return eval(self._cells[key], globals(), self)
341
342 ss = SpreadSheet()
343 ss['a1'] = '5'
344 ss['a2'] = 'a1*6'
345 ss['a3'] = 'a2*7'
346 self.assertEqual(ss['a3'], 210)
347
Raymond Hettinger2a7dede2004-08-07 04:55:30 +0000348 # Verify that dir() catches a non-list returned by eval
349 # SF bug #1004669
350 class C:
351 def __getitem__(self, item):
352 raise KeyError(item)
353 def keys(self):
354 return 'a'
355 self.assertRaises(TypeError, eval, 'dir()', globals(), C())
356
Walter Dörwald919497e2003-01-19 16:23:59 +0000357 # Done outside of the method test_z to get the correct scope
358 z = 0
359 f = open(TESTFN, 'w')
360 f.write('z = z+1\n')
361 f.write('z = z*2\n')
362 f.close()
363 execfile(TESTFN)
364
365 def test_execfile(self):
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +0000366 global numruns
367 if numruns:
368 return
369 numruns += 1
Tim Peters7f061872004-12-07 21:17:46 +0000370
Walter Dörwald919497e2003-01-19 16:23:59 +0000371 globals = {'a': 1, 'b': 2}
372 locals = {'b': 200, 'c': 300}
373
374 self.assertEqual(self.__class__.z, 2)
375 globals['z'] = 0
376 execfile(TESTFN, globals)
377 self.assertEqual(globals['z'], 2)
378 locals['z'] = 0
379 execfile(TESTFN, globals, locals)
380 self.assertEqual(locals['z'], 2)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000381
382 class M:
383 "Test mapping interface versus possible calls from execfile()."
384 def __init__(self):
385 self.z = 10
386 def __getitem__(self, key):
387 if key == 'z':
388 return self.z
389 raise KeyError
390 def __setitem__(self, key, value):
391 if key == 'z':
392 self.z = value
393 return
394 raise KeyError
395
396 locals = M()
397 locals['z'] = 0
398 execfile(TESTFN, globals, locals)
399 self.assertEqual(locals['z'], 2)
400
Walter Dörwald919497e2003-01-19 16:23:59 +0000401 unlink(TESTFN)
402 self.assertRaises(TypeError, execfile)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000403 self.assertRaises(TypeError, execfile, TESTFN, {}, ())
Walter Dörwald919497e2003-01-19 16:23:59 +0000404 import os
405 self.assertRaises(IOError, execfile, os.curdir)
406 self.assertRaises(IOError, execfile, "I_dont_exist")
407
408 def test_filter(self):
409 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
410 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
411 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
412 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
413 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
414 def identity(item):
415 return 1
416 filter(identity, Squares(5))
417 self.assertRaises(TypeError, filter)
418 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000419 def __getitem__(self, index):
420 if index<4:
421 return 42
422 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000423 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
424 def badfunc():
425 pass
426 self.assertRaises(TypeError, filter, badfunc, range(5))
427
Walter Dörwaldbf517072003-01-27 15:57:14 +0000428 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000429 self.assertEqual(filter(None, (1, 2)), (1, 2))
430 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
431 self.assertRaises(TypeError, filter, 42, (1, 2))
432
Walter Dörwaldbf517072003-01-27 15:57:14 +0000433 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000434 self.assertEqual(filter(None, "12"), "12")
435 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
436 self.assertRaises(TypeError, filter, 42, "12")
437 class badstr(str):
438 def __getitem__(self, index):
439 raise ValueError
440 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000441
Walter Dörwald903f1e02003-02-04 16:28:00 +0000442 class badstr2(str):
443 def __getitem__(self, index):
444 return 42
445 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
446
447 class weirdstr(str):
448 def __getitem__(self, index):
449 return weirdstr(2*str.__getitem__(self, index))
450 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
451
Walter Dörwald5e61e242003-02-04 17:04:01 +0000452 class shiftstr(str):
453 def __getitem__(self, index):
454 return chr(ord(str.__getitem__(self, index))+1)
455 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
456
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000457 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000458 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000459 self.assertEqual(filter(None, unicode("12")), unicode("12"))
460 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
461 self.assertRaises(TypeError, filter, 42, unicode("12"))
462 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000463
Walter Dörwald903f1e02003-02-04 16:28:00 +0000464 class badunicode(unicode):
465 def __getitem__(self, index):
466 return 42
467 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
468
469 class weirdunicode(unicode):
470 def __getitem__(self, index):
471 return weirdunicode(2*unicode.__getitem__(self, index))
472 self.assertEqual(
473 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
474
Walter Dörwald5e61e242003-02-04 17:04:01 +0000475 class shiftunicode(unicode):
476 def __getitem__(self, index):
477 return unichr(ord(unicode.__getitem__(self, index))+1)
478 self.assertEqual(
479 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
480 unicode("345")
481 )
482
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000483 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000484 # test that filter() never returns tuple, str or unicode subclasses
485 # and that the result always goes through __getitem__
486 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000487 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000488 def __getitem__(self, index):
489 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000490 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000491 def __getitem__(self, index):
492 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000493 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000494 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000495 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000496 }
497 if have_unicode:
498 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000499 def __getitem__(self, index):
500 return 2*unicode.__getitem__(self, index)
501 inputs[unicode2] = {
502 unicode(): unicode(),
503 unicode("123"): unicode("112233")
504 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000505
Walter Dörwald1918f772003-02-10 13:19:13 +0000506 for (cls, inps) in inputs.iteritems():
507 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000508 # make sure the output goes through __getitem__
509 # even if func is None
510 self.assertEqual(
511 filter(funcs[0], cls(inp)),
512 filter(funcs[1], cls(inp))
513 )
514 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000515 outp = filter(func, cls(inp))
516 self.assertEqual(outp, exp)
517 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000518
Walter Dörwald919497e2003-01-19 16:23:59 +0000519 def test_float(self):
520 self.assertEqual(float(3.14), 3.14)
521 self.assertEqual(float(314), 314.0)
522 self.assertEqual(float(314L), 314.0)
523 self.assertEqual(float(" 3.14 "), 3.14)
Neal Norwitze7214a12005-12-18 05:03:17 +0000524 self.assertRaises(ValueError, float, " 0x3.1 ")
525 self.assertRaises(ValueError, float, " -0x3.p-1 ")
Walter Dörwald919497e2003-01-19 16:23:59 +0000526 if have_unicode:
527 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
528 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
Walter Dörwaldede187f2005-11-29 15:45:14 +0000529 # Implementation limitation in PyFloat_FromString()
530 self.assertRaises(ValueError, float, unicode("1"*10000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000531
Thomas Wouters477c8d52006-05-27 19:21:47 +0000532 @run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
Neal Norwitz5898fa22005-11-22 05:17:40 +0000533 def test_float_with_comma(self):
534 # set locale to something that doesn't use '.' for the decimal point
Thomas Wouters477c8d52006-05-27 19:21:47 +0000535 import locale
536 if not locale.localeconv()['decimal_point'] == ',':
Neal Norwitz5898fa22005-11-22 05:17:40 +0000537 return
538
Thomas Wouters477c8d52006-05-27 19:21:47 +0000539 self.assertEqual(float(" 3,14 "), 3.14)
540 self.assertEqual(float(" +3,14 "), 3.14)
541 self.assertEqual(float(" -3,14 "), -3.14)
542 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, {})
606
607 def test_hex(self):
608 self.assertEqual(hex(16), '0x10')
609 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000610 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000611 self.assertEqual(hex(-16L), '-0x10L')
612 self.assertRaises(TypeError, hex, {})
613
614 def test_id(self):
615 id(None)
616 id(1)
617 id(1L)
618 id(1.0)
619 id('spam')
620 id((0,1,2,3))
621 id([0,1,2,3])
622 id({'spam': 1, 'eggs': 2, 'ham': 3})
623
Walter Dörwald919497e2003-01-19 16:23:59 +0000624 def test_int(self):
625 self.assertEqual(int(314), 314)
626 self.assertEqual(int(3.14), 3)
627 self.assertEqual(int(314L), 314)
628 # Check that conversion from float truncates towards zero
629 self.assertEqual(int(-3.14), -3)
630 self.assertEqual(int(3.9), 3)
631 self.assertEqual(int(-3.9), -3)
632 self.assertEqual(int(3.5), 3)
633 self.assertEqual(int(-3.5), -3)
634 # Different base:
635 self.assertEqual(int("10",16), 16L)
636 if have_unicode:
637 self.assertEqual(int(unicode("10"),16), 16L)
638 # Test conversion from strings and various anomalies
639 for s, v in L:
640 for sign in "", "+", "-":
641 for prefix in "", " ", "\t", " \t\t ":
642 ss = prefix + sign + s
643 vv = v
644 if sign == "-" and v is not ValueError:
645 vv = -v
646 try:
647 self.assertEqual(int(ss), vv)
648 except v:
649 pass
650
Walter Dörwald70a6b492004-02-12 17:35:32 +0000651 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000652 self.assertEqual(int(s)+1, -sys.maxint)
653 # should return long
654 int(s[1:])
655
656 # should return long
657 x = int(1e100)
658 self.assert_(isinstance(x, long))
659 x = int(-1e100)
660 self.assert_(isinstance(x, long))
661
662
663 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
664 # Worked by accident in Windows release build, but failed in debug build.
665 # Failed in all Linux builds.
666 x = -1-sys.maxint
667 self.assertEqual(x >> 1, x//2)
668
669 self.assertRaises(ValueError, int, '123\0')
670 self.assertRaises(ValueError, int, '53', 40)
671
672 x = int('1' * 600)
673 self.assert_(isinstance(x, long))
674
675 if have_unicode:
676 x = int(unichr(0x661) * 600)
677 self.assert_(isinstance(x, long))
678
679 self.assertRaises(TypeError, int, 1, 12)
680
681 self.assertEqual(int('0123', 0), 83)
Neal Norwitz5898fa22005-11-22 05:17:40 +0000682 self.assertEqual(int('0x123', 16), 291)
Walter Dörwald919497e2003-01-19 16:23:59 +0000683
Thomas Wouters477c8d52006-05-27 19:21:47 +0000684 # SF bug 1334662: int(string, base) wrong answers
685 # Various representations of 2**32 evaluated to 0
686 # rather than 2**32 in previous versions
687
688 self.assertEqual(int('100000000000000000000000000000000', 2), 4294967296L)
689 self.assertEqual(int('102002022201221111211', 3), 4294967296L)
690 self.assertEqual(int('10000000000000000', 4), 4294967296L)
691 self.assertEqual(int('32244002423141', 5), 4294967296L)
692 self.assertEqual(int('1550104015504', 6), 4294967296L)
693 self.assertEqual(int('211301422354', 7), 4294967296L)
694 self.assertEqual(int('40000000000', 8), 4294967296L)
695 self.assertEqual(int('12068657454', 9), 4294967296L)
696 self.assertEqual(int('4294967296', 10), 4294967296L)
697 self.assertEqual(int('1904440554', 11), 4294967296L)
698 self.assertEqual(int('9ba461594', 12), 4294967296L)
699 self.assertEqual(int('535a79889', 13), 4294967296L)
700 self.assertEqual(int('2ca5b7464', 14), 4294967296L)
701 self.assertEqual(int('1a20dcd81', 15), 4294967296L)
702 self.assertEqual(int('100000000', 16), 4294967296L)
703 self.assertEqual(int('a7ffda91', 17), 4294967296L)
704 self.assertEqual(int('704he7g4', 18), 4294967296L)
705 self.assertEqual(int('4f5aff66', 19), 4294967296L)
706 self.assertEqual(int('3723ai4g', 20), 4294967296L)
707 self.assertEqual(int('281d55i4', 21), 4294967296L)
708 self.assertEqual(int('1fj8b184', 22), 4294967296L)
709 self.assertEqual(int('1606k7ic', 23), 4294967296L)
710 self.assertEqual(int('mb994ag', 24), 4294967296L)
711 self.assertEqual(int('hek2mgl', 25), 4294967296L)
712 self.assertEqual(int('dnchbnm', 26), 4294967296L)
713 self.assertEqual(int('b28jpdm', 27), 4294967296L)
714 self.assertEqual(int('8pfgih4', 28), 4294967296L)
715 self.assertEqual(int('76beigg', 29), 4294967296L)
716 self.assertEqual(int('5qmcpqg', 30), 4294967296L)
717 self.assertEqual(int('4q0jto4', 31), 4294967296L)
718 self.assertEqual(int('4000000', 32), 4294967296L)
719 self.assertEqual(int('3aokq94', 33), 4294967296L)
720 self.assertEqual(int('2qhxjli', 34), 4294967296L)
721 self.assertEqual(int('2br45qb', 35), 4294967296L)
722 self.assertEqual(int('1z141z4', 36), 4294967296L)
723
724 # SF bug 1334662: int(string, base) wrong answers
725 # Checks for proper evaluation of 2**32 + 1
726 self.assertEqual(int('100000000000000000000000000000001', 2), 4294967297L)
727 self.assertEqual(int('102002022201221111212', 3), 4294967297L)
728 self.assertEqual(int('10000000000000001', 4), 4294967297L)
729 self.assertEqual(int('32244002423142', 5), 4294967297L)
730 self.assertEqual(int('1550104015505', 6), 4294967297L)
731 self.assertEqual(int('211301422355', 7), 4294967297L)
732 self.assertEqual(int('40000000001', 8), 4294967297L)
733 self.assertEqual(int('12068657455', 9), 4294967297L)
734 self.assertEqual(int('4294967297', 10), 4294967297L)
735 self.assertEqual(int('1904440555', 11), 4294967297L)
736 self.assertEqual(int('9ba461595', 12), 4294967297L)
737 self.assertEqual(int('535a7988a', 13), 4294967297L)
738 self.assertEqual(int('2ca5b7465', 14), 4294967297L)
739 self.assertEqual(int('1a20dcd82', 15), 4294967297L)
740 self.assertEqual(int('100000001', 16), 4294967297L)
741 self.assertEqual(int('a7ffda92', 17), 4294967297L)
742 self.assertEqual(int('704he7g5', 18), 4294967297L)
743 self.assertEqual(int('4f5aff67', 19), 4294967297L)
744 self.assertEqual(int('3723ai4h', 20), 4294967297L)
745 self.assertEqual(int('281d55i5', 21), 4294967297L)
746 self.assertEqual(int('1fj8b185', 22), 4294967297L)
747 self.assertEqual(int('1606k7id', 23), 4294967297L)
748 self.assertEqual(int('mb994ah', 24), 4294967297L)
749 self.assertEqual(int('hek2mgm', 25), 4294967297L)
750 self.assertEqual(int('dnchbnn', 26), 4294967297L)
751 self.assertEqual(int('b28jpdn', 27), 4294967297L)
752 self.assertEqual(int('8pfgih5', 28), 4294967297L)
753 self.assertEqual(int('76beigh', 29), 4294967297L)
754 self.assertEqual(int('5qmcpqh', 30), 4294967297L)
755 self.assertEqual(int('4q0jto5', 31), 4294967297L)
756 self.assertEqual(int('4000001', 32), 4294967297L)
757 self.assertEqual(int('3aokq95', 33), 4294967297L)
758 self.assertEqual(int('2qhxjlj', 34), 4294967297L)
759 self.assertEqual(int('2br45qc', 35), 4294967297L)
760 self.assertEqual(int('1z141z5', 36), 4294967297L)
761
Brett Cannonc3647ac2005-04-26 03:45:26 +0000762 def test_intconversion(self):
763 # Test __int__()
764 class Foo0:
765 def __int__(self):
766 return 42
767
768 class Foo1(object):
769 def __int__(self):
770 return 42
771
772 class Foo2(int):
773 def __int__(self):
774 return 42
775
776 class Foo3(int):
777 def __int__(self):
778 return self
779
780 class Foo4(int):
781 def __int__(self):
782 return 42L
783
784 class Foo5(int):
785 def __int__(self):
786 return 42.
787
788 self.assertEqual(int(Foo0()), 42)
789 self.assertEqual(int(Foo1()), 42)
790 self.assertEqual(int(Foo2()), 42)
791 self.assertEqual(int(Foo3()), 0)
792 self.assertEqual(int(Foo4()), 42L)
793 self.assertRaises(TypeError, int, Foo5())
794
Walter Dörwald919497e2003-01-19 16:23:59 +0000795 def test_intern(self):
796 self.assertRaises(TypeError, intern)
797 s = "never interned before"
798 self.assert_(intern(s) is s)
799 s2 = s.swapcase().swapcase()
800 self.assert_(intern(s2) is s)
801
Jeremy Hylton4c989dd2004-08-07 19:20:05 +0000802 # Subclasses of string can't be interned, because they
803 # provide too much opportunity for insane things to happen.
804 # We don't want them in the interned dict and if they aren't
805 # actually interned, we don't want to create the appearance
806 # that they are by allowing intern() to succeeed.
807 class S(str):
808 def __hash__(self):
809 return 123
810
811 self.assertRaises(TypeError, intern, S("abc"))
812
813 # It's still safe to pass these strings to routines that
814 # call intern internally, e.g. PyObject_SetAttr().
815 s = S("abc")
816 setattr(s, s, s)
817 self.assertEqual(getattr(s, s), s)
818
Walter Dörwald919497e2003-01-19 16:23:59 +0000819 def test_iter(self):
820 self.assertRaises(TypeError, iter)
821 self.assertRaises(TypeError, iter, 42, 42)
822 lists = [("1", "2"), ["1", "2"], "12"]
823 if have_unicode:
824 lists.append(unicode("12"))
825 for l in lists:
826 i = iter(l)
827 self.assertEqual(i.next(), '1')
828 self.assertEqual(i.next(), '2')
829 self.assertRaises(StopIteration, i.next)
830
831 def test_isinstance(self):
832 class C:
833 pass
834 class D(C):
835 pass
836 class E:
837 pass
838 c = C()
839 d = D()
840 e = E()
841 self.assert_(isinstance(c, C))
842 self.assert_(isinstance(d, C))
843 self.assert_(not isinstance(e, C))
844 self.assert_(not isinstance(c, D))
845 self.assert_(not isinstance('foo', E))
846 self.assertRaises(TypeError, isinstance, E, 'foo')
847 self.assertRaises(TypeError, isinstance)
848
849 def test_issubclass(self):
850 class C:
851 pass
852 class D(C):
853 pass
854 class E:
855 pass
856 c = C()
857 d = D()
858 e = E()
859 self.assert_(issubclass(D, C))
860 self.assert_(issubclass(C, C))
861 self.assert_(not issubclass(C, D))
862 self.assertRaises(TypeError, issubclass, 'foo', E)
863 self.assertRaises(TypeError, issubclass, E, 'foo')
864 self.assertRaises(TypeError, issubclass)
865
866 def test_len(self):
867 self.assertEqual(len('123'), 3)
868 self.assertEqual(len(()), 0)
869 self.assertEqual(len((1, 2, 3, 4)), 4)
870 self.assertEqual(len([1, 2, 3, 4]), 4)
871 self.assertEqual(len({}), 0)
872 self.assertEqual(len({'a':1, 'b': 2}), 2)
873 class BadSeq:
874 def __len__(self):
875 raise ValueError
876 self.assertRaises(ValueError, len, BadSeq())
877
878 def test_list(self):
879 self.assertEqual(list([]), [])
880 l0_3 = [0, 1, 2, 3]
881 l0_3_bis = list(l0_3)
882 self.assertEqual(l0_3, l0_3_bis)
883 self.assert_(l0_3 is not l0_3_bis)
884 self.assertEqual(list(()), [])
885 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
886 self.assertEqual(list(''), [])
887 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
888
889 if sys.maxint == 0x7fffffff:
890 # This test can currently only work on 32-bit machines.
891 # XXX If/when PySequence_Length() returns a ssize_t, it should be
892 # XXX re-enabled.
893 # Verify clearing of bug #556025.
894 # This assumes that the max data size (sys.maxint) == max
895 # address size this also assumes that the address size is at
896 # least 4 bytes with 8 byte addresses, the bug is not well
897 # tested
898 #
899 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
900 # earlier due to a newlib bug. See the following mailing list
901 # thread for the details:
902
903 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
904 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
905
Raymond Hettingeraa241e02004-09-26 19:24:20 +0000906 # This code used to segfault in Py2.4a3
907 x = []
908 x.extend(-y for y in x)
909 self.assertEqual(x, [])
910
Walter Dörwald919497e2003-01-19 16:23:59 +0000911 def test_long(self):
912 self.assertEqual(long(314), 314L)
913 self.assertEqual(long(3.14), 3L)
914 self.assertEqual(long(314L), 314L)
915 # Check that conversion from float truncates towards zero
916 self.assertEqual(long(-3.14), -3L)
917 self.assertEqual(long(3.9), 3L)
918 self.assertEqual(long(-3.9), -3L)
919 self.assertEqual(long(3.5), 3L)
920 self.assertEqual(long(-3.5), -3L)
921 self.assertEqual(long("-3"), -3L)
922 if have_unicode:
923 self.assertEqual(long(unicode("-3")), -3L)
924 # Different base:
925 self.assertEqual(long("10",16), 16L)
926 if have_unicode:
927 self.assertEqual(long(unicode("10"),16), 16L)
928 # Check conversions from string (same test set as for int(), and then some)
929 LL = [
930 ('1' + '0'*20, 10L**20),
931 ('1' + '0'*100, 10L**100)
932 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000933 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000934 if have_unicode:
935 L2 += [
936 (unicode('1') + unicode('0')*20, 10L**20),
937 (unicode('1') + unicode('0')*100, 10L**100),
938 ]
939 for s, v in L2 + LL:
940 for sign in "", "+", "-":
941 for prefix in "", " ", "\t", " \t\t ":
942 ss = prefix + sign + s
943 vv = v
944 if sign == "-" and v is not ValueError:
945 vv = -v
946 try:
947 self.assertEqual(long(ss), long(vv))
948 except v:
949 pass
950
951 self.assertRaises(ValueError, long, '123\0')
952 self.assertRaises(ValueError, long, '53', 40)
953 self.assertRaises(TypeError, long, 1, 12)
954
Thomas Wouters477c8d52006-05-27 19:21:47 +0000955 self.assertEqual(long('100000000000000000000000000000000', 2),
956 4294967296)
957 self.assertEqual(long('102002022201221111211', 3), 4294967296)
958 self.assertEqual(long('10000000000000000', 4), 4294967296)
959 self.assertEqual(long('32244002423141', 5), 4294967296)
960 self.assertEqual(long('1550104015504', 6), 4294967296)
961 self.assertEqual(long('211301422354', 7), 4294967296)
962 self.assertEqual(long('40000000000', 8), 4294967296)
963 self.assertEqual(long('12068657454', 9), 4294967296)
964 self.assertEqual(long('4294967296', 10), 4294967296)
965 self.assertEqual(long('1904440554', 11), 4294967296)
966 self.assertEqual(long('9ba461594', 12), 4294967296)
967 self.assertEqual(long('535a79889', 13), 4294967296)
968 self.assertEqual(long('2ca5b7464', 14), 4294967296)
969 self.assertEqual(long('1a20dcd81', 15), 4294967296)
970 self.assertEqual(long('100000000', 16), 4294967296)
971 self.assertEqual(long('a7ffda91', 17), 4294967296)
972 self.assertEqual(long('704he7g4', 18), 4294967296)
973 self.assertEqual(long('4f5aff66', 19), 4294967296)
974 self.assertEqual(long('3723ai4g', 20), 4294967296)
975 self.assertEqual(long('281d55i4', 21), 4294967296)
976 self.assertEqual(long('1fj8b184', 22), 4294967296)
977 self.assertEqual(long('1606k7ic', 23), 4294967296)
978 self.assertEqual(long('mb994ag', 24), 4294967296)
979 self.assertEqual(long('hek2mgl', 25), 4294967296)
980 self.assertEqual(long('dnchbnm', 26), 4294967296)
981 self.assertEqual(long('b28jpdm', 27), 4294967296)
982 self.assertEqual(long('8pfgih4', 28), 4294967296)
983 self.assertEqual(long('76beigg', 29), 4294967296)
984 self.assertEqual(long('5qmcpqg', 30), 4294967296)
985 self.assertEqual(long('4q0jto4', 31), 4294967296)
986 self.assertEqual(long('4000000', 32), 4294967296)
987 self.assertEqual(long('3aokq94', 33), 4294967296)
988 self.assertEqual(long('2qhxjli', 34), 4294967296)
989 self.assertEqual(long('2br45qb', 35), 4294967296)
990 self.assertEqual(long('1z141z4', 36), 4294967296)
991
992 self.assertEqual(long('100000000000000000000000000000001', 2),
993 4294967297)
994 self.assertEqual(long('102002022201221111212', 3), 4294967297)
995 self.assertEqual(long('10000000000000001', 4), 4294967297)
996 self.assertEqual(long('32244002423142', 5), 4294967297)
997 self.assertEqual(long('1550104015505', 6), 4294967297)
998 self.assertEqual(long('211301422355', 7), 4294967297)
999 self.assertEqual(long('40000000001', 8), 4294967297)
1000 self.assertEqual(long('12068657455', 9), 4294967297)
1001 self.assertEqual(long('4294967297', 10), 4294967297)
1002 self.assertEqual(long('1904440555', 11), 4294967297)
1003 self.assertEqual(long('9ba461595', 12), 4294967297)
1004 self.assertEqual(long('535a7988a', 13), 4294967297)
1005 self.assertEqual(long('2ca5b7465', 14), 4294967297)
1006 self.assertEqual(long('1a20dcd82', 15), 4294967297)
1007 self.assertEqual(long('100000001', 16), 4294967297)
1008 self.assertEqual(long('a7ffda92', 17), 4294967297)
1009 self.assertEqual(long('704he7g5', 18), 4294967297)
1010 self.assertEqual(long('4f5aff67', 19), 4294967297)
1011 self.assertEqual(long('3723ai4h', 20), 4294967297)
1012 self.assertEqual(long('281d55i5', 21), 4294967297)
1013 self.assertEqual(long('1fj8b185', 22), 4294967297)
1014 self.assertEqual(long('1606k7id', 23), 4294967297)
1015 self.assertEqual(long('mb994ah', 24), 4294967297)
1016 self.assertEqual(long('hek2mgm', 25), 4294967297)
1017 self.assertEqual(long('dnchbnn', 26), 4294967297)
1018 self.assertEqual(long('b28jpdn', 27), 4294967297)
1019 self.assertEqual(long('8pfgih5', 28), 4294967297)
1020 self.assertEqual(long('76beigh', 29), 4294967297)
1021 self.assertEqual(long('5qmcpqh', 30), 4294967297)
1022 self.assertEqual(long('4q0jto5', 31), 4294967297)
1023 self.assertEqual(long('4000001', 32), 4294967297)
1024 self.assertEqual(long('3aokq95', 33), 4294967297)
1025 self.assertEqual(long('2qhxjlj', 34), 4294967297)
1026 self.assertEqual(long('2br45qc', 35), 4294967297)
1027 self.assertEqual(long('1z141z5', 36), 4294967297)
1028
1029
Brett Cannonc3647ac2005-04-26 03:45:26 +00001030 def test_longconversion(self):
1031 # Test __long__()
1032 class Foo0:
1033 def __long__(self):
1034 return 42L
1035
1036 class Foo1(object):
1037 def __long__(self):
1038 return 42L
1039
1040 class Foo2(long):
1041 def __long__(self):
1042 return 42L
1043
1044 class Foo3(long):
1045 def __long__(self):
1046 return self
1047
1048 class Foo4(long):
1049 def __long__(self):
1050 return 42
1051
1052 class Foo5(long):
1053 def __long__(self):
1054 return 42.
1055
1056 self.assertEqual(long(Foo0()), 42L)
1057 self.assertEqual(long(Foo1()), 42L)
1058 self.assertEqual(long(Foo2()), 42L)
1059 self.assertEqual(long(Foo3()), 0)
1060 self.assertEqual(long(Foo4()), 42)
1061 self.assertRaises(TypeError, long, Foo5())
1062
Walter Dörwald919497e2003-01-19 16:23:59 +00001063 def test_map(self):
1064 self.assertEqual(
1065 map(None, 'hello world'),
1066 ['h','e','l','l','o',' ','w','o','r','l','d']
1067 )
1068 self.assertEqual(
1069 map(None, 'abcd', 'efg'),
1070 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
1071 )
1072 self.assertEqual(
1073 map(None, range(10)),
1074 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1075 )
1076 self.assertEqual(
1077 map(lambda x: x*x, range(1,4)),
1078 [1, 4, 9]
1079 )
1080 try:
1081 from math import sqrt
1082 except ImportError:
1083 def sqrt(x):
1084 return pow(x, 0.5)
1085 self.assertEqual(
1086 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
1087 [[4.0, 2.0], [9.0, 3.0]]
1088 )
1089 self.assertEqual(
1090 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
1091 [10, 4, 6]
1092 )
1093
1094 def plus(*v):
1095 accu = 0
1096 for i in v: accu = accu + i
1097 return accu
1098 self.assertEqual(
1099 map(plus, [1, 3, 7]),
1100 [1, 3, 7]
1101 )
1102 self.assertEqual(
1103 map(plus, [1, 3, 7], [4, 9, 2]),
1104 [1+4, 3+9, 7+2]
1105 )
1106 self.assertEqual(
1107 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
1108 [1+4+1, 3+9+1, 7+2+0]
1109 )
1110 self.assertEqual(
1111 map(None, Squares(10)),
1112 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1113 )
1114 self.assertEqual(
1115 map(int, Squares(10)),
1116 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1117 )
1118 self.assertEqual(
1119 map(None, Squares(3), Squares(2)),
1120 [(0,0), (1,1), (4,None)]
1121 )
1122 self.assertEqual(
1123 map(max, Squares(3), Squares(2)),
1124 [0, 1, 4]
1125 )
1126 self.assertRaises(TypeError, map)
1127 self.assertRaises(TypeError, map, lambda x: x, 42)
1128 self.assertEqual(map(None, [42]), [42])
1129 class BadSeq:
1130 def __getitem__(self, index):
1131 raise ValueError
1132 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
Neal Norwitzfcf44352005-11-27 20:37:43 +00001133 def badfunc(x):
1134 raise RuntimeError
1135 self.assertRaises(RuntimeError, map, badfunc, range(5))
Walter Dörwald919497e2003-01-19 16:23:59 +00001136
1137 def test_max(self):
1138 self.assertEqual(max('123123'), '3')
1139 self.assertEqual(max(1, 2, 3), 3)
1140 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
1141 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
1142
1143 self.assertEqual(max(1, 2L, 3.0), 3.0)
1144 self.assertEqual(max(1L, 2.0, 3), 3)
1145 self.assertEqual(max(1.0, 2, 3L), 3L)
1146
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001147 for stmt in (
1148 "max(key=int)", # no args
1149 "max(1, key=int)", # single arg not iterable
1150 "max(1, 2, keystone=int)", # wrong keyword
1151 "max(1, 2, key=int, abc=int)", # two many keywords
1152 "max(1, 2, key=1)", # keyfunc is not callable
1153 ):
Tim Peters7f061872004-12-07 21:17:46 +00001154 try:
1155 exec(stmt) in globals()
1156 except TypeError:
1157 pass
1158 else:
1159 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001160
1161 self.assertEqual(max((1,), key=neg), 1) # one elem iterable
1162 self.assertEqual(max((1,2), key=neg), 1) # two elem iterable
1163 self.assertEqual(max(1, 2, key=neg), 1) # two elems
1164
1165 data = [random.randrange(200) for i in range(100)]
1166 keys = dict((elem, random.randrange(50)) for elem in data)
1167 f = keys.__getitem__
1168 self.assertEqual(max(data, key=f),
1169 sorted(reversed(data), key=f)[-1])
1170
Walter Dörwald919497e2003-01-19 16:23:59 +00001171 def test_min(self):
1172 self.assertEqual(min('123123'), '1')
1173 self.assertEqual(min(1, 2, 3), 1)
1174 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
1175 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
1176
1177 self.assertEqual(min(1, 2L, 3.0), 1)
1178 self.assertEqual(min(1L, 2.0, 3), 1L)
1179 self.assertEqual(min(1.0, 2, 3L), 1.0)
1180
1181 self.assertRaises(TypeError, min)
1182 self.assertRaises(TypeError, min, 42)
1183 self.assertRaises(ValueError, min, ())
1184 class BadSeq:
1185 def __getitem__(self, index):
1186 raise ValueError
1187 self.assertRaises(ValueError, min, BadSeq())
1188 class BadNumber:
1189 def __cmp__(self, other):
1190 raise ValueError
1191 self.assertRaises(ValueError, min, (42, BadNumber()))
1192
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001193 for stmt in (
1194 "min(key=int)", # no args
1195 "min(1, key=int)", # single arg not iterable
1196 "min(1, 2, keystone=int)", # wrong keyword
1197 "min(1, 2, key=int, abc=int)", # two many keywords
1198 "min(1, 2, key=1)", # keyfunc is not callable
1199 ):
Tim Peters7f061872004-12-07 21:17:46 +00001200 try:
1201 exec(stmt) in globals()
1202 except TypeError:
1203 pass
1204 else:
1205 self.fail(stmt)
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001206
1207 self.assertEqual(min((1,), key=neg), 1) # one elem iterable
1208 self.assertEqual(min((1,2), key=neg), 2) # two elem iterable
1209 self.assertEqual(min(1, 2, key=neg), 2) # two elems
1210
1211 data = [random.randrange(200) for i in range(100)]
1212 keys = dict((elem, random.randrange(50)) for elem in data)
1213 f = keys.__getitem__
1214 self.assertEqual(min(data, key=f),
1215 sorted(data, key=f)[0])
1216
Walter Dörwald919497e2003-01-19 16:23:59 +00001217 def test_oct(self):
1218 self.assertEqual(oct(100), '0144')
1219 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001220 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +00001221 self.assertEqual(oct(-100L), '-0144L')
1222 self.assertRaises(TypeError, oct, ())
1223
1224 def write_testfile(self):
Walter Dörwald919497e2003-01-19 16:23:59 +00001225 fp = open(TESTFN, 'w')
1226 try:
1227 fp.write('1+1\n')
1228 fp.write('1+1\n')
1229 fp.write('The quick brown fox jumps over the lazy dog')
1230 fp.write('.\n')
1231 fp.write('Dear John\n')
1232 fp.write('XXX'*100)
1233 fp.write('YYY'*100)
1234 finally:
1235 fp.close()
1236
1237 def test_open(self):
1238 self.write_testfile()
1239 fp = open(TESTFN, 'r')
1240 try:
1241 self.assertEqual(fp.readline(4), '1+1\n')
1242 self.assertEqual(fp.readline(4), '1+1\n')
1243 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
1244 self.assertEqual(fp.readline(4), 'Dear')
1245 self.assertEqual(fp.readline(100), ' John\n')
1246 self.assertEqual(fp.read(300), 'XXX'*100)
1247 self.assertEqual(fp.read(1000), 'YYY'*100)
1248 finally:
1249 fp.close()
1250 unlink(TESTFN)
1251
1252 def test_ord(self):
1253 self.assertEqual(ord(' '), 32)
1254 self.assertEqual(ord('A'), 65)
1255 self.assertEqual(ord('a'), 97)
1256 if have_unicode:
1257 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1258 self.assertRaises(TypeError, ord, 42)
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001259 if have_unicode:
1260 self.assertRaises(TypeError, ord, unicode("12"))
Walter Dörwald919497e2003-01-19 16:23:59 +00001261
1262 def test_pow(self):
1263 self.assertEqual(pow(0,0), 1)
1264 self.assertEqual(pow(0,1), 0)
1265 self.assertEqual(pow(1,0), 1)
1266 self.assertEqual(pow(1,1), 1)
1267
1268 self.assertEqual(pow(2,0), 1)
1269 self.assertEqual(pow(2,10), 1024)
1270 self.assertEqual(pow(2,20), 1024*1024)
1271 self.assertEqual(pow(2,30), 1024*1024*1024)
1272
1273 self.assertEqual(pow(-2,0), 1)
1274 self.assertEqual(pow(-2,1), -2)
1275 self.assertEqual(pow(-2,2), 4)
1276 self.assertEqual(pow(-2,3), -8)
1277
1278 self.assertEqual(pow(0L,0), 1)
1279 self.assertEqual(pow(0L,1), 0)
1280 self.assertEqual(pow(1L,0), 1)
1281 self.assertEqual(pow(1L,1), 1)
1282
1283 self.assertEqual(pow(2L,0), 1)
1284 self.assertEqual(pow(2L,10), 1024)
1285 self.assertEqual(pow(2L,20), 1024*1024)
1286 self.assertEqual(pow(2L,30), 1024*1024*1024)
1287
1288 self.assertEqual(pow(-2L,0), 1)
1289 self.assertEqual(pow(-2L,1), -2)
1290 self.assertEqual(pow(-2L,2), 4)
1291 self.assertEqual(pow(-2L,3), -8)
1292
1293 self.assertAlmostEqual(pow(0.,0), 1.)
1294 self.assertAlmostEqual(pow(0.,1), 0.)
1295 self.assertAlmostEqual(pow(1.,0), 1.)
1296 self.assertAlmostEqual(pow(1.,1), 1.)
1297
1298 self.assertAlmostEqual(pow(2.,0), 1.)
1299 self.assertAlmostEqual(pow(2.,10), 1024.)
1300 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1301 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1302
1303 self.assertAlmostEqual(pow(-2.,0), 1.)
1304 self.assertAlmostEqual(pow(-2.,1), -2.)
1305 self.assertAlmostEqual(pow(-2.,2), 4.)
1306 self.assertAlmostEqual(pow(-2.,3), -8.)
1307
1308 for x in 2, 2L, 2.0:
1309 for y in 10, 10L, 10.0:
1310 for z in 1000, 1000L, 1000.0:
1311 if isinstance(x, float) or \
1312 isinstance(y, float) or \
1313 isinstance(z, float):
1314 self.assertRaises(TypeError, pow, x, y, z)
1315 else:
1316 self.assertAlmostEqual(pow(x, y, z), 24.0)
1317
1318 self.assertRaises(TypeError, pow, -1, -2, 3)
1319 self.assertRaises(ValueError, pow, 1, 2, 0)
1320 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1321 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1322 self.assertRaises(ValueError, pow, -342.43, 0.234)
1323
1324 self.assertRaises(TypeError, pow)
1325
1326 def test_range(self):
1327 self.assertEqual(range(3), [0, 1, 2])
1328 self.assertEqual(range(1, 5), [1, 2, 3, 4])
1329 self.assertEqual(range(0), [])
1330 self.assertEqual(range(-3), [])
1331 self.assertEqual(range(1, 10, 3), [1, 4, 7])
1332 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1333
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001334 # Now test range() with longs
1335 self.assertEqual(range(-2**100), [])
1336 self.assertEqual(range(0, -2**100), [])
1337 self.assertEqual(range(0, 2**100, -1), [])
1338 self.assertEqual(range(0, 2**100, -1), [])
1339
1340 a = long(10 * sys.maxint)
1341 b = long(100 * sys.maxint)
1342 c = long(50 * sys.maxint)
1343
1344 self.assertEqual(range(a, a+2), [a, a+1])
1345 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1346 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1347
1348 seq = range(a, b, c)
1349 self.assert_(a in seq)
1350 self.assert_(b not in seq)
1351 self.assertEqual(len(seq), 2)
1352
1353 seq = range(b, a, -c)
1354 self.assert_(b in seq)
1355 self.assert_(a not in seq)
1356 self.assertEqual(len(seq), 2)
1357
1358 seq = range(-a, -b, -c)
1359 self.assert_(-a in seq)
1360 self.assert_(-b not in seq)
1361 self.assertEqual(len(seq), 2)
1362
Walter Dörwald919497e2003-01-19 16:23:59 +00001363 self.assertRaises(TypeError, range)
1364 self.assertRaises(TypeError, range, 1, 2, 3, 4)
1365 self.assertRaises(ValueError, range, 1, 2, 0)
Neal Norwitzfcf44352005-11-27 20:37:43 +00001366 self.assertRaises(ValueError, range, a, a + 1, long(0))
1367
1368 class badzero(int):
1369 def __cmp__(self, other):
1370 raise RuntimeError
1371 self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
Walter Dörwald919497e2003-01-19 16:23:59 +00001372
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001373 # Reject floats when it would require PyLongs to represent.
1374 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +00001375 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00001376
Walter Dörwald357981e2003-04-15 18:59:28 +00001377 self.assertRaises(TypeError, range, 0, "spam")
1378 self.assertRaises(TypeError, range, 0, 42, "spam")
1379
1380 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1381 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1382
Walter Dörwald919497e2003-01-19 16:23:59 +00001383 def test_reduce(self):
1384 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
1385 self.assertEqual(
1386 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
1387 ['a','c','d','w']
1388 )
1389 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1390 self.assertEqual(
1391 reduce(lambda x, y: x*y, range(2,21), 1L),
1392 2432902008176640000L
1393 )
1394 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
1395 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
1396 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
1397 self.assertRaises(TypeError, reduce)
1398 self.assertRaises(TypeError, reduce, 42, 42)
1399 self.assertRaises(TypeError, reduce, 42, 42, 42)
1400 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1401 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1402 self.assertRaises(TypeError, reduce, 42, (42, 42))
1403
1404 class BadSeq:
1405 def __getitem__(self, index):
1406 raise ValueError
1407 self.assertRaises(ValueError, reduce, 42, BadSeq())
1408
1409 def test_reload(self):
1410 import marshal
1411 reload(marshal)
1412 import string
1413 reload(string)
1414 ## import sys
1415 ## self.assertRaises(ImportError, reload, sys)
1416
1417 def test_repr(self):
1418 self.assertEqual(repr(''), '\'\'')
1419 self.assertEqual(repr(0), '0')
1420 self.assertEqual(repr(0L), '0L')
1421 self.assertEqual(repr(()), '()')
1422 self.assertEqual(repr([]), '[]')
1423 self.assertEqual(repr({}), '{}')
1424 a = []
1425 a.append(a)
1426 self.assertEqual(repr(a), '[[...]]')
1427 a = {}
1428 a[0] = a
1429 self.assertEqual(repr(a), '{0: {...}}')
1430
1431 def test_round(self):
1432 self.assertEqual(round(0.0), 0.0)
1433 self.assertEqual(round(1.0), 1.0)
1434 self.assertEqual(round(10.0), 10.0)
1435 self.assertEqual(round(1000000000.0), 1000000000.0)
1436 self.assertEqual(round(1e20), 1e20)
1437
1438 self.assertEqual(round(-1.0), -1.0)
1439 self.assertEqual(round(-10.0), -10.0)
1440 self.assertEqual(round(-1000000000.0), -1000000000.0)
1441 self.assertEqual(round(-1e20), -1e20)
1442
1443 self.assertEqual(round(0.1), 0.0)
1444 self.assertEqual(round(1.1), 1.0)
1445 self.assertEqual(round(10.1), 10.0)
1446 self.assertEqual(round(1000000000.1), 1000000000.0)
1447
1448 self.assertEqual(round(-1.1), -1.0)
1449 self.assertEqual(round(-10.1), -10.0)
1450 self.assertEqual(round(-1000000000.1), -1000000000.0)
1451
1452 self.assertEqual(round(0.9), 1.0)
1453 self.assertEqual(round(9.9), 10.0)
1454 self.assertEqual(round(999999999.9), 1000000000.0)
1455
1456 self.assertEqual(round(-0.9), -1.0)
1457 self.assertEqual(round(-9.9), -10.0)
1458 self.assertEqual(round(-999999999.9), -1000000000.0)
1459
1460 self.assertEqual(round(-8.0, -1), -10.0)
1461
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001462 # test new kwargs
1463 self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1464
Walter Dörwald919497e2003-01-19 16:23:59 +00001465 self.assertRaises(TypeError, round)
1466
1467 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001468 setattr(sys, 'spam', 1)
1469 self.assertEqual(sys.spam, 1)
1470 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1471 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001472
1473 def test_str(self):
1474 self.assertEqual(str(''), '')
1475 self.assertEqual(str(0), '0')
1476 self.assertEqual(str(0L), '0')
1477 self.assertEqual(str(()), '()')
1478 self.assertEqual(str([]), '[]')
1479 self.assertEqual(str({}), '{}')
1480 a = []
1481 a.append(a)
1482 self.assertEqual(str(a), '[[...]]')
1483 a = {}
1484 a[0] = a
1485 self.assertEqual(str(a), '{0: {...}}')
1486
Alex Martellia70b1912003-04-22 08:12:33 +00001487 def test_sum(self):
1488 self.assertEqual(sum([]), 0)
1489 self.assertEqual(sum(range(2,8)), 27)
1490 self.assertEqual(sum(iter(range(2,8))), 27)
1491 self.assertEqual(sum(Squares(10)), 285)
1492 self.assertEqual(sum(iter(Squares(10))), 285)
1493 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1494
1495 self.assertRaises(TypeError, sum)
1496 self.assertRaises(TypeError, sum, 42)
1497 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1498 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1499 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1500 self.assertRaises(TypeError, sum, [{2:3}])
1501 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1502
1503 class BadSeq:
1504 def __getitem__(self, index):
1505 raise ValueError
1506 self.assertRaises(ValueError, sum, BadSeq())
1507
Walter Dörwald919497e2003-01-19 16:23:59 +00001508 def test_tuple(self):
1509 self.assertEqual(tuple(()), ())
1510 t0_3 = (0, 1, 2, 3)
1511 t0_3_bis = tuple(t0_3)
1512 self.assert_(t0_3 is t0_3_bis)
1513 self.assertEqual(tuple([]), ())
1514 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1515 self.assertEqual(tuple(''), ())
1516 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1517
1518 def test_type(self):
1519 self.assertEqual(type(''), type('123'))
1520 self.assertNotEqual(type(''), type(()))
1521
1522 def test_unichr(self):
1523 if have_unicode:
1524 self.assertEqual(unichr(32), unicode(' '))
1525 self.assertEqual(unichr(65), unicode('A'))
1526 self.assertEqual(unichr(97), unicode('a'))
1527 self.assertEqual(
1528 unichr(sys.maxunicode),
1529 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1530 )
1531 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1532 self.assertRaises(TypeError, unichr)
1533
Guido van Rossumfee7b932005-01-16 00:21:28 +00001534 # We don't want self in vars(), so these are static methods
1535
1536 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001537 def get_vars_f0():
1538 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001539
Guido van Rossumfee7b932005-01-16 00:21:28 +00001540 @staticmethod
Walter Dörwald919497e2003-01-19 16:23:59 +00001541 def get_vars_f2():
1542 BuiltinTest.get_vars_f0()
1543 a = 1
1544 b = 2
1545 return vars()
Walter Dörwald919497e2003-01-19 16:23:59 +00001546
1547 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001548 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001549 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001550 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001551 self.assertEqual(self.get_vars_f0(), {})
1552 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1553 self.assertRaises(TypeError, vars, 42, 42)
1554 self.assertRaises(TypeError, vars, 42)
1555
1556 def test_zip(self):
1557 a = (1, 2, 3)
1558 b = (4, 5, 6)
1559 t = [(1, 4), (2, 5), (3, 6)]
1560 self.assertEqual(zip(a, b), t)
1561 b = [4, 5, 6]
1562 self.assertEqual(zip(a, b), t)
1563 b = (4, 5, 6, 7)
1564 self.assertEqual(zip(a, b), t)
1565 class I:
1566 def __getitem__(self, i):
1567 if i < 0 or i > 2: raise IndexError
1568 return i + 4
1569 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001570 self.assertEqual(zip(), [])
1571 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001572 self.assertRaises(TypeError, zip, None)
1573 class G:
1574 pass
1575 self.assertRaises(TypeError, zip, a, G())
1576
1577 # Make sure zip doesn't try to allocate a billion elements for the
1578 # result list when one of its arguments doesn't say how long it is.
1579 # A MemoryError is the most likely failure mode.
1580 class SequenceWithoutALength:
1581 def __getitem__(self, i):
1582 if i == 5:
1583 raise IndexError
1584 else:
1585 return i
1586 self.assertEqual(
1587 zip(SequenceWithoutALength(), xrange(2**30)),
1588 list(enumerate(range(5)))
1589 )
1590
1591 class BadSeq:
1592 def __getitem__(self, i):
1593 if i == 5:
1594 raise ValueError
1595 else:
1596 return i
1597 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1598
Raymond Hettinger64958a12003-12-17 20:43:33 +00001599class TestSorted(unittest.TestCase):
1600
1601 def test_basic(self):
1602 data = range(100)
1603 copy = data[:]
1604 random.shuffle(copy)
1605 self.assertEqual(data, sorted(copy))
1606 self.assertNotEqual(data, copy)
1607
1608 data.reverse()
1609 random.shuffle(copy)
1610 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1611 self.assertNotEqual(data, copy)
1612 random.shuffle(copy)
1613 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1614 self.assertNotEqual(data, copy)
1615 random.shuffle(copy)
1616 self.assertEqual(data, sorted(copy, reverse=1))
1617 self.assertNotEqual(data, copy)
1618
1619 def test_inputtypes(self):
1620 s = 'abracadabra'
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001621 types = [list, tuple]
1622 if have_unicode:
1623 types.insert(0, unicode)
1624 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001625 self.assertEqual(sorted(s), sorted(T(s)))
1626
1627 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
Walter Dörwald4e41a4b2005-08-03 17:09:04 +00001628 types = [set, frozenset, list, tuple, dict.fromkeys]
1629 if have_unicode:
1630 types.insert(0, unicode)
1631 for T in types:
Raymond Hettinger64958a12003-12-17 20:43:33 +00001632 self.assertEqual(sorted(s), sorted(T(s)))
1633
1634 def test_baddecorator(self):
1635 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1636 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1637
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001638def test_main(verbose=None):
1639 test_classes = (BuiltinTest, TestSorted)
1640
1641 run_unittest(*test_classes)
1642
1643 # verify reference counting
1644 if verbose and hasattr(sys, "gettotalrefcount"):
1645 import gc
1646 counts = [None] * 5
1647 for i in xrange(len(counts)):
1648 run_unittest(*test_classes)
1649 gc.collect()
1650 counts[i] = sys.gettotalrefcount()
1651 print counts
1652
Walter Dörwald919497e2003-01-19 16:23:59 +00001653
1654if __name__ == "__main__":
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001655 test_main(verbose=True)