blob: 9aa24c2331a2fd5074aafdf6cb97eb05f960d02e [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
4from test.test_support import fcmp, have_unicode, TESTFN, unlink
Guido van Rossum3bead091992-01-27 17:00:37 +00005
Raymond Hettinger64958a12003-12-17 20:43:33 +00006import sys, warnings, cStringIO, random
Walter Dörwald919497e2003-01-19 16:23:59 +00007warnings.filterwarnings("ignore", "hex../oct.. of negative int",
8 FutureWarning, __name__)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +00009warnings.filterwarnings("ignore", "integer argument expected",
10 DeprecationWarning, "unittest")
Guido van Rossum3bead091992-01-27 17:00:37 +000011
Walter Dörwald919497e2003-01-19 16:23:59 +000012class Squares:
Guido van Rossum3bead091992-01-27 17:00:37 +000013
Walter Dörwald919497e2003-01-19 16:23:59 +000014 def __init__(self, max):
15 self.max = max
16 self.sofar = []
17
18 def __len__(self): return len(self.sofar)
19
20 def __getitem__(self, i):
21 if not 0 <= i < self.max: raise IndexError
22 n = len(self.sofar)
23 while n <= i:
24 self.sofar.append(n*n)
25 n += 1
26 return self.sofar[i]
27
28class StrSquares:
29
30 def __init__(self, max):
31 self.max = max
32 self.sofar = []
33
34 def __len__(self):
35 return len(self.sofar)
36
37 def __getitem__(self, i):
38 if not 0 <= i < self.max:
39 raise IndexError
40 n = len(self.sofar)
41 while n <= i:
42 self.sofar.append(str(n*n))
43 n += 1
44 return self.sofar[i]
45
46class BitBucket:
47 def write(self, line):
48 pass
49
50L = [
51 ('0', 0),
52 ('1', 1),
53 ('9', 9),
54 ('10', 10),
55 ('99', 99),
56 ('100', 100),
57 ('314', 314),
58 (' 314', 314),
59 ('314 ', 314),
60 (' \t\t 314 \t\t ', 314),
Walter Dörwald70a6b492004-02-12 17:35:32 +000061 (repr(sys.maxint), sys.maxint),
Walter Dörwald919497e2003-01-19 16:23:59 +000062 (' 1x', ValueError),
63 (' 1 ', 1),
64 (' 1\02 ', ValueError),
65 ('', ValueError),
66 (' ', ValueError),
67 (' \t\t ', ValueError)
68]
69if have_unicode:
70 L += [
71 (unicode('0'), 0),
72 (unicode('1'), 1),
73 (unicode('9'), 9),
74 (unicode('10'), 10),
75 (unicode('99'), 99),
76 (unicode('100'), 100),
77 (unicode('314'), 314),
78 (unicode(' 314'), 314),
79 (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
80 (unicode(' \t\t 314 \t\t '), 314),
81 (unicode(' 1x'), ValueError),
82 (unicode(' 1 '), 1),
83 (unicode(' 1\02 '), ValueError),
84 (unicode(''), ValueError),
85 (unicode(' '), ValueError),
86 (unicode(' \t\t '), ValueError),
87 (unichr(0x200), ValueError),
88]
89
90class BuiltinTest(unittest.TestCase):
91
92 def test_import(self):
93 __import__('sys')
94 __import__('time')
95 __import__('string')
96 self.assertRaises(ImportError, __import__, 'spamspam')
97 self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
98
99 def test_abs(self):
100 # int
101 self.assertEqual(abs(0), 0)
102 self.assertEqual(abs(1234), 1234)
103 self.assertEqual(abs(-1234), 1234)
104 # float
105 self.assertEqual(abs(0.0), 0.0)
106 self.assertEqual(abs(3.14), 3.14)
107 self.assertEqual(abs(-3.14), 3.14)
108 # long
109 self.assertEqual(abs(0L), 0L)
110 self.assertEqual(abs(1234L), 1234L)
111 self.assertEqual(abs(-1234L), 1234L)
112 # str
113 self.assertRaises(TypeError, abs, 'a')
114
115 def test_apply(self):
116 def f0(*args):
117 self.assertEqual(args, ())
118 def f1(a1):
119 self.assertEqual(a1, 1)
120 def f2(a1, a2):
121 self.assertEqual(a1, 1)
122 self.assertEqual(a2, 2)
123 def f3(a1, a2, a3):
124 self.assertEqual(a1, 1)
125 self.assertEqual(a2, 2)
126 self.assertEqual(a3, 3)
127 apply(f0, ())
128 apply(f1, (1,))
129 apply(f2, (1, 2))
130 apply(f3, (1, 2, 3))
131
132 # A PyCFunction that takes only positional parameters should allow an
133 # empty keyword dictionary to pass without a complaint, but raise a
134 # TypeError if the dictionary is non-empty.
135 apply(id, (1,), {})
136 self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
137 self.assertRaises(TypeError, apply)
138 self.assertRaises(TypeError, apply, id, 42)
139 self.assertRaises(TypeError, apply, id, (42,), 42)
140
141 def test_callable(self):
142 self.assert_(callable(len))
143 def f(): pass
144 self.assert_(callable(f))
145 class C:
146 def meth(self): pass
147 self.assert_(callable(C))
148 x = C()
149 self.assert_(callable(x.meth))
150 self.assert_(not callable(x))
151 class D(C):
152 def __call__(self): pass
153 y = D()
154 self.assert_(callable(y))
155 y()
156
157 def test_chr(self):
158 self.assertEqual(chr(32), ' ')
159 self.assertEqual(chr(65), 'A')
160 self.assertEqual(chr(97), 'a')
161 self.assertEqual(chr(0xff), '\xff')
162 self.assertRaises(ValueError, chr, 256)
163 self.assertRaises(TypeError, chr)
164
165 def test_cmp(self):
166 self.assertEqual(cmp(-1, 1), -1)
167 self.assertEqual(cmp(1, -1), 1)
168 self.assertEqual(cmp(1, 1), 0)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000169 # verify that circular objects are not handled
Walter Dörwald919497e2003-01-19 16:23:59 +0000170 a = []; a.append(a)
171 b = []; b.append(b)
172 from UserList import UserList
173 c = UserList(); c.append(c)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000174 self.assertRaises(RuntimeError, cmp, a, b)
175 self.assertRaises(RuntimeError, cmp, b, c)
176 self.assertRaises(RuntimeError, cmp, c, a)
177 self.assertRaises(RuntimeError, cmp, a, c)
178 # okay, now break the cycles
Walter Dörwald919497e2003-01-19 16:23:59 +0000179 a.pop(); b.pop(); c.pop()
180 self.assertRaises(TypeError, cmp)
181
182 def test_coerce(self):
183 self.assert_(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
184 self.assertEqual(coerce(1, 1L), (1L, 1L))
185 self.assert_(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
186 self.assertRaises(TypeError, coerce)
187 class BadNumber:
188 def __coerce__(self, other):
189 raise ValueError
190 self.assertRaises(ValueError, coerce, 42, BadNumber())
Neal Norwitzabcb0c02003-01-28 19:21:24 +0000191 self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
Walter Dörwald919497e2003-01-19 16:23:59 +0000192
193 def test_compile(self):
194 compile('print 1\n', '', 'exec')
Just van Rossumf032f862003-02-09 20:38:48 +0000195 bom = '\xef\xbb\xbf'
196 compile(bom + 'print 1\n', '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000197 self.assertRaises(TypeError, compile)
198 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
199 self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000200 if have_unicode:
201 compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
Walter Dörwald919497e2003-01-19 16:23:59 +0000202
Walter Dörwald919497e2003-01-19 16:23:59 +0000203 def test_delattr(self):
204 import sys
205 sys.spam = 1
206 delattr(sys, 'spam')
207 self.assertRaises(TypeError, delattr)
208
209 def test_dir(self):
210 x = 1
211 self.assert_('x' in dir())
212 import sys
213 self.assert_('modules' in dir(sys))
214 self.assertRaises(TypeError, dir, 42, 42)
215
216 def test_divmod(self):
217 self.assertEqual(divmod(12, 7), (1, 5))
218 self.assertEqual(divmod(-12, 7), (-2, 2))
219 self.assertEqual(divmod(12, -7), (-2, -2))
220 self.assertEqual(divmod(-12, -7), (1, -5))
221
222 self.assertEqual(divmod(12L, 7L), (1L, 5L))
223 self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
224 self.assertEqual(divmod(12L, -7L), (-2L, -2L))
225 self.assertEqual(divmod(-12L, -7L), (1L, -5L))
226
227 self.assertEqual(divmod(12, 7L), (1, 5L))
228 self.assertEqual(divmod(-12, 7L), (-2, 2L))
229 self.assertEqual(divmod(12L, -7), (-2L, -2))
230 self.assertEqual(divmod(-12L, -7), (1L, -5))
231
232 self.assert_(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
233 self.assert_(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
234 self.assert_(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
235 self.assert_(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
236
237 self.assertRaises(TypeError, divmod)
238
239 def test_eval(self):
240 self.assertEqual(eval('1+1'), 2)
241 self.assertEqual(eval(' 1+1\n'), 2)
242 globals = {'a': 1, 'b': 2}
243 locals = {'b': 200, 'c': 300}
244 self.assertEqual(eval('a', globals) , 1)
245 self.assertEqual(eval('a', globals, locals), 1)
246 self.assertEqual(eval('b', globals, locals), 200)
247 self.assertEqual(eval('c', globals, locals), 300)
248 if have_unicode:
249 self.assertEqual(eval(unicode('1+1')), 2)
250 self.assertEqual(eval(unicode(' 1+1\n')), 2)
251 globals = {'a': 1, 'b': 2}
252 locals = {'b': 200, 'c': 300}
253 if have_unicode:
254 self.assertEqual(eval(unicode('a'), globals), 1)
255 self.assertEqual(eval(unicode('a'), globals, locals), 1)
256 self.assertEqual(eval(unicode('b'), globals, locals), 200)
257 self.assertEqual(eval(unicode('c'), globals, locals), 300)
Just van Rossumf032f862003-02-09 20:38:48 +0000258 bom = '\xef\xbb\xbf'
259 self.assertEqual(eval(bom + 'a', globals, locals), 1)
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000260 self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
261 unicode('\xc3\xa5', 'utf8'))
Walter Dörwald919497e2003-01-19 16:23:59 +0000262 self.assertRaises(TypeError, eval)
263 self.assertRaises(TypeError, eval, ())
264
265 # Done outside of the method test_z to get the correct scope
266 z = 0
267 f = open(TESTFN, 'w')
268 f.write('z = z+1\n')
269 f.write('z = z*2\n')
270 f.close()
271 execfile(TESTFN)
272
273 def test_execfile(self):
274 globals = {'a': 1, 'b': 2}
275 locals = {'b': 200, 'c': 300}
276
277 self.assertEqual(self.__class__.z, 2)
278 globals['z'] = 0
279 execfile(TESTFN, globals)
280 self.assertEqual(globals['z'], 2)
281 locals['z'] = 0
282 execfile(TESTFN, globals, locals)
283 self.assertEqual(locals['z'], 2)
284 unlink(TESTFN)
285 self.assertRaises(TypeError, execfile)
286 import os
287 self.assertRaises(IOError, execfile, os.curdir)
288 self.assertRaises(IOError, execfile, "I_dont_exist")
289
290 def test_filter(self):
291 self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
292 self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
293 self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
294 self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
295 self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
296 def identity(item):
297 return 1
298 filter(identity, Squares(5))
299 self.assertRaises(TypeError, filter)
300 class BadSeq(object):
Tim Petersf2715e02003-02-19 02:35:07 +0000301 def __getitem__(self, index):
302 if index<4:
303 return 42
304 raise ValueError
Walter Dörwald919497e2003-01-19 16:23:59 +0000305 self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
306 def badfunc():
307 pass
308 self.assertRaises(TypeError, filter, badfunc, range(5))
309
Walter Dörwaldbf517072003-01-27 15:57:14 +0000310 # test bltinmodule.c::filtertuple()
Walter Dörwald919497e2003-01-19 16:23:59 +0000311 self.assertEqual(filter(None, (1, 2)), (1, 2))
312 self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
313 self.assertRaises(TypeError, filter, 42, (1, 2))
314
Walter Dörwaldbf517072003-01-27 15:57:14 +0000315 # test bltinmodule.c::filterstring()
Walter Dörwald919497e2003-01-19 16:23:59 +0000316 self.assertEqual(filter(None, "12"), "12")
317 self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
318 self.assertRaises(TypeError, filter, 42, "12")
319 class badstr(str):
320 def __getitem__(self, index):
321 raise ValueError
322 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
Walter Dörwaldbf517072003-01-27 15:57:14 +0000323
Walter Dörwald903f1e02003-02-04 16:28:00 +0000324 class badstr2(str):
325 def __getitem__(self, index):
326 return 42
327 self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
328
329 class weirdstr(str):
330 def __getitem__(self, index):
331 return weirdstr(2*str.__getitem__(self, index))
332 self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
333
Walter Dörwald5e61e242003-02-04 17:04:01 +0000334 class shiftstr(str):
335 def __getitem__(self, index):
336 return chr(ord(str.__getitem__(self, index))+1)
337 self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
338
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000339 if have_unicode:
Walter Dörwaldbf517072003-01-27 15:57:14 +0000340 # test bltinmodule.c::filterunicode()
Martin v. Löwis8afd7572003-01-25 22:46:11 +0000341 self.assertEqual(filter(None, unicode("12")), unicode("12"))
342 self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
343 self.assertRaises(TypeError, filter, 42, unicode("12"))
344 self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
Walter Dörwald919497e2003-01-19 16:23:59 +0000345
Walter Dörwald903f1e02003-02-04 16:28:00 +0000346 class badunicode(unicode):
347 def __getitem__(self, index):
348 return 42
349 self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
350
351 class weirdunicode(unicode):
352 def __getitem__(self, index):
353 return weirdunicode(2*unicode.__getitem__(self, index))
354 self.assertEqual(
355 filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
356
Walter Dörwald5e61e242003-02-04 17:04:01 +0000357 class shiftunicode(unicode):
358 def __getitem__(self, index):
359 return unichr(ord(unicode.__getitem__(self, index))+1)
360 self.assertEqual(
361 filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
362 unicode("345")
363 )
364
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000365 def test_filter_subclasses(self):
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000366 # test that filter() never returns tuple, str or unicode subclasses
367 # and that the result always goes through __getitem__
368 funcs = (None, bool, lambda x: True)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000369 class tuple2(tuple):
Walter Dörwald1918f772003-02-10 13:19:13 +0000370 def __getitem__(self, index):
371 return 2*tuple.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000372 class str2(str):
Walter Dörwald1918f772003-02-10 13:19:13 +0000373 def __getitem__(self, index):
374 return 2*str.__getitem__(self, index)
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000375 inputs = {
Walter Dörwald8dd19322003-02-10 17:36:40 +0000376 tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
Walter Dörwald1918f772003-02-10 13:19:13 +0000377 str2: {"": "", "123": "112233"}
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000378 }
379 if have_unicode:
380 class unicode2(unicode):
Walter Dörwald1918f772003-02-10 13:19:13 +0000381 def __getitem__(self, index):
382 return 2*unicode.__getitem__(self, index)
383 inputs[unicode2] = {
384 unicode(): unicode(),
385 unicode("123"): unicode("112233")
386 }
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000387
Walter Dörwald1918f772003-02-10 13:19:13 +0000388 for (cls, inps) in inputs.iteritems():
389 for (inp, exp) in inps.iteritems():
Tim Petersf2715e02003-02-19 02:35:07 +0000390 # make sure the output goes through __getitem__
391 # even if func is None
392 self.assertEqual(
393 filter(funcs[0], cls(inp)),
394 filter(funcs[1], cls(inp))
395 )
396 for func in funcs:
Walter Dörwald1918f772003-02-10 13:19:13 +0000397 outp = filter(func, cls(inp))
398 self.assertEqual(outp, exp)
399 self.assert_(not isinstance(outp, cls))
Walter Dörwaldc3da83f2003-02-04 20:24:45 +0000400
Walter Dörwald919497e2003-01-19 16:23:59 +0000401 def test_float(self):
402 self.assertEqual(float(3.14), 3.14)
403 self.assertEqual(float(314), 314.0)
404 self.assertEqual(float(314L), 314.0)
405 self.assertEqual(float(" 3.14 "), 3.14)
406 if have_unicode:
407 self.assertEqual(float(unicode(" 3.14 ")), 3.14)
408 self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
409
410 def test_getattr(self):
411 import sys
412 self.assert_(getattr(sys, 'stdout') is sys.stdout)
413 self.assertRaises(TypeError, getattr, sys, 1)
414 self.assertRaises(TypeError, getattr, sys, 1, "foo")
415 self.assertRaises(TypeError, getattr)
416 self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
417
418 def test_hasattr(self):
419 import sys
420 self.assert_(hasattr(sys, 'stdout'))
421 self.assertRaises(TypeError, hasattr, sys, 1)
422 self.assertRaises(TypeError, hasattr)
423 self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
424
425 def test_hash(self):
426 hash(None)
427 self.assertEqual(hash(1), hash(1L))
428 self.assertEqual(hash(1), hash(1.0))
429 hash('spam')
430 if have_unicode:
431 self.assertEqual(hash('spam'), hash(unicode('spam')))
432 hash((0,1,2,3))
433 def f(): pass
434 self.assertRaises(TypeError, hash, [])
435 self.assertRaises(TypeError, hash, {})
436
437 def test_hex(self):
438 self.assertEqual(hex(16), '0x10')
439 self.assertEqual(hex(16L), '0x10L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000440 self.assertEqual(hex(-16), '-0x10')
Walter Dörwald919497e2003-01-19 16:23:59 +0000441 self.assertEqual(hex(-16L), '-0x10L')
442 self.assertRaises(TypeError, hex, {})
443
444 def test_id(self):
445 id(None)
446 id(1)
447 id(1L)
448 id(1.0)
449 id('spam')
450 id((0,1,2,3))
451 id([0,1,2,3])
452 id({'spam': 1, 'eggs': 2, 'ham': 3})
453
454 # Test input() later, together with raw_input
455
456 def test_int(self):
457 self.assertEqual(int(314), 314)
458 self.assertEqual(int(3.14), 3)
459 self.assertEqual(int(314L), 314)
460 # Check that conversion from float truncates towards zero
461 self.assertEqual(int(-3.14), -3)
462 self.assertEqual(int(3.9), 3)
463 self.assertEqual(int(-3.9), -3)
464 self.assertEqual(int(3.5), 3)
465 self.assertEqual(int(-3.5), -3)
466 # Different base:
467 self.assertEqual(int("10",16), 16L)
468 if have_unicode:
469 self.assertEqual(int(unicode("10"),16), 16L)
470 # Test conversion from strings and various anomalies
471 for s, v in L:
472 for sign in "", "+", "-":
473 for prefix in "", " ", "\t", " \t\t ":
474 ss = prefix + sign + s
475 vv = v
476 if sign == "-" and v is not ValueError:
477 vv = -v
478 try:
479 self.assertEqual(int(ss), vv)
480 except v:
481 pass
482
Walter Dörwald70a6b492004-02-12 17:35:32 +0000483 s = repr(-1-sys.maxint)
Walter Dörwald919497e2003-01-19 16:23:59 +0000484 self.assertEqual(int(s)+1, -sys.maxint)
485 # should return long
486 int(s[1:])
487
488 # should return long
489 x = int(1e100)
490 self.assert_(isinstance(x, long))
491 x = int(-1e100)
492 self.assert_(isinstance(x, long))
493
494
495 # SF bug 434186: 0x80000000/2 != 0x80000000>>1.
496 # Worked by accident in Windows release build, but failed in debug build.
497 # Failed in all Linux builds.
498 x = -1-sys.maxint
499 self.assertEqual(x >> 1, x//2)
500
501 self.assertRaises(ValueError, int, '123\0')
502 self.assertRaises(ValueError, int, '53', 40)
503
504 x = int('1' * 600)
505 self.assert_(isinstance(x, long))
506
507 if have_unicode:
508 x = int(unichr(0x661) * 600)
509 self.assert_(isinstance(x, long))
510
511 self.assertRaises(TypeError, int, 1, 12)
512
513 self.assertEqual(int('0123', 0), 83)
514
515 def test_intern(self):
516 self.assertRaises(TypeError, intern)
517 s = "never interned before"
518 self.assert_(intern(s) is s)
519 s2 = s.swapcase().swapcase()
520 self.assert_(intern(s2) is s)
521
522 def test_iter(self):
523 self.assertRaises(TypeError, iter)
524 self.assertRaises(TypeError, iter, 42, 42)
525 lists = [("1", "2"), ["1", "2"], "12"]
526 if have_unicode:
527 lists.append(unicode("12"))
528 for l in lists:
529 i = iter(l)
530 self.assertEqual(i.next(), '1')
531 self.assertEqual(i.next(), '2')
532 self.assertRaises(StopIteration, i.next)
533
534 def test_isinstance(self):
535 class C:
536 pass
537 class D(C):
538 pass
539 class E:
540 pass
541 c = C()
542 d = D()
543 e = E()
544 self.assert_(isinstance(c, C))
545 self.assert_(isinstance(d, C))
546 self.assert_(not isinstance(e, C))
547 self.assert_(not isinstance(c, D))
548 self.assert_(not isinstance('foo', E))
549 self.assertRaises(TypeError, isinstance, E, 'foo')
550 self.assertRaises(TypeError, isinstance)
551
552 def test_issubclass(self):
553 class C:
554 pass
555 class D(C):
556 pass
557 class E:
558 pass
559 c = C()
560 d = D()
561 e = E()
562 self.assert_(issubclass(D, C))
563 self.assert_(issubclass(C, C))
564 self.assert_(not issubclass(C, D))
565 self.assertRaises(TypeError, issubclass, 'foo', E)
566 self.assertRaises(TypeError, issubclass, E, 'foo')
567 self.assertRaises(TypeError, issubclass)
568
569 def test_len(self):
570 self.assertEqual(len('123'), 3)
571 self.assertEqual(len(()), 0)
572 self.assertEqual(len((1, 2, 3, 4)), 4)
573 self.assertEqual(len([1, 2, 3, 4]), 4)
574 self.assertEqual(len({}), 0)
575 self.assertEqual(len({'a':1, 'b': 2}), 2)
576 class BadSeq:
577 def __len__(self):
578 raise ValueError
579 self.assertRaises(ValueError, len, BadSeq())
580
581 def test_list(self):
582 self.assertEqual(list([]), [])
583 l0_3 = [0, 1, 2, 3]
584 l0_3_bis = list(l0_3)
585 self.assertEqual(l0_3, l0_3_bis)
586 self.assert_(l0_3 is not l0_3_bis)
587 self.assertEqual(list(()), [])
588 self.assertEqual(list((0, 1, 2, 3)), [0, 1, 2, 3])
589 self.assertEqual(list(''), [])
590 self.assertEqual(list('spam'), ['s', 'p', 'a', 'm'])
591
592 if sys.maxint == 0x7fffffff:
593 # This test can currently only work on 32-bit machines.
594 # XXX If/when PySequence_Length() returns a ssize_t, it should be
595 # XXX re-enabled.
596 # Verify clearing of bug #556025.
597 # This assumes that the max data size (sys.maxint) == max
598 # address size this also assumes that the address size is at
599 # least 4 bytes with 8 byte addresses, the bug is not well
600 # tested
601 #
602 # Note: This test is expected to SEGV under Cygwin 1.3.12 or
603 # earlier due to a newlib bug. See the following mailing list
604 # thread for the details:
605
606 # http://sources.redhat.com/ml/newlib/2002/msg00369.html
607 self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
608
609 def test_long(self):
610 self.assertEqual(long(314), 314L)
611 self.assertEqual(long(3.14), 3L)
612 self.assertEqual(long(314L), 314L)
613 # Check that conversion from float truncates towards zero
614 self.assertEqual(long(-3.14), -3L)
615 self.assertEqual(long(3.9), 3L)
616 self.assertEqual(long(-3.9), -3L)
617 self.assertEqual(long(3.5), 3L)
618 self.assertEqual(long(-3.5), -3L)
619 self.assertEqual(long("-3"), -3L)
620 if have_unicode:
621 self.assertEqual(long(unicode("-3")), -3L)
622 # Different base:
623 self.assertEqual(long("10",16), 16L)
624 if have_unicode:
625 self.assertEqual(long(unicode("10"),16), 16L)
626 # Check conversions from string (same test set as for int(), and then some)
627 LL = [
628 ('1' + '0'*20, 10L**20),
629 ('1' + '0'*100, 10L**100)
630 ]
Walter Dörwaldc8cb5d92003-08-15 17:52:39 +0000631 L2 = L[:]
Walter Dörwald919497e2003-01-19 16:23:59 +0000632 if have_unicode:
633 L2 += [
634 (unicode('1') + unicode('0')*20, 10L**20),
635 (unicode('1') + unicode('0')*100, 10L**100),
636 ]
637 for s, v in L2 + LL:
638 for sign in "", "+", "-":
639 for prefix in "", " ", "\t", " \t\t ":
640 ss = prefix + sign + s
641 vv = v
642 if sign == "-" and v is not ValueError:
643 vv = -v
644 try:
645 self.assertEqual(long(ss), long(vv))
646 except v:
647 pass
648
649 self.assertRaises(ValueError, long, '123\0')
650 self.assertRaises(ValueError, long, '53', 40)
651 self.assertRaises(TypeError, long, 1, 12)
652
653 def test_map(self):
654 self.assertEqual(
655 map(None, 'hello world'),
656 ['h','e','l','l','o',' ','w','o','r','l','d']
657 )
658 self.assertEqual(
659 map(None, 'abcd', 'efg'),
660 [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
661 )
662 self.assertEqual(
663 map(None, range(10)),
664 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
665 )
666 self.assertEqual(
667 map(lambda x: x*x, range(1,4)),
668 [1, 4, 9]
669 )
670 try:
671 from math import sqrt
672 except ImportError:
673 def sqrt(x):
674 return pow(x, 0.5)
675 self.assertEqual(
676 map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
677 [[4.0, 2.0], [9.0, 3.0]]
678 )
679 self.assertEqual(
680 map(lambda x, y: x+y, [1,3,2], [9,1,4]),
681 [10, 4, 6]
682 )
683
684 def plus(*v):
685 accu = 0
686 for i in v: accu = accu + i
687 return accu
688 self.assertEqual(
689 map(plus, [1, 3, 7]),
690 [1, 3, 7]
691 )
692 self.assertEqual(
693 map(plus, [1, 3, 7], [4, 9, 2]),
694 [1+4, 3+9, 7+2]
695 )
696 self.assertEqual(
697 map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
698 [1+4+1, 3+9+1, 7+2+0]
699 )
700 self.assertEqual(
701 map(None, Squares(10)),
702 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
703 )
704 self.assertEqual(
705 map(int, Squares(10)),
706 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
707 )
708 self.assertEqual(
709 map(None, Squares(3), Squares(2)),
710 [(0,0), (1,1), (4,None)]
711 )
712 self.assertEqual(
713 map(max, Squares(3), Squares(2)),
714 [0, 1, 4]
715 )
716 self.assertRaises(TypeError, map)
717 self.assertRaises(TypeError, map, lambda x: x, 42)
718 self.assertEqual(map(None, [42]), [42])
719 class BadSeq:
720 def __getitem__(self, index):
721 raise ValueError
722 self.assertRaises(ValueError, map, lambda x: x, BadSeq())
723
724 def test_max(self):
725 self.assertEqual(max('123123'), '3')
726 self.assertEqual(max(1, 2, 3), 3)
727 self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
728 self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
729
730 self.assertEqual(max(1, 2L, 3.0), 3.0)
731 self.assertEqual(max(1L, 2.0, 3), 3)
732 self.assertEqual(max(1.0, 2, 3L), 3L)
733
734 def test_min(self):
735 self.assertEqual(min('123123'), '1')
736 self.assertEqual(min(1, 2, 3), 1)
737 self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
738 self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
739
740 self.assertEqual(min(1, 2L, 3.0), 1)
741 self.assertEqual(min(1L, 2.0, 3), 1L)
742 self.assertEqual(min(1.0, 2, 3L), 1.0)
743
744 self.assertRaises(TypeError, min)
745 self.assertRaises(TypeError, min, 42)
746 self.assertRaises(ValueError, min, ())
747 class BadSeq:
748 def __getitem__(self, index):
749 raise ValueError
750 self.assertRaises(ValueError, min, BadSeq())
751 class BadNumber:
752 def __cmp__(self, other):
753 raise ValueError
754 self.assertRaises(ValueError, min, (42, BadNumber()))
755
756 def test_oct(self):
757 self.assertEqual(oct(100), '0144')
758 self.assertEqual(oct(100L), '0144L')
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000759 self.assertEqual(oct(-100), '-0144')
Walter Dörwald919497e2003-01-19 16:23:59 +0000760 self.assertEqual(oct(-100L), '-0144L')
761 self.assertRaises(TypeError, oct, ())
762
763 def write_testfile(self):
764 # NB the first 4 lines are also used to test input and raw_input, below
765 fp = open(TESTFN, 'w')
766 try:
767 fp.write('1+1\n')
768 fp.write('1+1\n')
769 fp.write('The quick brown fox jumps over the lazy dog')
770 fp.write('.\n')
771 fp.write('Dear John\n')
772 fp.write('XXX'*100)
773 fp.write('YYY'*100)
774 finally:
775 fp.close()
776
777 def test_open(self):
778 self.write_testfile()
779 fp = open(TESTFN, 'r')
780 try:
781 self.assertEqual(fp.readline(4), '1+1\n')
782 self.assertEqual(fp.readline(4), '1+1\n')
783 self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
784 self.assertEqual(fp.readline(4), 'Dear')
785 self.assertEqual(fp.readline(100), ' John\n')
786 self.assertEqual(fp.read(300), 'XXX'*100)
787 self.assertEqual(fp.read(1000), 'YYY'*100)
788 finally:
789 fp.close()
790 unlink(TESTFN)
791
792 def test_ord(self):
793 self.assertEqual(ord(' '), 32)
794 self.assertEqual(ord('A'), 65)
795 self.assertEqual(ord('a'), 97)
796 if have_unicode:
797 self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
798 self.assertRaises(TypeError, ord, 42)
799 self.assertRaises(TypeError, ord, unicode("12"))
800
801 def test_pow(self):
802 self.assertEqual(pow(0,0), 1)
803 self.assertEqual(pow(0,1), 0)
804 self.assertEqual(pow(1,0), 1)
805 self.assertEqual(pow(1,1), 1)
806
807 self.assertEqual(pow(2,0), 1)
808 self.assertEqual(pow(2,10), 1024)
809 self.assertEqual(pow(2,20), 1024*1024)
810 self.assertEqual(pow(2,30), 1024*1024*1024)
811
812 self.assertEqual(pow(-2,0), 1)
813 self.assertEqual(pow(-2,1), -2)
814 self.assertEqual(pow(-2,2), 4)
815 self.assertEqual(pow(-2,3), -8)
816
817 self.assertEqual(pow(0L,0), 1)
818 self.assertEqual(pow(0L,1), 0)
819 self.assertEqual(pow(1L,0), 1)
820 self.assertEqual(pow(1L,1), 1)
821
822 self.assertEqual(pow(2L,0), 1)
823 self.assertEqual(pow(2L,10), 1024)
824 self.assertEqual(pow(2L,20), 1024*1024)
825 self.assertEqual(pow(2L,30), 1024*1024*1024)
826
827 self.assertEqual(pow(-2L,0), 1)
828 self.assertEqual(pow(-2L,1), -2)
829 self.assertEqual(pow(-2L,2), 4)
830 self.assertEqual(pow(-2L,3), -8)
831
832 self.assertAlmostEqual(pow(0.,0), 1.)
833 self.assertAlmostEqual(pow(0.,1), 0.)
834 self.assertAlmostEqual(pow(1.,0), 1.)
835 self.assertAlmostEqual(pow(1.,1), 1.)
836
837 self.assertAlmostEqual(pow(2.,0), 1.)
838 self.assertAlmostEqual(pow(2.,10), 1024.)
839 self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
840 self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
841
842 self.assertAlmostEqual(pow(-2.,0), 1.)
843 self.assertAlmostEqual(pow(-2.,1), -2.)
844 self.assertAlmostEqual(pow(-2.,2), 4.)
845 self.assertAlmostEqual(pow(-2.,3), -8.)
846
847 for x in 2, 2L, 2.0:
848 for y in 10, 10L, 10.0:
849 for z in 1000, 1000L, 1000.0:
850 if isinstance(x, float) or \
851 isinstance(y, float) or \
852 isinstance(z, float):
853 self.assertRaises(TypeError, pow, x, y, z)
854 else:
855 self.assertAlmostEqual(pow(x, y, z), 24.0)
856
857 self.assertRaises(TypeError, pow, -1, -2, 3)
858 self.assertRaises(ValueError, pow, 1, 2, 0)
859 self.assertRaises(TypeError, pow, -1L, -2L, 3L)
860 self.assertRaises(ValueError, pow, 1L, 2L, 0L)
861 self.assertRaises(ValueError, pow, -342.43, 0.234)
862
863 self.assertRaises(TypeError, pow)
864
865 def test_range(self):
866 self.assertEqual(range(3), [0, 1, 2])
867 self.assertEqual(range(1, 5), [1, 2, 3, 4])
868 self.assertEqual(range(0), [])
869 self.assertEqual(range(-3), [])
870 self.assertEqual(range(1, 10, 3), [1, 4, 7])
871 self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
872
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000873 # Now test range() with longs
874 self.assertEqual(range(-2**100), [])
875 self.assertEqual(range(0, -2**100), [])
876 self.assertEqual(range(0, 2**100, -1), [])
877 self.assertEqual(range(0, 2**100, -1), [])
878
879 a = long(10 * sys.maxint)
880 b = long(100 * sys.maxint)
881 c = long(50 * sys.maxint)
882
883 self.assertEqual(range(a, a+2), [a, a+1])
884 self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
885 self.assertEqual(range(a+4, a, -2), [a+4, a+2])
886
887 seq = range(a, b, c)
888 self.assert_(a in seq)
889 self.assert_(b not in seq)
890 self.assertEqual(len(seq), 2)
891
892 seq = range(b, a, -c)
893 self.assert_(b in seq)
894 self.assert_(a not in seq)
895 self.assertEqual(len(seq), 2)
896
897 seq = range(-a, -b, -c)
898 self.assert_(-a in seq)
899 self.assert_(-b not in seq)
900 self.assertEqual(len(seq), 2)
901
Walter Dörwald919497e2003-01-19 16:23:59 +0000902 self.assertRaises(TypeError, range)
903 self.assertRaises(TypeError, range, 1, 2, 3, 4)
904 self.assertRaises(ValueError, range, 1, 2, 0)
905
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000906 # Reject floats when it would require PyLongs to represent.
907 # (smaller floats still accepted, but deprecated)
Tim Peters299b3df2003-04-15 14:40:03 +0000908 self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
Guido van Rossumefbbb1c2003-04-11 18:43:06 +0000909
Walter Dörwald357981e2003-04-15 18:59:28 +0000910 self.assertRaises(TypeError, range, 0, "spam")
911 self.assertRaises(TypeError, range, 0, 42, "spam")
912
913 self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
914 self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
915
Walter Dörwald919497e2003-01-19 16:23:59 +0000916 def test_input_and_raw_input(self):
917 self.write_testfile()
918 fp = open(TESTFN, 'r')
919 savestdin = sys.stdin
920 savestdout = sys.stdout # Eats the echo
921 try:
922 sys.stdin = fp
923 sys.stdout = BitBucket()
924 self.assertEqual(input(), 2)
925 self.assertEqual(input('testing\n'), 2)
926 self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
927 self.assertEqual(raw_input('testing\n'), 'Dear John')
928 sys.stdin = cStringIO.StringIO("NULL\0")
929 self.assertRaises(TypeError, input, 42, 42)
930 sys.stdin = cStringIO.StringIO(" 'whitespace'")
931 self.assertEqual(input(), 'whitespace')
932 sys.stdin = cStringIO.StringIO()
933 self.assertRaises(EOFError, input)
Hye-Shik Changff83c2b2004-02-02 13:39:01 +0000934
935 # SF 876178: make sure input() respect future options.
936 sys.stdin = cStringIO.StringIO('1/2')
937 sys.stdout = cStringIO.StringIO()
938 exec compile('print input()', 'test_builtin_tmp', 'exec')
939 sys.stdin.seek(0, 0)
940 exec compile('from __future__ import division;print input()',
941 'test_builtin_tmp', 'exec')
942 sys.stdin.seek(0, 0)
943 exec compile('print input()', 'test_builtin_tmp', 'exec')
944 self.assertEqual(sys.stdout.getvalue().splitlines(),
945 ['0', '0.5', '0'])
946
Walter Dörwald919497e2003-01-19 16:23:59 +0000947 del sys.stdout
948 self.assertRaises(RuntimeError, input, 'prompt')
949 del sys.stdin
950 self.assertRaises(RuntimeError, input, 'prompt')
951 finally:
952 sys.stdin = savestdin
953 sys.stdout = savestdout
954 fp.close()
955 unlink(TESTFN)
956
957 def test_reduce(self):
958 self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc')
959 self.assertEqual(
960 reduce(lambda x, y: x+y, [['a', 'c'], [], ['d', 'w']], []),
961 ['a','c','d','w']
962 )
963 self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
964 self.assertEqual(
965 reduce(lambda x, y: x*y, range(2,21), 1L),
966 2432902008176640000L
967 )
968 self.assertEqual(reduce(lambda x, y: x+y, Squares(10)), 285)
969 self.assertEqual(reduce(lambda x, y: x+y, Squares(10), 0), 285)
970 self.assertEqual(reduce(lambda x, y: x+y, Squares(0), 0), 0)
971 self.assertRaises(TypeError, reduce)
972 self.assertRaises(TypeError, reduce, 42, 42)
973 self.assertRaises(TypeError, reduce, 42, 42, 42)
974 self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
975 self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
976 self.assertRaises(TypeError, reduce, 42, (42, 42))
977
978 class BadSeq:
979 def __getitem__(self, index):
980 raise ValueError
981 self.assertRaises(ValueError, reduce, 42, BadSeq())
982
983 def test_reload(self):
984 import marshal
985 reload(marshal)
986 import string
987 reload(string)
988 ## import sys
989 ## self.assertRaises(ImportError, reload, sys)
990
991 def test_repr(self):
992 self.assertEqual(repr(''), '\'\'')
993 self.assertEqual(repr(0), '0')
994 self.assertEqual(repr(0L), '0L')
995 self.assertEqual(repr(()), '()')
996 self.assertEqual(repr([]), '[]')
997 self.assertEqual(repr({}), '{}')
998 a = []
999 a.append(a)
1000 self.assertEqual(repr(a), '[[...]]')
1001 a = {}
1002 a[0] = a
1003 self.assertEqual(repr(a), '{0: {...}}')
1004
1005 def test_round(self):
1006 self.assertEqual(round(0.0), 0.0)
1007 self.assertEqual(round(1.0), 1.0)
1008 self.assertEqual(round(10.0), 10.0)
1009 self.assertEqual(round(1000000000.0), 1000000000.0)
1010 self.assertEqual(round(1e20), 1e20)
1011
1012 self.assertEqual(round(-1.0), -1.0)
1013 self.assertEqual(round(-10.0), -10.0)
1014 self.assertEqual(round(-1000000000.0), -1000000000.0)
1015 self.assertEqual(round(-1e20), -1e20)
1016
1017 self.assertEqual(round(0.1), 0.0)
1018 self.assertEqual(round(1.1), 1.0)
1019 self.assertEqual(round(10.1), 10.0)
1020 self.assertEqual(round(1000000000.1), 1000000000.0)
1021
1022 self.assertEqual(round(-1.1), -1.0)
1023 self.assertEqual(round(-10.1), -10.0)
1024 self.assertEqual(round(-1000000000.1), -1000000000.0)
1025
1026 self.assertEqual(round(0.9), 1.0)
1027 self.assertEqual(round(9.9), 10.0)
1028 self.assertEqual(round(999999999.9), 1000000000.0)
1029
1030 self.assertEqual(round(-0.9), -1.0)
1031 self.assertEqual(round(-9.9), -10.0)
1032 self.assertEqual(round(-999999999.9), -1000000000.0)
1033
1034 self.assertEqual(round(-8.0, -1), -10.0)
1035
1036 self.assertRaises(TypeError, round)
1037
1038 def test_setattr(self):
Tim Petersf2715e02003-02-19 02:35:07 +00001039 setattr(sys, 'spam', 1)
1040 self.assertEqual(sys.spam, 1)
1041 self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1042 self.assertRaises(TypeError, setattr)
Walter Dörwald919497e2003-01-19 16:23:59 +00001043
1044 def test_str(self):
1045 self.assertEqual(str(''), '')
1046 self.assertEqual(str(0), '0')
1047 self.assertEqual(str(0L), '0')
1048 self.assertEqual(str(()), '()')
1049 self.assertEqual(str([]), '[]')
1050 self.assertEqual(str({}), '{}')
1051 a = []
1052 a.append(a)
1053 self.assertEqual(str(a), '[[...]]')
1054 a = {}
1055 a[0] = a
1056 self.assertEqual(str(a), '{0: {...}}')
1057
Alex Martellia70b1912003-04-22 08:12:33 +00001058 def test_sum(self):
1059 self.assertEqual(sum([]), 0)
1060 self.assertEqual(sum(range(2,8)), 27)
1061 self.assertEqual(sum(iter(range(2,8))), 27)
1062 self.assertEqual(sum(Squares(10)), 285)
1063 self.assertEqual(sum(iter(Squares(10))), 285)
1064 self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1065
1066 self.assertRaises(TypeError, sum)
1067 self.assertRaises(TypeError, sum, 42)
1068 self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1069 self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1070 self.assertRaises(TypeError, sum, [[1], [2], [3]])
1071 self.assertRaises(TypeError, sum, [{2:3}])
1072 self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1073
1074 class BadSeq:
1075 def __getitem__(self, index):
1076 raise ValueError
1077 self.assertRaises(ValueError, sum, BadSeq())
1078
Walter Dörwald919497e2003-01-19 16:23:59 +00001079 def test_tuple(self):
1080 self.assertEqual(tuple(()), ())
1081 t0_3 = (0, 1, 2, 3)
1082 t0_3_bis = tuple(t0_3)
1083 self.assert_(t0_3 is t0_3_bis)
1084 self.assertEqual(tuple([]), ())
1085 self.assertEqual(tuple([0, 1, 2, 3]), (0, 1, 2, 3))
1086 self.assertEqual(tuple(''), ())
1087 self.assertEqual(tuple('spam'), ('s', 'p', 'a', 'm'))
1088
1089 def test_type(self):
1090 self.assertEqual(type(''), type('123'))
1091 self.assertNotEqual(type(''), type(()))
1092
1093 def test_unichr(self):
1094 if have_unicode:
1095 self.assertEqual(unichr(32), unicode(' '))
1096 self.assertEqual(unichr(65), unicode('A'))
1097 self.assertEqual(unichr(97), unicode('a'))
1098 self.assertEqual(
1099 unichr(sys.maxunicode),
1100 unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1101 )
1102 self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1103 self.assertRaises(TypeError, unichr)
1104
1105 def get_vars_f0():
1106 return vars()
1107 # we don't want self in vars(), so use staticmethod
1108 get_vars_f0 = staticmethod(get_vars_f0)
1109
1110 def get_vars_f2():
1111 BuiltinTest.get_vars_f0()
1112 a = 1
1113 b = 2
1114 return vars()
1115 get_vars_f2 = staticmethod(get_vars_f2)
1116
1117 def test_vars(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001118 self.assertEqual(set(vars()), set(dir()))
Walter Dörwald919497e2003-01-19 16:23:59 +00001119 import sys
Raymond Hettingera690a992003-11-16 16:17:49 +00001120 self.assertEqual(set(vars(sys)), set(dir(sys)))
Walter Dörwald919497e2003-01-19 16:23:59 +00001121 self.assertEqual(self.get_vars_f0(), {})
1122 self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1123 self.assertRaises(TypeError, vars, 42, 42)
1124 self.assertRaises(TypeError, vars, 42)
1125
1126 def test_zip(self):
1127 a = (1, 2, 3)
1128 b = (4, 5, 6)
1129 t = [(1, 4), (2, 5), (3, 6)]
1130 self.assertEqual(zip(a, b), t)
1131 b = [4, 5, 6]
1132 self.assertEqual(zip(a, b), t)
1133 b = (4, 5, 6, 7)
1134 self.assertEqual(zip(a, b), t)
1135 class I:
1136 def __getitem__(self, i):
1137 if i < 0 or i > 2: raise IndexError
1138 return i + 4
1139 self.assertEqual(zip(a, I()), t)
Raymond Hettingereaef6152003-08-02 07:42:57 +00001140 self.assertEqual(zip(), [])
1141 self.assertEqual(zip(*[]), [])
Walter Dörwald919497e2003-01-19 16:23:59 +00001142 self.assertRaises(TypeError, zip, None)
1143 class G:
1144 pass
1145 self.assertRaises(TypeError, zip, a, G())
1146
1147 # Make sure zip doesn't try to allocate a billion elements for the
1148 # result list when one of its arguments doesn't say how long it is.
1149 # A MemoryError is the most likely failure mode.
1150 class SequenceWithoutALength:
1151 def __getitem__(self, i):
1152 if i == 5:
1153 raise IndexError
1154 else:
1155 return i
1156 self.assertEqual(
1157 zip(SequenceWithoutALength(), xrange(2**30)),
1158 list(enumerate(range(5)))
1159 )
1160
1161 class BadSeq:
1162 def __getitem__(self, i):
1163 if i == 5:
1164 raise ValueError
1165 else:
1166 return i
1167 self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1168
Raymond Hettinger64958a12003-12-17 20:43:33 +00001169class TestSorted(unittest.TestCase):
1170
1171 def test_basic(self):
1172 data = range(100)
1173 copy = data[:]
1174 random.shuffle(copy)
1175 self.assertEqual(data, sorted(copy))
1176 self.assertNotEqual(data, copy)
1177
1178 data.reverse()
1179 random.shuffle(copy)
1180 self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1181 self.assertNotEqual(data, copy)
1182 random.shuffle(copy)
1183 self.assertEqual(data, sorted(copy, key=lambda x: -x))
1184 self.assertNotEqual(data, copy)
1185 random.shuffle(copy)
1186 self.assertEqual(data, sorted(copy, reverse=1))
1187 self.assertNotEqual(data, copy)
1188
1189 def test_inputtypes(self):
1190 s = 'abracadabra'
1191 for T in [unicode, list, tuple]:
1192 self.assertEqual(sorted(s), sorted(T(s)))
1193
1194 s = ''.join(dict.fromkeys(s).keys()) # unique letters only
1195 for T in [unicode, set, frozenset, list, tuple, dict.fromkeys]:
1196 self.assertEqual(sorted(s), sorted(T(s)))
1197
1198 def test_baddecorator(self):
1199 data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1200 self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1201
Walter Dörwald919497e2003-01-19 16:23:59 +00001202def test_main():
Raymond Hettinger64958a12003-12-17 20:43:33 +00001203 test.test_support.run_unittest(BuiltinTest, TestSorted)
Walter Dörwald919497e2003-01-19 16:23:59 +00001204
1205if __name__ == "__main__":
1206 test_main()