test_builtin.py revision 4adfde8bc82dd39f59e0445588c3e599ada477d2
1# Python test set -- built-in functions
2
3import platform
4import unittest
5from test.test_support import fcmp, have_unicode, TESTFN, unlink, \
6                              run_unittest, check_py3k_warnings
7import warnings
8from operator import neg
9
10import sys, cStringIO, random, UserDict
11
12# count the number of test runs.
13# used to skip running test_execfile() multiple times
14# and to create unique strings to intern in test_intern()
15numruns = 0
16
17class Squares:
18
19    def __init__(self, max):
20        self.max = max
21        self.sofar = []
22
23    def __len__(self): return len(self.sofar)
24
25    def __getitem__(self, i):
26        if not 0 <= i < self.max: raise IndexError
27        n = len(self.sofar)
28        while n <= i:
29            self.sofar.append(n*n)
30            n += 1
31        return self.sofar[i]
32
33class StrSquares:
34
35    def __init__(self, max):
36        self.max = max
37        self.sofar = []
38
39    def __len__(self):
40        return len(self.sofar)
41
42    def __getitem__(self, i):
43        if not 0 <= i < self.max:
44            raise IndexError
45        n = len(self.sofar)
46        while n <= i:
47            self.sofar.append(str(n*n))
48            n += 1
49        return self.sofar[i]
50
51class BitBucket:
52    def write(self, line):
53        pass
54
55
56class TestFailingBool:
57    def __nonzero__(self):
58        raise RuntimeError
59
60class TestFailingIter:
61    def __iter__(self):
62        raise RuntimeError
63
64class BuiltinTest(unittest.TestCase):
65
66    def test_import(self):
67        __import__('sys')
68        __import__('time')
69        __import__('string')
70        __import__(name='sys')
71        __import__(name='time', level=0)
72        self.assertRaises(ImportError, __import__, 'spamspam')
73        self.assertRaises(TypeError, __import__, 1, 2, 3, 4)
74        self.assertRaises(ValueError, __import__, '')
75        self.assertRaises(TypeError, __import__, 'sys', name='sys')
76
77    def test_abs(self):
78        # int
79        self.assertEqual(abs(0), 0)
80        self.assertEqual(abs(1234), 1234)
81        self.assertEqual(abs(-1234), 1234)
82        self.assertTrue(abs(-sys.maxint-1) > 0)
83        # float
84        self.assertEqual(abs(0.0), 0.0)
85        self.assertEqual(abs(3.14), 3.14)
86        self.assertEqual(abs(-3.14), 3.14)
87        # long
88        self.assertEqual(abs(0L), 0L)
89        self.assertEqual(abs(1234L), 1234L)
90        self.assertEqual(abs(-1234L), 1234L)
91        # str
92        self.assertRaises(TypeError, abs, 'a')
93        # bool
94        self.assertEqual(abs(True), 1)
95        self.assertEqual(abs(False), 0)
96        # other
97        self.assertRaises(TypeError, abs)
98        self.assertRaises(TypeError, abs, None)
99        class AbsClass(object):
100            def __abs__(self):
101                return -5
102        self.assertEqual(abs(AbsClass()), -5)
103
104    def test_all(self):
105        self.assertEqual(all([2, 4, 6]), True)
106        self.assertEqual(all([2, None, 6]), False)
107        self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])
108        self.assertRaises(RuntimeError, all, TestFailingIter())
109        self.assertRaises(TypeError, all, 10)               # Non-iterable
110        self.assertRaises(TypeError, all)                   # No args
111        self.assertRaises(TypeError, all, [2, 4, 6], [])    # Too many args
112        self.assertEqual(all([]), True)                     # Empty iterator
113        self.assertEqual(all([0, TestFailingBool()]), False)# Short-circuit
114        S = [50, 60]
115        self.assertEqual(all(x > 42 for x in S), True)
116        S = [50, 40, 60]
117        self.assertEqual(all(x > 42 for x in S), False)
118
119    def test_any(self):
120        self.assertEqual(any([None, None, None]), False)
121        self.assertEqual(any([None, 4, None]), True)
122        self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])
123        self.assertRaises(RuntimeError, any, TestFailingIter())
124        self.assertRaises(TypeError, any, 10)               # Non-iterable
125        self.assertRaises(TypeError, any)                   # No args
126        self.assertRaises(TypeError, any, [2, 4, 6], [])    # Too many args
127        self.assertEqual(any([]), False)                    # Empty iterator
128        self.assertEqual(any([1, TestFailingBool()]), True) # Short-circuit
129        S = [40, 60, 30]
130        self.assertEqual(any(x > 42 for x in S), True)
131        S = [10, 20, 30]
132        self.assertEqual(any(x > 42 for x in S), False)
133
134    def test_neg(self):
135        x = -sys.maxint-1
136        self.assertTrue(isinstance(x, int))
137        self.assertEqual(-x, sys.maxint+1)
138
139    def test_apply(self):
140        def f0(*args):
141            self.assertEqual(args, ())
142        def f1(a1):
143            self.assertEqual(a1, 1)
144        def f2(a1, a2):
145            self.assertEqual(a1, 1)
146            self.assertEqual(a2, 2)
147        def f3(a1, a2, a3):
148            self.assertEqual(a1, 1)
149            self.assertEqual(a2, 2)
150            self.assertEqual(a3, 3)
151        apply(f0, ())
152        apply(f1, (1,))
153        apply(f2, (1, 2))
154        apply(f3, (1, 2, 3))
155
156        # A PyCFunction that takes only positional parameters should allow an
157        # empty keyword dictionary to pass without a complaint, but raise a
158        # TypeError if the dictionary is non-empty.
159        apply(id, (1,), {})
160        self.assertRaises(TypeError, apply, id, (1,), {"foo": 1})
161        self.assertRaises(TypeError, apply)
162        self.assertRaises(TypeError, apply, id, 42)
163        self.assertRaises(TypeError, apply, id, (42,), 42)
164
165    def test_callable(self):
166        self.assertTrue(callable(len))
167        self.assertFalse(callable("a"))
168        self.assertTrue(callable(callable))
169        self.assertTrue(callable(lambda x, y: x + y))
170        self.assertFalse(callable(__builtins__))
171        def f(): pass
172        self.assertTrue(callable(f))
173
174        class Classic:
175            def meth(self): pass
176        self.assertTrue(callable(Classic))
177        c = Classic()
178        self.assertTrue(callable(c.meth))
179        self.assertFalse(callable(c))
180
181        class NewStyle(object):
182            def meth(self): pass
183        self.assertTrue(callable(NewStyle))
184        n = NewStyle()
185        self.assertTrue(callable(n.meth))
186        self.assertFalse(callable(n))
187
188        # Classic and new-style classes evaluate __call__() differently
189        c.__call__ = None
190        self.assertTrue(callable(c))
191        del c.__call__
192        self.assertFalse(callable(c))
193        n.__call__ = None
194        self.assertFalse(callable(n))
195        del n.__call__
196        self.assertFalse(callable(n))
197
198        class N2(object):
199            def __call__(self): pass
200        n2 = N2()
201        self.assertTrue(callable(n2))
202        class N3(N2): pass
203        n3 = N3()
204        self.assertTrue(callable(n3))
205
206    def test_chr(self):
207        self.assertEqual(chr(32), ' ')
208        self.assertEqual(chr(65), 'A')
209        self.assertEqual(chr(97), 'a')
210        self.assertEqual(chr(0xff), '\xff')
211        self.assertRaises(ValueError, chr, 256)
212        self.assertRaises(TypeError, chr)
213
214    def test_cmp(self):
215        self.assertEqual(cmp(-1, 1), -1)
216        self.assertEqual(cmp(1, -1), 1)
217        self.assertEqual(cmp(1, 1), 0)
218        # verify that circular objects are not handled
219        a = []; a.append(a)
220        b = []; b.append(b)
221        from UserList import UserList
222        c = UserList(); c.append(c)
223        self.assertRaises(RuntimeError, cmp, a, b)
224        self.assertRaises(RuntimeError, cmp, b, c)
225        self.assertRaises(RuntimeError, cmp, c, a)
226        self.assertRaises(RuntimeError, cmp, a, c)
227       # okay, now break the cycles
228        a.pop(); b.pop(); c.pop()
229        self.assertRaises(TypeError, cmp)
230
231    def test_coerce(self):
232        self.assertTrue(not fcmp(coerce(1, 1.1), (1.0, 1.1)))
233        self.assertEqual(coerce(1, 1L), (1L, 1L))
234        self.assertTrue(not fcmp(coerce(1L, 1.1), (1.0, 1.1)))
235        self.assertRaises(TypeError, coerce)
236        class BadNumber:
237            def __coerce__(self, other):
238                raise ValueError
239        self.assertRaises(ValueError, coerce, 42, BadNumber())
240        self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
241
242    def test_compile(self):
243        compile('print 1\n', '', 'exec')
244        bom = '\xef\xbb\xbf'
245        compile(bom + 'print 1\n', '', 'exec')
246        compile(source='pass', filename='?', mode='exec')
247        compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
248        compile('pass', '?', dont_inherit=1, mode='exec')
249        self.assertRaises(TypeError, compile)
250        self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'badmode')
251        self.assertRaises(ValueError, compile, 'print 42\n', '<string>', 'single', 0xff)
252        self.assertRaises(TypeError, compile, chr(0), 'f', 'exec')
253        self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
254                          mode='eval', source='0', filename='tmp')
255        if have_unicode:
256            compile(unicode('print u"\xc3\xa5"\n', 'utf8'), '', 'exec')
257            self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
258            self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
259
260
261    def test_delattr(self):
262        import sys
263        sys.spam = 1
264        delattr(sys, 'spam')
265        self.assertRaises(TypeError, delattr)
266
267    def test_dir(self):
268        # dir(wrong number of arguments)
269        self.assertRaises(TypeError, dir, 42, 42)
270
271        # dir() - local scope
272        local_var = 1
273        self.assertIn('local_var', dir())
274
275        # dir(module)
276        import sys
277        self.assertIn('exit', dir(sys))
278
279        # dir(module_with_invalid__dict__)
280        import types
281        class Foo(types.ModuleType):
282            __dict__ = 8
283        f = Foo("foo")
284        self.assertRaises(TypeError, dir, f)
285
286        # dir(type)
287        self.assertIn("strip", dir(str))
288        self.assertNotIn("__mro__", dir(str))
289
290        # dir(obj)
291        class Foo(object):
292            def __init__(self):
293                self.x = 7
294                self.y = 8
295                self.z = 9
296        f = Foo()
297        self.assertIn("y", dir(f))
298
299        # dir(obj_no__dict__)
300        class Foo(object):
301            __slots__ = []
302        f = Foo()
303        self.assertIn("__repr__", dir(f))
304
305        # dir(obj_no__class__with__dict__)
306        # (an ugly trick to cause getattr(f, "__class__") to fail)
307        class Foo(object):
308            __slots__ = ["__class__", "__dict__"]
309            def __init__(self):
310                self.bar = "wow"
311        f = Foo()
312        self.assertNotIn("__repr__", dir(f))
313        self.assertIn("bar", dir(f))
314
315        # dir(obj_using __dir__)
316        class Foo(object):
317            def __dir__(self):
318                return ["kan", "ga", "roo"]
319        f = Foo()
320        self.assertTrue(dir(f) == ["ga", "kan", "roo"])
321
322        # dir(obj__dir__not_list)
323        class Foo(object):
324            def __dir__(self):
325                return 7
326        f = Foo()
327        self.assertRaises(TypeError, dir, f)
328
329    def test_divmod(self):
330        self.assertEqual(divmod(12, 7), (1, 5))
331        self.assertEqual(divmod(-12, 7), (-2, 2))
332        self.assertEqual(divmod(12, -7), (-2, -2))
333        self.assertEqual(divmod(-12, -7), (1, -5))
334
335        self.assertEqual(divmod(12L, 7L), (1L, 5L))
336        self.assertEqual(divmod(-12L, 7L), (-2L, 2L))
337        self.assertEqual(divmod(12L, -7L), (-2L, -2L))
338        self.assertEqual(divmod(-12L, -7L), (1L, -5L))
339
340        self.assertEqual(divmod(12, 7L), (1, 5L))
341        self.assertEqual(divmod(-12, 7L), (-2, 2L))
342        self.assertEqual(divmod(12L, -7), (-2L, -2))
343        self.assertEqual(divmod(-12L, -7), (1L, -5))
344
345        self.assertEqual(divmod(-sys.maxint-1, -1),
346                         (sys.maxint+1, 0))
347
348        self.assertTrue(not fcmp(divmod(3.25, 1.0), (3.0, 0.25)))
349        self.assertTrue(not fcmp(divmod(-3.25, 1.0), (-4.0, 0.75)))
350        self.assertTrue(not fcmp(divmod(3.25, -1.0), (-4.0, -0.75)))
351        self.assertTrue(not fcmp(divmod(-3.25, -1.0), (3.0, -0.25)))
352
353        self.assertRaises(TypeError, divmod)
354
355    def test_eval(self):
356        self.assertEqual(eval('1+1'), 2)
357        self.assertEqual(eval(' 1+1\n'), 2)
358        globals = {'a': 1, 'b': 2}
359        locals = {'b': 200, 'c': 300}
360        self.assertEqual(eval('a', globals) , 1)
361        self.assertEqual(eval('a', globals, locals), 1)
362        self.assertEqual(eval('b', globals, locals), 200)
363        self.assertEqual(eval('c', globals, locals), 300)
364        if have_unicode:
365            self.assertEqual(eval(unicode('1+1')), 2)
366            self.assertEqual(eval(unicode(' 1+1\n')), 2)
367        globals = {'a': 1, 'b': 2}
368        locals = {'b': 200, 'c': 300}
369        if have_unicode:
370            self.assertEqual(eval(unicode('a'), globals), 1)
371            self.assertEqual(eval(unicode('a'), globals, locals), 1)
372            self.assertEqual(eval(unicode('b'), globals, locals), 200)
373            self.assertEqual(eval(unicode('c'), globals, locals), 300)
374            bom = '\xef\xbb\xbf'
375            self.assertEqual(eval(bom + 'a', globals, locals), 1)
376            self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals),
377                             unicode('\xc3\xa5', 'utf8'))
378        self.assertRaises(TypeError, eval)
379        self.assertRaises(TypeError, eval, ())
380
381    def test_general_eval(self):
382        # Tests that general mappings can be used for the locals argument
383
384        class M:
385            "Test mapping interface versus possible calls from eval()."
386            def __getitem__(self, key):
387                if key == 'a':
388                    return 12
389                raise KeyError
390            def keys(self):
391                return list('xyz')
392
393        m = M()
394        g = globals()
395        self.assertEqual(eval('a', g, m), 12)
396        self.assertRaises(NameError, eval, 'b', g, m)
397        self.assertEqual(eval('dir()', g, m), list('xyz'))
398        self.assertEqual(eval('globals()', g, m), g)
399        self.assertEqual(eval('locals()', g, m), m)
400        self.assertRaises(TypeError, eval, 'a', m)
401        class A:
402            "Non-mapping"
403            pass
404        m = A()
405        self.assertRaises(TypeError, eval, 'a', g, m)
406
407        # Verify that dict subclasses work as well
408        class D(dict):
409            def __getitem__(self, key):
410                if key == 'a':
411                    return 12
412                return dict.__getitem__(self, key)
413            def keys(self):
414                return list('xyz')
415
416        d = D()
417        self.assertEqual(eval('a', g, d), 12)
418        self.assertRaises(NameError, eval, 'b', g, d)
419        self.assertEqual(eval('dir()', g, d), list('xyz'))
420        self.assertEqual(eval('globals()', g, d), g)
421        self.assertEqual(eval('locals()', g, d), d)
422
423        # Verify locals stores (used by list comps)
424        eval('[locals() for i in (2,3)]', g, d)
425        eval('[locals() for i in (2,3)]', g, UserDict.UserDict())
426
427        class SpreadSheet:
428            "Sample application showing nested, calculated lookups."
429            _cells = {}
430            def __setitem__(self, key, formula):
431                self._cells[key] = formula
432            def __getitem__(self, key):
433                return eval(self._cells[key], globals(), self)
434
435        ss = SpreadSheet()
436        ss['a1'] = '5'
437        ss['a2'] = 'a1*6'
438        ss['a3'] = 'a2*7'
439        self.assertEqual(ss['a3'], 210)
440
441        # Verify that dir() catches a non-list returned by eval
442        # SF bug #1004669
443        class C:
444            def __getitem__(self, item):
445                raise KeyError(item)
446            def keys(self):
447                return 'a'
448        self.assertRaises(TypeError, eval, 'dir()', globals(), C())
449
450    # Done outside of the method test_z to get the correct scope
451    z = 0
452    f = open(TESTFN, 'w')
453    f.write('z = z+1\n')
454    f.write('z = z*2\n')
455    f.close()
456    with check_py3k_warnings(("execfile.. not supported in 3.x",
457                              DeprecationWarning)):
458        execfile(TESTFN)
459
460    def test_execfile(self):
461        global numruns
462        if numruns:
463            return
464        numruns += 1
465
466        globals = {'a': 1, 'b': 2}
467        locals = {'b': 200, 'c': 300}
468
469        self.assertEqual(self.__class__.z, 2)
470        globals['z'] = 0
471        execfile(TESTFN, globals)
472        self.assertEqual(globals['z'], 2)
473        locals['z'] = 0
474        execfile(TESTFN, globals, locals)
475        self.assertEqual(locals['z'], 2)
476
477        class M:
478            "Test mapping interface versus possible calls from execfile()."
479            def __init__(self):
480                self.z = 10
481            def __getitem__(self, key):
482                if key == 'z':
483                    return self.z
484                raise KeyError
485            def __setitem__(self, key, value):
486                if key == 'z':
487                    self.z = value
488                    return
489                raise KeyError
490
491        locals = M()
492        locals['z'] = 0
493        execfile(TESTFN, globals, locals)
494        self.assertEqual(locals['z'], 2)
495
496        unlink(TESTFN)
497        self.assertRaises(TypeError, execfile)
498        self.assertRaises(TypeError, execfile, TESTFN, {}, ())
499        import os
500        self.assertRaises(IOError, execfile, os.curdir)
501        self.assertRaises(IOError, execfile, "I_dont_exist")
502
503    def test_filter(self):
504        self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
505        self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
506        self.assertEqual(filter(lambda x: x > 0, [1, -3, 9, 0, 2]), [1, 9, 2])
507        self.assertEqual(filter(None, Squares(10)), [1, 4, 9, 16, 25, 36, 49, 64, 81])
508        self.assertEqual(filter(lambda x: x%2, Squares(10)), [1, 9, 25, 49, 81])
509        def identity(item):
510            return 1
511        filter(identity, Squares(5))
512        self.assertRaises(TypeError, filter)
513        class BadSeq(object):
514            def __getitem__(self, index):
515                if index<4:
516                    return 42
517                raise ValueError
518        self.assertRaises(ValueError, filter, lambda x: x, BadSeq())
519        def badfunc():
520            pass
521        self.assertRaises(TypeError, filter, badfunc, range(5))
522
523        # test bltinmodule.c::filtertuple()
524        self.assertEqual(filter(None, (1, 2)), (1, 2))
525        self.assertEqual(filter(lambda x: x>=3, (1, 2, 3, 4)), (3, 4))
526        self.assertRaises(TypeError, filter, 42, (1, 2))
527
528        # test bltinmodule.c::filterstring()
529        self.assertEqual(filter(None, "12"), "12")
530        self.assertEqual(filter(lambda x: x>="3", "1234"), "34")
531        self.assertRaises(TypeError, filter, 42, "12")
532        class badstr(str):
533            def __getitem__(self, index):
534                raise ValueError
535        self.assertRaises(ValueError, filter, lambda x: x >="3", badstr("1234"))
536
537        class badstr2(str):
538            def __getitem__(self, index):
539                return 42
540        self.assertRaises(TypeError, filter, lambda x: x >=42, badstr2("1234"))
541
542        class weirdstr(str):
543            def __getitem__(self, index):
544                return weirdstr(2*str.__getitem__(self, index))
545        self.assertEqual(filter(lambda x: x>="33", weirdstr("1234")), "3344")
546
547        class shiftstr(str):
548            def __getitem__(self, index):
549                return chr(ord(str.__getitem__(self, index))+1)
550        self.assertEqual(filter(lambda x: x>="3", shiftstr("1234")), "345")
551
552        if have_unicode:
553            # test bltinmodule.c::filterunicode()
554            self.assertEqual(filter(None, unicode("12")), unicode("12"))
555            self.assertEqual(filter(lambda x: x>="3", unicode("1234")), unicode("34"))
556            self.assertRaises(TypeError, filter, 42, unicode("12"))
557            self.assertRaises(ValueError, filter, lambda x: x >="3", badstr(unicode("1234")))
558
559            class badunicode(unicode):
560                def __getitem__(self, index):
561                    return 42
562            self.assertRaises(TypeError, filter, lambda x: x >=42, badunicode("1234"))
563
564            class weirdunicode(unicode):
565                def __getitem__(self, index):
566                    return weirdunicode(2*unicode.__getitem__(self, index))
567            self.assertEqual(
568                filter(lambda x: x>=unicode("33"), weirdunicode("1234")), unicode("3344"))
569
570            class shiftunicode(unicode):
571                def __getitem__(self, index):
572                    return unichr(ord(unicode.__getitem__(self, index))+1)
573            self.assertEqual(
574                filter(lambda x: x>=unicode("3"), shiftunicode("1234")),
575                unicode("345")
576            )
577
578    def test_filter_subclasses(self):
579        # test that filter() never returns tuple, str or unicode subclasses
580        # and that the result always goes through __getitem__
581        funcs = (None, bool, lambda x: True)
582        class tuple2(tuple):
583            def __getitem__(self, index):
584                return 2*tuple.__getitem__(self, index)
585        class str2(str):
586            def __getitem__(self, index):
587                return 2*str.__getitem__(self, index)
588        inputs = {
589            tuple2: {(): (), (1, 2, 3): (2, 4, 6)},
590            str2:   {"": "", "123": "112233"}
591        }
592        if have_unicode:
593            class unicode2(unicode):
594                def __getitem__(self, index):
595                    return 2*unicode.__getitem__(self, index)
596            inputs[unicode2] = {
597                unicode(): unicode(),
598                unicode("123"): unicode("112233")
599            }
600
601        for (cls, inps) in inputs.iteritems():
602            for (inp, exp) in inps.iteritems():
603                # make sure the output goes through __getitem__
604                # even if func is None
605                self.assertEqual(
606                    filter(funcs[0], cls(inp)),
607                    filter(funcs[1], cls(inp))
608                )
609                for func in funcs:
610                    outp = filter(func, cls(inp))
611                    self.assertEqual(outp, exp)
612                    self.assertTrue(not isinstance(outp, cls))
613
614    def test_getattr(self):
615        import sys
616        self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
617        self.assertRaises(TypeError, getattr, sys, 1)
618        self.assertRaises(TypeError, getattr, sys, 1, "foo")
619        self.assertRaises(TypeError, getattr)
620        if have_unicode:
621            self.assertRaises(UnicodeError, getattr, sys, unichr(sys.maxunicode))
622
623    def test_hasattr(self):
624        import sys
625        self.assertTrue(hasattr(sys, 'stdout'))
626        self.assertRaises(TypeError, hasattr, sys, 1)
627        self.assertRaises(TypeError, hasattr)
628        if have_unicode:
629            self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
630
631        # Check that hasattr allows SystemExit and KeyboardInterrupts by
632        class A:
633            def __getattr__(self, what):
634                raise KeyboardInterrupt
635        self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
636        class B:
637            def __getattr__(self, what):
638                raise SystemExit
639        self.assertRaises(SystemExit, hasattr, B(), "b")
640
641    def test_hash(self):
642        hash(None)
643        self.assertEqual(hash(1), hash(1L))
644        self.assertEqual(hash(1), hash(1.0))
645        hash('spam')
646        if have_unicode:
647            self.assertEqual(hash('spam'), hash(unicode('spam')))
648        hash((0,1,2,3))
649        def f(): pass
650        self.assertRaises(TypeError, hash, [])
651        self.assertRaises(TypeError, hash, {})
652        # Bug 1536021: Allow hash to return long objects
653        class X:
654            def __hash__(self):
655                return 2**100
656        self.assertEqual(type(hash(X())), int)
657        class Y(object):
658            def __hash__(self):
659                return 2**100
660        self.assertEqual(type(hash(Y())), int)
661        class Z(long):
662            def __hash__(self):
663                return self
664        self.assertEqual(hash(Z(42)), hash(42L))
665
666    def test_hex(self):
667        self.assertEqual(hex(16), '0x10')
668        self.assertEqual(hex(16L), '0x10L')
669        self.assertEqual(hex(-16), '-0x10')
670        self.assertEqual(hex(-16L), '-0x10L')
671        self.assertRaises(TypeError, hex, {})
672
673    def test_id(self):
674        id(None)
675        id(1)
676        id(1L)
677        id(1.0)
678        id('spam')
679        id((0,1,2,3))
680        id([0,1,2,3])
681        id({'spam': 1, 'eggs': 2, 'ham': 3})
682
683    # Test input() later, together with raw_input
684
685    # test_int(): see test_int.py for int() tests.
686
687    def test_intern(self):
688        self.assertRaises(TypeError, intern)
689        # This fails if the test is run twice with a constant string,
690        # therefore append the run counter
691        s = "never interned before " + str(numruns)
692        self.assertTrue(intern(s) is s)
693        s2 = s.swapcase().swapcase()
694        self.assertTrue(intern(s2) is s)
695
696        # Subclasses of string can't be interned, because they
697        # provide too much opportunity for insane things to happen.
698        # We don't want them in the interned dict and if they aren't
699        # actually interned, we don't want to create the appearance
700        # that they are by allowing intern() to succeed.
701        class S(str):
702            def __hash__(self):
703                return 123
704
705        self.assertRaises(TypeError, intern, S("abc"))
706
707        # It's still safe to pass these strings to routines that
708        # call intern internally, e.g. PyObject_SetAttr().
709        s = S("abc")
710        setattr(s, s, s)
711        self.assertEqual(getattr(s, s), s)
712
713    def test_iter(self):
714        self.assertRaises(TypeError, iter)
715        self.assertRaises(TypeError, iter, 42, 42)
716        lists = [("1", "2"), ["1", "2"], "12"]
717        if have_unicode:
718            lists.append(unicode("12"))
719        for l in lists:
720            i = iter(l)
721            self.assertEqual(i.next(), '1')
722            self.assertEqual(i.next(), '2')
723            self.assertRaises(StopIteration, i.next)
724
725    def test_isinstance(self):
726        class C:
727            pass
728        class D(C):
729            pass
730        class E:
731            pass
732        c = C()
733        d = D()
734        e = E()
735        self.assertTrue(isinstance(c, C))
736        self.assertTrue(isinstance(d, C))
737        self.assertTrue(not isinstance(e, C))
738        self.assertTrue(not isinstance(c, D))
739        self.assertTrue(not isinstance('foo', E))
740        self.assertRaises(TypeError, isinstance, E, 'foo')
741        self.assertRaises(TypeError, isinstance)
742
743    def test_issubclass(self):
744        class C:
745            pass
746        class D(C):
747            pass
748        class E:
749            pass
750        c = C()
751        d = D()
752        e = E()
753        self.assertTrue(issubclass(D, C))
754        self.assertTrue(issubclass(C, C))
755        self.assertTrue(not issubclass(C, D))
756        self.assertRaises(TypeError, issubclass, 'foo', E)
757        self.assertRaises(TypeError, issubclass, E, 'foo')
758        self.assertRaises(TypeError, issubclass)
759
760    def test_len(self):
761        self.assertEqual(len('123'), 3)
762        self.assertEqual(len(()), 0)
763        self.assertEqual(len((1, 2, 3, 4)), 4)
764        self.assertEqual(len([1, 2, 3, 4]), 4)
765        self.assertEqual(len({}), 0)
766        self.assertEqual(len({'a':1, 'b': 2}), 2)
767        class BadSeq:
768            def __len__(self):
769                raise ValueError
770        self.assertRaises(ValueError, len, BadSeq())
771        self.assertRaises(TypeError, len, 2)
772        class ClassicStyle: pass
773        class NewStyle(object): pass
774        self.assertRaises(AttributeError, len, ClassicStyle())
775        self.assertRaises(TypeError, len, NewStyle())
776
777    def test_map(self):
778        self.assertEqual(
779            map(None, 'hello world'),
780            ['h','e','l','l','o',' ','w','o','r','l','d']
781        )
782        self.assertEqual(
783            map(None, 'abcd', 'efg'),
784            [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', None)]
785        )
786        self.assertEqual(
787            map(None, range(10)),
788            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
789        )
790        self.assertEqual(
791            map(lambda x: x*x, range(1,4)),
792            [1, 4, 9]
793        )
794        try:
795            from math import sqrt
796        except ImportError:
797            def sqrt(x):
798                return pow(x, 0.5)
799        self.assertEqual(
800            map(lambda x: map(sqrt,x), [[16, 4], [81, 9]]),
801            [[4.0, 2.0], [9.0, 3.0]]
802        )
803        self.assertEqual(
804            map(lambda x, y: x+y, [1,3,2], [9,1,4]),
805            [10, 4, 6]
806        )
807
808        def plus(*v):
809            accu = 0
810            for i in v: accu = accu + i
811            return accu
812        self.assertEqual(
813            map(plus, [1, 3, 7]),
814            [1, 3, 7]
815        )
816        self.assertEqual(
817            map(plus, [1, 3, 7], [4, 9, 2]),
818            [1+4, 3+9, 7+2]
819        )
820        self.assertEqual(
821            map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]),
822            [1+4+1, 3+9+1, 7+2+0]
823        )
824        self.assertEqual(
825            map(None, Squares(10)),
826            [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
827        )
828        self.assertEqual(
829            map(int, Squares(10)),
830            [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
831        )
832        self.assertEqual(
833            map(None, Squares(3), Squares(2)),
834            [(0,0), (1,1), (4,None)]
835        )
836        self.assertEqual(
837            map(max, Squares(3), Squares(2)),
838            [0, 1, 4]
839        )
840        self.assertRaises(TypeError, map)
841        self.assertRaises(TypeError, map, lambda x: x, 42)
842        self.assertEqual(map(None, [42]), [42])
843        class BadSeq:
844            def __getitem__(self, index):
845                raise ValueError
846        self.assertRaises(ValueError, map, lambda x: x, BadSeq())
847        def badfunc(x):
848            raise RuntimeError
849        self.assertRaises(RuntimeError, map, badfunc, range(5))
850
851    def test_max(self):
852        self.assertEqual(max('123123'), '3')
853        self.assertEqual(max(1, 2, 3), 3)
854        self.assertEqual(max((1, 2, 3, 1, 2, 3)), 3)
855        self.assertEqual(max([1, 2, 3, 1, 2, 3]), 3)
856
857        self.assertEqual(max(1, 2L, 3.0), 3.0)
858        self.assertEqual(max(1L, 2.0, 3), 3)
859        self.assertEqual(max(1.0, 2, 3L), 3L)
860
861        for stmt in (
862            "max(key=int)",                 # no args
863            "max(1, key=int)",              # single arg not iterable
864            "max(1, 2, keystone=int)",      # wrong keyword
865            "max(1, 2, key=int, abc=int)",  # two many keywords
866            "max(1, 2, key=1)",             # keyfunc is not callable
867            ):
868            try:
869                exec(stmt) in globals()
870            except TypeError:
871                pass
872            else:
873                self.fail(stmt)
874
875        self.assertEqual(max((1,), key=neg), 1)     # one elem iterable
876        self.assertEqual(max((1,2), key=neg), 1)    # two elem iterable
877        self.assertEqual(max(1, 2, key=neg), 1)     # two elems
878
879        data = [random.randrange(200) for i in range(100)]
880        keys = dict((elem, random.randrange(50)) for elem in data)
881        f = keys.__getitem__
882        self.assertEqual(max(data, key=f),
883                         sorted(reversed(data), key=f)[-1])
884
885    def test_min(self):
886        self.assertEqual(min('123123'), '1')
887        self.assertEqual(min(1, 2, 3), 1)
888        self.assertEqual(min((1, 2, 3, 1, 2, 3)), 1)
889        self.assertEqual(min([1, 2, 3, 1, 2, 3]), 1)
890
891        self.assertEqual(min(1, 2L, 3.0), 1)
892        self.assertEqual(min(1L, 2.0, 3), 1L)
893        self.assertEqual(min(1.0, 2, 3L), 1.0)
894
895        self.assertRaises(TypeError, min)
896        self.assertRaises(TypeError, min, 42)
897        self.assertRaises(ValueError, min, ())
898        class BadSeq:
899            def __getitem__(self, index):
900                raise ValueError
901        self.assertRaises(ValueError, min, BadSeq())
902        class BadNumber:
903            def __cmp__(self, other):
904                raise ValueError
905        self.assertRaises(ValueError, min, (42, BadNumber()))
906
907        for stmt in (
908            "min(key=int)",                 # no args
909            "min(1, key=int)",              # single arg not iterable
910            "min(1, 2, keystone=int)",      # wrong keyword
911            "min(1, 2, key=int, abc=int)",  # two many keywords
912            "min(1, 2, key=1)",             # keyfunc is not callable
913            ):
914            try:
915                exec(stmt) in globals()
916            except TypeError:
917                pass
918            else:
919                self.fail(stmt)
920
921        self.assertEqual(min((1,), key=neg), 1)     # one elem iterable
922        self.assertEqual(min((1,2), key=neg), 2)    # two elem iterable
923        self.assertEqual(min(1, 2, key=neg), 2)     # two elems
924
925        data = [random.randrange(200) for i in range(100)]
926        keys = dict((elem, random.randrange(50)) for elem in data)
927        f = keys.__getitem__
928        self.assertEqual(min(data, key=f),
929                         sorted(data, key=f)[0])
930
931    def test_next(self):
932        it = iter(range(2))
933        self.assertEqual(next(it), 0)
934        self.assertEqual(next(it), 1)
935        self.assertRaises(StopIteration, next, it)
936        self.assertRaises(StopIteration, next, it)
937        self.assertEqual(next(it, 42), 42)
938
939        class Iter(object):
940            def __iter__(self):
941                return self
942            def next(self):
943                raise StopIteration
944
945        it = iter(Iter())
946        self.assertEqual(next(it, 42), 42)
947        self.assertRaises(StopIteration, next, it)
948
949        def gen():
950            yield 1
951            return
952
953        it = gen()
954        self.assertEqual(next(it), 1)
955        self.assertRaises(StopIteration, next, it)
956        self.assertEqual(next(it, 42), 42)
957
958    def test_oct(self):
959        self.assertEqual(oct(100), '0144')
960        self.assertEqual(oct(100L), '0144L')
961        self.assertEqual(oct(-100), '-0144')
962        self.assertEqual(oct(-100L), '-0144L')
963        self.assertRaises(TypeError, oct, ())
964
965    def write_testfile(self):
966        # NB the first 4 lines are also used to test input and raw_input, below
967        fp = open(TESTFN, 'w')
968        try:
969            fp.write('1+1\n')
970            fp.write('1+1\n')
971            fp.write('The quick brown fox jumps over the lazy dog')
972            fp.write('.\n')
973            fp.write('Dear John\n')
974            fp.write('XXX'*100)
975            fp.write('YYY'*100)
976        finally:
977            fp.close()
978
979    def test_open(self):
980        self.write_testfile()
981        fp = open(TESTFN, 'r')
982        try:
983            self.assertEqual(fp.readline(4), '1+1\n')
984            self.assertEqual(fp.readline(4), '1+1\n')
985            self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n')
986            self.assertEqual(fp.readline(4), 'Dear')
987            self.assertEqual(fp.readline(100), ' John\n')
988            self.assertEqual(fp.read(300), 'XXX'*100)
989            self.assertEqual(fp.read(1000), 'YYY'*100)
990        finally:
991            fp.close()
992        unlink(TESTFN)
993
994    def test_ord(self):
995        self.assertEqual(ord(' '), 32)
996        self.assertEqual(ord('A'), 65)
997        self.assertEqual(ord('a'), 97)
998        if have_unicode:
999            self.assertEqual(ord(unichr(sys.maxunicode)), sys.maxunicode)
1000        self.assertRaises(TypeError, ord, 42)
1001        if have_unicode:
1002            self.assertRaises(TypeError, ord, unicode("12"))
1003
1004    def test_pow(self):
1005        self.assertEqual(pow(0,0), 1)
1006        self.assertEqual(pow(0,1), 0)
1007        self.assertEqual(pow(1,0), 1)
1008        self.assertEqual(pow(1,1), 1)
1009
1010        self.assertEqual(pow(2,0), 1)
1011        self.assertEqual(pow(2,10), 1024)
1012        self.assertEqual(pow(2,20), 1024*1024)
1013        self.assertEqual(pow(2,30), 1024*1024*1024)
1014
1015        self.assertEqual(pow(-2,0), 1)
1016        self.assertEqual(pow(-2,1), -2)
1017        self.assertEqual(pow(-2,2), 4)
1018        self.assertEqual(pow(-2,3), -8)
1019
1020        self.assertEqual(pow(0L,0), 1)
1021        self.assertEqual(pow(0L,1), 0)
1022        self.assertEqual(pow(1L,0), 1)
1023        self.assertEqual(pow(1L,1), 1)
1024
1025        self.assertEqual(pow(2L,0), 1)
1026        self.assertEqual(pow(2L,10), 1024)
1027        self.assertEqual(pow(2L,20), 1024*1024)
1028        self.assertEqual(pow(2L,30), 1024*1024*1024)
1029
1030        self.assertEqual(pow(-2L,0), 1)
1031        self.assertEqual(pow(-2L,1), -2)
1032        self.assertEqual(pow(-2L,2), 4)
1033        self.assertEqual(pow(-2L,3), -8)
1034
1035        self.assertAlmostEqual(pow(0.,0), 1.)
1036        self.assertAlmostEqual(pow(0.,1), 0.)
1037        self.assertAlmostEqual(pow(1.,0), 1.)
1038        self.assertAlmostEqual(pow(1.,1), 1.)
1039
1040        self.assertAlmostEqual(pow(2.,0), 1.)
1041        self.assertAlmostEqual(pow(2.,10), 1024.)
1042        self.assertAlmostEqual(pow(2.,20), 1024.*1024.)
1043        self.assertAlmostEqual(pow(2.,30), 1024.*1024.*1024.)
1044
1045        self.assertAlmostEqual(pow(-2.,0), 1.)
1046        self.assertAlmostEqual(pow(-2.,1), -2.)
1047        self.assertAlmostEqual(pow(-2.,2), 4.)
1048        self.assertAlmostEqual(pow(-2.,3), -8.)
1049
1050        for x in 2, 2L, 2.0:
1051            for y in 10, 10L, 10.0:
1052                for z in 1000, 1000L, 1000.0:
1053                    if isinstance(x, float) or \
1054                       isinstance(y, float) or \
1055                       isinstance(z, float):
1056                        self.assertRaises(TypeError, pow, x, y, z)
1057                    else:
1058                        self.assertAlmostEqual(pow(x, y, z), 24.0)
1059
1060        self.assertRaises(TypeError, pow, -1, -2, 3)
1061        self.assertRaises(ValueError, pow, 1, 2, 0)
1062        self.assertRaises(TypeError, pow, -1L, -2L, 3L)
1063        self.assertRaises(ValueError, pow, 1L, 2L, 0L)
1064        # Will return complex in 3.0:
1065        self.assertRaises(ValueError, pow, -342.43, 0.234)
1066
1067        self.assertRaises(TypeError, pow)
1068
1069    def test_range(self):
1070        self.assertEqual(range(3), [0, 1, 2])
1071        self.assertEqual(range(1, 5), [1, 2, 3, 4])
1072        self.assertEqual(range(0), [])
1073        self.assertEqual(range(-3), [])
1074        self.assertEqual(range(1, 10, 3), [1, 4, 7])
1075        self.assertEqual(range(5, -5, -3), [5, 2, -1, -4])
1076
1077        # Now test range() with longs
1078        self.assertEqual(range(-2**100), [])
1079        self.assertEqual(range(0, -2**100), [])
1080        self.assertEqual(range(0, 2**100, -1), [])
1081        self.assertEqual(range(0, 2**100, -1), [])
1082
1083        a = long(10 * sys.maxint)
1084        b = long(100 * sys.maxint)
1085        c = long(50 * sys.maxint)
1086
1087        self.assertEqual(range(a, a+2), [a, a+1])
1088        self.assertEqual(range(a+2, a, -1L), [a+2, a+1])
1089        self.assertEqual(range(a+4, a, -2), [a+4, a+2])
1090
1091        seq = range(a, b, c)
1092        self.assertIn(a, seq)
1093        self.assertNotIn(b, seq)
1094        self.assertEqual(len(seq), 2)
1095
1096        seq = range(b, a, -c)
1097        self.assertIn(b, seq)
1098        self.assertNotIn(a, seq)
1099        self.assertEqual(len(seq), 2)
1100
1101        seq = range(-a, -b, -c)
1102        self.assertIn(-a, seq)
1103        self.assertNotIn(-b, seq)
1104        self.assertEqual(len(seq), 2)
1105
1106        self.assertRaises(TypeError, range)
1107        self.assertRaises(TypeError, range, 1, 2, 3, 4)
1108        self.assertRaises(ValueError, range, 1, 2, 0)
1109        self.assertRaises(ValueError, range, a, a + 1, long(0))
1110
1111        class badzero(int):
1112            def __cmp__(self, other):
1113                raise RuntimeError
1114            __hash__ = None # Invalid cmp makes this unhashable
1115        self.assertRaises(RuntimeError, range, a, a + 1, badzero(1))
1116
1117        # Reject floats.
1118        self.assertRaises(TypeError, range, 1., 1., 1.)
1119        self.assertRaises(TypeError, range, 1e100, 1e101, 1e101)
1120
1121        self.assertRaises(TypeError, range, 0, "spam")
1122        self.assertRaises(TypeError, range, 0, 42, "spam")
1123
1124        self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint)
1125        self.assertRaises(OverflowError, range, 0, 2*sys.maxint)
1126
1127        bignum = 2*sys.maxint
1128        smallnum = 42
1129        # Old-style user-defined class with __int__ method
1130        class I0:
1131            def __init__(self, n):
1132                self.n = int(n)
1133            def __int__(self):
1134                return self.n
1135        self.assertEqual(range(I0(bignum), I0(bignum + 1)), [bignum])
1136        self.assertEqual(range(I0(smallnum), I0(smallnum + 1)), [smallnum])
1137
1138        # New-style user-defined class with __int__ method
1139        class I1(object):
1140            def __init__(self, n):
1141                self.n = int(n)
1142            def __int__(self):
1143                return self.n
1144        self.assertEqual(range(I1(bignum), I1(bignum + 1)), [bignum])
1145        self.assertEqual(range(I1(smallnum), I1(smallnum + 1)), [smallnum])
1146
1147        # New-style user-defined class with failing __int__ method
1148        class IX(object):
1149            def __int__(self):
1150                raise RuntimeError
1151        self.assertRaises(RuntimeError, range, IX())
1152
1153        # New-style user-defined class with invalid __int__ method
1154        class IN(object):
1155            def __int__(self):
1156                return "not a number"
1157        self.assertRaises(TypeError, range, IN())
1158
1159        # Exercise various combinations of bad arguments, to check
1160        # refcounting logic
1161        self.assertRaises(TypeError, range, 0.0)
1162
1163        self.assertRaises(TypeError, range, 0, 0.0)
1164        self.assertRaises(TypeError, range, 0.0, 0)
1165        self.assertRaises(TypeError, range, 0.0, 0.0)
1166
1167        self.assertRaises(TypeError, range, 0, 0, 1.0)
1168        self.assertRaises(TypeError, range, 0, 0.0, 1)
1169        self.assertRaises(TypeError, range, 0, 0.0, 1.0)
1170        self.assertRaises(TypeError, range, 0.0, 0, 1)
1171        self.assertRaises(TypeError, range, 0.0, 0, 1.0)
1172        self.assertRaises(TypeError, range, 0.0, 0.0, 1)
1173        self.assertRaises(TypeError, range, 0.0, 0.0, 1.0)
1174
1175
1176
1177    def test_input_and_raw_input(self):
1178        self.write_testfile()
1179        fp = open(TESTFN, 'r')
1180        savestdin = sys.stdin
1181        savestdout = sys.stdout # Eats the echo
1182        try:
1183            sys.stdin = fp
1184            sys.stdout = BitBucket()
1185            self.assertEqual(input(), 2)
1186            self.assertEqual(input('testing\n'), 2)
1187            self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
1188            self.assertEqual(raw_input('testing\n'), 'Dear John')
1189
1190            # SF 1535165: don't segfault on closed stdin
1191            # sys.stdout must be a regular file for triggering
1192            sys.stdout = savestdout
1193            sys.stdin.close()
1194            self.assertRaises(ValueError, input)
1195
1196            sys.stdout = BitBucket()
1197            sys.stdin = cStringIO.StringIO("NULL\0")
1198            self.assertRaises(TypeError, input, 42, 42)
1199            sys.stdin = cStringIO.StringIO("    'whitespace'")
1200            self.assertEqual(input(), 'whitespace')
1201            sys.stdin = cStringIO.StringIO()
1202            self.assertRaises(EOFError, input)
1203
1204            # SF 876178: make sure input() respect future options.
1205            sys.stdin = cStringIO.StringIO('1/2')
1206            sys.stdout = cStringIO.StringIO()
1207            exec compile('print input()', 'test_builtin_tmp', 'exec')
1208            sys.stdin.seek(0, 0)
1209            exec compile('from __future__ import division;print input()',
1210                         'test_builtin_tmp', 'exec')
1211            sys.stdin.seek(0, 0)
1212            exec compile('print input()', 'test_builtin_tmp', 'exec')
1213            # The result we expect depends on whether new division semantics
1214            # are already in effect.
1215            if 1/2 == 0:
1216                # This test was compiled with old semantics.
1217                expected = ['0', '0.5', '0']
1218            else:
1219                # This test was compiled with new semantics (e.g., -Qnew
1220                # was given on the command line.
1221                expected = ['0.5', '0.5', '0.5']
1222            self.assertEqual(sys.stdout.getvalue().splitlines(), expected)
1223
1224            del sys.stdout
1225            self.assertRaises(RuntimeError, input, 'prompt')
1226            del sys.stdin
1227            self.assertRaises(RuntimeError, input, 'prompt')
1228        finally:
1229            sys.stdin = savestdin
1230            sys.stdout = savestdout
1231            fp.close()
1232            unlink(TESTFN)
1233
1234    def test_reduce(self):
1235        add = lambda x, y: x+y
1236        self.assertEqual(reduce(add, ['a', 'b', 'c'], ''), 'abc')
1237        self.assertEqual(
1238            reduce(add, [['a', 'c'], [], ['d', 'w']], []),
1239            ['a','c','d','w']
1240        )
1241        self.assertEqual(reduce(lambda x, y: x*y, range(2,8), 1), 5040)
1242        self.assertEqual(
1243            reduce(lambda x, y: x*y, range(2,21), 1L),
1244            2432902008176640000L
1245        )
1246        self.assertEqual(reduce(add, Squares(10)), 285)
1247        self.assertEqual(reduce(add, Squares(10), 0), 285)
1248        self.assertEqual(reduce(add, Squares(0), 0), 0)
1249        self.assertRaises(TypeError, reduce)
1250        self.assertRaises(TypeError, reduce, 42)
1251        self.assertRaises(TypeError, reduce, 42, 42)
1252        self.assertRaises(TypeError, reduce, 42, 42, 42)
1253        self.assertRaises(TypeError, reduce, None, range(5))
1254        self.assertRaises(TypeError, reduce, add, 42)
1255        self.assertEqual(reduce(42, "1"), "1") # func is never called with one item
1256        self.assertEqual(reduce(42, "", "1"), "1") # func is never called with one item
1257        self.assertRaises(TypeError, reduce, 42, (42, 42))
1258        self.assertRaises(TypeError, reduce, add, []) # arg 2 must not be empty sequence with no initial value
1259        self.assertRaises(TypeError, reduce, add, "")
1260        self.assertRaises(TypeError, reduce, add, ())
1261        self.assertEqual(reduce(add, [], None), None)
1262        self.assertEqual(reduce(add, [], 42), 42)
1263
1264        class BadSeq:
1265            def __getitem__(self, index):
1266                raise ValueError
1267        self.assertRaises(ValueError, reduce, 42, BadSeq())
1268
1269    def test_reload(self):
1270        import marshal
1271        reload(marshal)
1272        import string
1273        reload(string)
1274        ## import sys
1275        ## self.assertRaises(ImportError, reload, sys)
1276
1277    def test_repr(self):
1278        self.assertEqual(repr(''), '\'\'')
1279        self.assertEqual(repr(0), '0')
1280        self.assertEqual(repr(0L), '0L')
1281        self.assertEqual(repr(()), '()')
1282        self.assertEqual(repr([]), '[]')
1283        self.assertEqual(repr({}), '{}')
1284        a = []
1285        a.append(a)
1286        self.assertEqual(repr(a), '[[...]]')
1287        a = {}
1288        a[0] = a
1289        self.assertEqual(repr(a), '{0: {...}}')
1290
1291    def test_round(self):
1292        self.assertEqual(round(0.0), 0.0)
1293        self.assertEqual(type(round(0.0)), float)  # Will be int in 3.0.
1294        self.assertEqual(round(1.0), 1.0)
1295        self.assertEqual(round(10.0), 10.0)
1296        self.assertEqual(round(1000000000.0), 1000000000.0)
1297        self.assertEqual(round(1e20), 1e20)
1298
1299        self.assertEqual(round(-1.0), -1.0)
1300        self.assertEqual(round(-10.0), -10.0)
1301        self.assertEqual(round(-1000000000.0), -1000000000.0)
1302        self.assertEqual(round(-1e20), -1e20)
1303
1304        self.assertEqual(round(0.1), 0.0)
1305        self.assertEqual(round(1.1), 1.0)
1306        self.assertEqual(round(10.1), 10.0)
1307        self.assertEqual(round(1000000000.1), 1000000000.0)
1308
1309        self.assertEqual(round(-1.1), -1.0)
1310        self.assertEqual(round(-10.1), -10.0)
1311        self.assertEqual(round(-1000000000.1), -1000000000.0)
1312
1313        self.assertEqual(round(0.9), 1.0)
1314        self.assertEqual(round(9.9), 10.0)
1315        self.assertEqual(round(999999999.9), 1000000000.0)
1316
1317        self.assertEqual(round(-0.9), -1.0)
1318        self.assertEqual(round(-9.9), -10.0)
1319        self.assertEqual(round(-999999999.9), -1000000000.0)
1320
1321        self.assertEqual(round(-8.0, -1), -10.0)
1322        self.assertEqual(type(round(-8.0, -1)), float)
1323
1324        self.assertEqual(type(round(-8.0, 0)), float)
1325        self.assertEqual(type(round(-8.0, 1)), float)
1326
1327        # Check half rounding behaviour.
1328        self.assertEqual(round(5.5), 6)
1329        self.assertEqual(round(6.5), 7)
1330        self.assertEqual(round(-5.5), -6)
1331        self.assertEqual(round(-6.5), -7)
1332
1333        # Check behavior on ints
1334        self.assertEqual(round(0), 0)
1335        self.assertEqual(round(8), 8)
1336        self.assertEqual(round(-8), -8)
1337        self.assertEqual(type(round(0)), float)  # Will be int in 3.0.
1338        self.assertEqual(type(round(-8, -1)), float)
1339        self.assertEqual(type(round(-8, 0)), float)
1340        self.assertEqual(type(round(-8, 1)), float)
1341
1342        # test new kwargs
1343        self.assertEqual(round(number=-8.0, ndigits=-1), -10.0)
1344
1345        self.assertRaises(TypeError, round)
1346
1347        # test generic rounding delegation for reals
1348        class TestRound(object):
1349            def __float__(self):
1350                return 23.0
1351
1352        class TestNoRound(object):
1353            pass
1354
1355        self.assertEqual(round(TestRound()), 23)
1356
1357        self.assertRaises(TypeError, round, 1, 2, 3)
1358        self.assertRaises(TypeError, round, TestNoRound())
1359
1360        t = TestNoRound()
1361        t.__float__ = lambda *args: args
1362        self.assertRaises(TypeError, round, t)
1363        self.assertRaises(TypeError, round, t, 0)
1364
1365    # Some versions of glibc for alpha have a bug that affects
1366    # float -> integer rounding (floor, ceil, rint, round) for
1367    # values in the range [2**52, 2**53).  See:
1368    #
1369    #   http://sources.redhat.com/bugzilla/show_bug.cgi?id=5350
1370    #
1371    # We skip this test on Linux/alpha if it would fail.
1372    linux_alpha = (platform.system().startswith('Linux') and
1373                   platform.machine().startswith('alpha'))
1374    system_round_bug = round(5e15+1) != 5e15+1
1375    @unittest.skipIf(linux_alpha and system_round_bug,
1376                     "test will fail;  failure is probably due to a "
1377                     "buggy system round function")
1378    def test_round_large(self):
1379        # Issue #1869: integral floats should remain unchanged
1380        self.assertEqual(round(5e15-1), 5e15-1)
1381        self.assertEqual(round(5e15), 5e15)
1382        self.assertEqual(round(5e15+1), 5e15+1)
1383        self.assertEqual(round(5e15+2), 5e15+2)
1384        self.assertEqual(round(5e15+3), 5e15+3)
1385
1386    def test_setattr(self):
1387        setattr(sys, 'spam', 1)
1388        self.assertEqual(sys.spam, 1)
1389        self.assertRaises(TypeError, setattr, sys, 1, 'spam')
1390        self.assertRaises(TypeError, setattr)
1391
1392    def test_sum(self):
1393        self.assertEqual(sum([]), 0)
1394        self.assertEqual(sum(range(2,8)), 27)
1395        self.assertEqual(sum(iter(range(2,8))), 27)
1396        self.assertEqual(sum(Squares(10)), 285)
1397        self.assertEqual(sum(iter(Squares(10))), 285)
1398        self.assertEqual(sum([[1], [2], [3]], []), [1, 2, 3])
1399
1400        self.assertRaises(TypeError, sum)
1401        self.assertRaises(TypeError, sum, 42)
1402        self.assertRaises(TypeError, sum, ['a', 'b', 'c'])
1403        self.assertRaises(TypeError, sum, ['a', 'b', 'c'], '')
1404        self.assertRaises(TypeError, sum, [[1], [2], [3]])
1405        self.assertRaises(TypeError, sum, [{2:3}])
1406        self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3})
1407
1408        class BadSeq:
1409            def __getitem__(self, index):
1410                raise ValueError
1411        self.assertRaises(ValueError, sum, BadSeq())
1412
1413        empty = []
1414        sum(([x] for x in range(10)), empty)
1415        self.assertEqual(empty, [])
1416
1417    def test_type(self):
1418        self.assertEqual(type(''),  type('123'))
1419        self.assertNotEqual(type(''), type(()))
1420
1421    def test_unichr(self):
1422        if have_unicode:
1423            self.assertEqual(unichr(32), unicode(' '))
1424            self.assertEqual(unichr(65), unicode('A'))
1425            self.assertEqual(unichr(97), unicode('a'))
1426            self.assertEqual(
1427                unichr(sys.maxunicode),
1428                unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape')
1429            )
1430            self.assertRaises(ValueError, unichr, sys.maxunicode+1)
1431            self.assertRaises(TypeError, unichr)
1432            self.assertRaises((OverflowError, ValueError), unichr, 2**32)
1433
1434    # We don't want self in vars(), so these are static methods
1435
1436    @staticmethod
1437    def get_vars_f0():
1438        return vars()
1439
1440    @staticmethod
1441    def get_vars_f2():
1442        BuiltinTest.get_vars_f0()
1443        a = 1
1444        b = 2
1445        return vars()
1446
1447    class C_get_vars(object):
1448        def getDict(self):
1449            return {'a':2}
1450        __dict__ = property(fget=getDict)
1451
1452    def test_vars(self):
1453        self.assertEqual(set(vars()), set(dir()))
1454        import sys
1455        self.assertEqual(set(vars(sys)), set(dir(sys)))
1456        self.assertEqual(self.get_vars_f0(), {})
1457        self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
1458        self.assertRaises(TypeError, vars, 42, 42)
1459        self.assertRaises(TypeError, vars, 42)
1460        self.assertEqual(vars(self.C_get_vars()), {'a':2})
1461
1462    def test_zip(self):
1463        a = (1, 2, 3)
1464        b = (4, 5, 6)
1465        t = [(1, 4), (2, 5), (3, 6)]
1466        self.assertEqual(zip(a, b), t)
1467        b = [4, 5, 6]
1468        self.assertEqual(zip(a, b), t)
1469        b = (4, 5, 6, 7)
1470        self.assertEqual(zip(a, b), t)
1471        class I:
1472            def __getitem__(self, i):
1473                if i < 0 or i > 2: raise IndexError
1474                return i + 4
1475        self.assertEqual(zip(a, I()), t)
1476        self.assertEqual(zip(), [])
1477        self.assertEqual(zip(*[]), [])
1478        self.assertRaises(TypeError, zip, None)
1479        class G:
1480            pass
1481        self.assertRaises(TypeError, zip, a, G())
1482
1483        # Make sure zip doesn't try to allocate a billion elements for the
1484        # result list when one of its arguments doesn't say how long it is.
1485        # A MemoryError is the most likely failure mode.
1486        class SequenceWithoutALength:
1487            def __getitem__(self, i):
1488                if i == 5:
1489                    raise IndexError
1490                else:
1491                    return i
1492        self.assertEqual(
1493            zip(SequenceWithoutALength(), xrange(2**30)),
1494            list(enumerate(range(5)))
1495        )
1496
1497        class BadSeq:
1498            def __getitem__(self, i):
1499                if i == 5:
1500                    raise ValueError
1501                else:
1502                    return i
1503        self.assertRaises(ValueError, zip, BadSeq(), BadSeq())
1504
1505    def test_format(self):
1506        # Test the basic machinery of the format() builtin.  Don't test
1507        #  the specifics of the various formatters
1508        self.assertEqual(format(3, ''), '3')
1509
1510        # Returns some classes to use for various tests.  There's
1511        #  an old-style version, and a new-style version
1512        def classes_new():
1513            class A(object):
1514                def __init__(self, x):
1515                    self.x = x
1516                def __format__(self, format_spec):
1517                    return str(self.x) + format_spec
1518            class DerivedFromA(A):
1519                pass
1520
1521            class Simple(object): pass
1522            class DerivedFromSimple(Simple):
1523                def __init__(self, x):
1524                    self.x = x
1525                def __format__(self, format_spec):
1526                    return str(self.x) + format_spec
1527            class DerivedFromSimple2(DerivedFromSimple): pass
1528            return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1529
1530        # In 3.0, classes_classic has the same meaning as classes_new
1531        def classes_classic():
1532            class A:
1533                def __init__(self, x):
1534                    self.x = x
1535                def __format__(self, format_spec):
1536                    return str(self.x) + format_spec
1537            class DerivedFromA(A):
1538                pass
1539
1540            class Simple: pass
1541            class DerivedFromSimple(Simple):
1542                def __init__(self, x):
1543                    self.x = x
1544                def __format__(self, format_spec):
1545                    return str(self.x) + format_spec
1546            class DerivedFromSimple2(DerivedFromSimple): pass
1547            return A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2
1548
1549        def class_test(A, DerivedFromA, DerivedFromSimple, DerivedFromSimple2):
1550            self.assertEqual(format(A(3), 'spec'), '3spec')
1551            self.assertEqual(format(DerivedFromA(4), 'spec'), '4spec')
1552            self.assertEqual(format(DerivedFromSimple(5), 'abc'), '5abc')
1553            self.assertEqual(format(DerivedFromSimple2(10), 'abcdef'),
1554                             '10abcdef')
1555
1556        class_test(*classes_new())
1557        class_test(*classes_classic())
1558
1559        def empty_format_spec(value):
1560            # test that:
1561            #  format(x, '') == str(x)
1562            #  format(x) == str(x)
1563            self.assertEqual(format(value, ""), str(value))
1564            self.assertEqual(format(value), str(value))
1565
1566        # for builtin types, format(x, "") == str(x)
1567        empty_format_spec(17**13)
1568        empty_format_spec(1.0)
1569        empty_format_spec(3.1415e104)
1570        empty_format_spec(-3.1415e104)
1571        empty_format_spec(3.1415e-104)
1572        empty_format_spec(-3.1415e-104)
1573        empty_format_spec(object)
1574        empty_format_spec(None)
1575
1576        # TypeError because self.__format__ returns the wrong type
1577        class BadFormatResult:
1578            def __format__(self, format_spec):
1579                return 1.0
1580        self.assertRaises(TypeError, format, BadFormatResult(), "")
1581
1582        # TypeError because format_spec is not unicode or str
1583        self.assertRaises(TypeError, format, object(), 4)
1584        self.assertRaises(TypeError, format, object(), object())
1585
1586        # tests for object.__format__ really belong elsewhere, but
1587        #  there's no good place to put them
1588        x = object().__format__('')
1589        self.assertTrue(x.startswith('<object object at'))
1590
1591        # first argument to object.__format__ must be string
1592        self.assertRaises(TypeError, object().__format__, 3)
1593        self.assertRaises(TypeError, object().__format__, object())
1594        self.assertRaises(TypeError, object().__format__, None)
1595
1596        # --------------------------------------------------------------------
1597        # Issue #7994: object.__format__ with a non-empty format string is
1598        #  pending deprecated
1599        def test_deprecated_format_string(obj, fmt_str, should_raise_warning):
1600            with warnings.catch_warnings(record=True) as w:
1601                warnings.simplefilter("always", PendingDeprecationWarning)
1602                format(obj, fmt_str)
1603            if should_raise_warning:
1604                self.assertEqual(len(w), 1)
1605                self.assertIsInstance(w[0].message, PendingDeprecationWarning)
1606                self.assertIn('object.__format__ with a non-empty format '
1607                              'string', str(w[0].message))
1608            else:
1609                self.assertEqual(len(w), 0)
1610
1611        fmt_strs = ['', 's', u'', u's']
1612
1613        class A:
1614            def __format__(self, fmt_str):
1615                return format('', fmt_str)
1616
1617        for fmt_str in fmt_strs:
1618            test_deprecated_format_string(A(), fmt_str, False)
1619
1620        class B:
1621            pass
1622
1623        class C(object):
1624            pass
1625
1626        for cls in [object, B, C]:
1627            for fmt_str in fmt_strs:
1628                test_deprecated_format_string(cls(), fmt_str, len(fmt_str) != 0)
1629        # --------------------------------------------------------------------
1630
1631        # make sure we can take a subclass of str as a format spec
1632        class DerivedFromStr(str): pass
1633        self.assertEqual(format(0, DerivedFromStr('10')), '         0')
1634
1635    def test_bin(self):
1636        self.assertEqual(bin(0), '0b0')
1637        self.assertEqual(bin(1), '0b1')
1638        self.assertEqual(bin(-1), '-0b1')
1639        self.assertEqual(bin(2**65), '0b1' + '0' * 65)
1640        self.assertEqual(bin(2**65-1), '0b' + '1' * 65)
1641        self.assertEqual(bin(-(2**65)), '-0b1' + '0' * 65)
1642        self.assertEqual(bin(-(2**65-1)), '-0b' + '1' * 65)
1643
1644    def test_bytearray_translate(self):
1645        x = bytearray("abc")
1646        self.assertRaises(ValueError, x.translate, "1", 1)
1647        self.assertRaises(TypeError, x.translate, "1"*256, 1)
1648
1649class TestSorted(unittest.TestCase):
1650
1651    def test_basic(self):
1652        data = range(100)
1653        copy = data[:]
1654        random.shuffle(copy)
1655        self.assertEqual(data, sorted(copy))
1656        self.assertNotEqual(data, copy)
1657
1658        data.reverse()
1659        random.shuffle(copy)
1660        self.assertEqual(data, sorted(copy, cmp=lambda x, y: cmp(y,x)))
1661        self.assertNotEqual(data, copy)
1662        random.shuffle(copy)
1663        self.assertEqual(data, sorted(copy, key=lambda x: -x))
1664        self.assertNotEqual(data, copy)
1665        random.shuffle(copy)
1666        self.assertEqual(data, sorted(copy, reverse=1))
1667        self.assertNotEqual(data, copy)
1668
1669    def test_inputtypes(self):
1670        s = 'abracadabra'
1671        types = [list, tuple]
1672        if have_unicode:
1673            types.insert(0, unicode)
1674        for T in types:
1675            self.assertEqual(sorted(s), sorted(T(s)))
1676
1677        s = ''.join(dict.fromkeys(s).keys())  # unique letters only
1678        types = [set, frozenset, list, tuple, dict.fromkeys]
1679        if have_unicode:
1680            types.insert(0, unicode)
1681        for T in types:
1682            self.assertEqual(sorted(s), sorted(T(s)))
1683
1684    def test_baddecorator(self):
1685        data = 'The quick Brown fox Jumped over The lazy Dog'.split()
1686        self.assertRaises(TypeError, sorted, data, None, lambda x,y: 0)
1687
1688def _run_unittest(*args):
1689    with check_py3k_warnings(
1690            (".+ not supported in 3.x", DeprecationWarning),
1691            (".+ is renamed to imp.reload", DeprecationWarning),
1692            ("classic int division", DeprecationWarning)):
1693        run_unittest(*args)
1694
1695def test_main(verbose=None):
1696    test_classes = (BuiltinTest, TestSorted)
1697
1698    _run_unittest(*test_classes)
1699
1700    # verify reference counting
1701    if verbose and hasattr(sys, "gettotalrefcount"):
1702        import gc
1703        counts = [None] * 5
1704        for i in xrange(len(counts)):
1705            _run_unittest(*test_classes)
1706            gc.collect()
1707            counts[i] = sys.gettotalrefcount()
1708        print counts
1709
1710
1711if __name__ == "__main__":
1712    test_main(verbose=True)
1713