Ignore:
Timestamp:
Mar 19, 2014, 11:31:01 PM (11 years ago)
Author:
dmik
Message:

python: Merge vendor 2.7.6 to trunk.

Location:
python/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/trunk

  • python/trunk/Lib/test/test_functools.py

    r2 r391  
    11import functools
     2import sys
    23import unittest
    34from test import test_support
    45from weakref import proxy
     6import pickle
    57
    68@staticmethod
     
    1921    """capture all positional and keyword arguments"""
    2022    return args, kw
     23
     24def signature(part):
     25    """ return the signature of a partial object """
     26    return (part.func, part.args, part.keywords, part.__dict__)
    2127
    2228class TestPartial(unittest.TestCase):
     
    100106            expected = args + ('x',)
    101107            got, empty = p('x')
    102             self.failUnless(expected == got and empty == {})
     108            self.assertTrue(expected == got and empty == {})
    103109
    104110    def test_keyword(self):
     
    108114            expected = {'a':a,'x':None}
    109115            empty, got = p(x=None)
    110             self.failUnless(expected == got and empty == ())
     116            self.assertTrue(expected == got and empty == ())
    111117
    112118    def test_no_side_effects(self):
     
    114120        p = self.thetype(capture, 0, a=1)
    115121        args1, kw1 = p(1, b=2)
    116         self.failUnless(args1 == (0,1) and kw1 == {'a':1,'b':2})
     122        self.assertTrue(args1 == (0,1) and kw1 == {'a':1,'b':2})
    117123        args2, kw2 = p()
    118         self.failUnless(args2 == (0,) and kw2 == {'a':1})
     124        self.assertTrue(args2 == (0,) and kw2 == {'a':1})
    119125
    120126    def test_error_propagation(self):
    121127        def f(x, y):
    122             x / y
     128            x // y
    123129        self.assertRaises(ZeroDivisionError, self.thetype(f, 1, 0))
    124130        self.assertRaises(ZeroDivisionError, self.thetype(f, 1), 0)
     
    140146        self.assertEqual(join(data), '0123456789')
    141147
     148    def test_pickle(self):
     149        f = self.thetype(signature, 'asdf', bar=True)
     150        f.add_something_to__dict__ = True
     151        f_copy = pickle.loads(pickle.dumps(f))
     152        self.assertEqual(signature(f), signature(f_copy))
     153
     154    # Issue 6083: Reference counting bug
     155    def test_setstate_refcount(self):
     156        class BadSequence:
     157            def __len__(self):
     158                return 4
     159            def __getitem__(self, key):
     160                if key == 0:
     161                    return max
     162                elif key == 1:
     163                    return tuple(range(1000000))
     164                elif key in (2, 3):
     165                    return {}
     166                raise IndexError
     167
     168        f = self.thetype(object)
     169        self.assertRaises(SystemError, f.__setstate__, BadSequence())
     170
    142171class PartialSubclass(functools.partial):
    143172    pass
     
    147176    thetype = PartialSubclass
    148177
    149 
    150178class TestPythonPartial(TestPartial):
    151179
    152180    thetype = PythonPartial
     181
     182    # the python version isn't picklable
     183    def test_pickle(self): pass
     184    def test_setstate_refcount(self): pass
    153185
    154186class TestUpdateWrapper(unittest.TestCase):
     
    159191        # Check attributes were assigned
    160192        for name in assigned:
    161             self.failUnless(getattr(wrapper, name) is getattr(wrapped, name))
     193            self.assertTrue(getattr(wrapper, name) is getattr(wrapped, name))
    162194        # Check attributes were updated
    163195        for name in updated:
     
    165197            wrapped_attr = getattr(wrapped, name)
    166198            for key in wrapped_attr:
    167                 self.failUnless(wrapped_attr[key] is wrapper_attr[key])
     199                self.assertTrue(wrapped_attr[key] is wrapper_attr[key])
     200
     201    def _default_update(self):
     202        def f():
     203            """This is a test"""
     204            pass
     205        f.attr = 'This is also a test'
     206        def wrapper():
     207            pass
     208        functools.update_wrapper(wrapper, f)
     209        return wrapper, f
    168210
    169211    def test_default_update(self):
    170         def f():
    171             """This is a test"""
    172             pass
    173         f.attr = 'This is also a test'
    174         def wrapper():
    175             pass
    176         functools.update_wrapper(wrapper, f)
     212        wrapper, f = self._default_update()
    177213        self.check_wrapper(wrapper, f)
    178214        self.assertEqual(wrapper.__name__, 'f')
     215        self.assertEqual(wrapper.attr, 'This is also a test')
     216
     217    @unittest.skipIf(sys.flags.optimize >= 2,
     218                     "Docstrings are omitted with -O2 and above")
     219    def test_default_update_doc(self):
     220        wrapper, f = self._default_update()
    179221        self.assertEqual(wrapper.__doc__, 'This is a test')
    180         self.assertEqual(wrapper.attr, 'This is also a test')
    181222
    182223    def test_no_update(self):
     
    191232        self.assertEqual(wrapper.__name__, 'wrapper')
    192233        self.assertEqual(wrapper.__doc__, None)
    193         self.failIf(hasattr(wrapper, 'attr'))
     234        self.assertFalse(hasattr(wrapper, 'attr'))
    194235
    195236    def test_selective_update(self):
     
    210251        self.assertEqual(wrapper.dict_attr, f.dict_attr)
    211252
     253    @test_support.requires_docstrings
    212254    def test_builtin_update(self):
    213255        # Test for bug #1576241
     
    216258        functools.update_wrapper(wrapper, max)
    217259        self.assertEqual(wrapper.__name__, 'max')
    218         self.assert_(wrapper.__doc__.startswith('max('))
     260        self.assertTrue(wrapper.__doc__.startswith('max('))
    219261
    220262class TestWraps(TestUpdateWrapper):
    221263
    222     def test_default_update(self):
     264    def _default_update(self):
    223265        def f():
    224266            """This is a test"""
     
    229271            pass
    230272        self.check_wrapper(wrapper, f)
     273        return wrapper
     274
     275    def test_default_update(self):
     276        wrapper = self._default_update()
    231277        self.assertEqual(wrapper.__name__, 'f')
     278        self.assertEqual(wrapper.attr, 'This is also a test')
     279
     280    @unittest.skipIf(sys.flags.optimize >= 2,
     281                     "Docstrings are omitted with -O2 and above")
     282    def test_default_update_doc(self):
     283        wrapper = self._default_update()
    232284        self.assertEqual(wrapper.__doc__, 'This is a test')
    233         self.assertEqual(wrapper.attr, 'This is also a test')
    234285
    235286    def test_no_update(self):
     
    244295        self.assertEqual(wrapper.__name__, 'wrapper')
    245296        self.assertEqual(wrapper.__doc__, None)
    246         self.failIf(hasattr(wrapper, 'attr'))
     297        self.assertFalse(hasattr(wrapper, 'attr'))
    247298
    248299    def test_selective_update(self):
     
    307358        self.assertRaises(TypeError, reduce, 42, (42, 42))
    308359
    309 
    310 
     360class TestCmpToKey(unittest.TestCase):
     361    def test_cmp_to_key(self):
     362        def mycmp(x, y):
     363            return y - x
     364        self.assertEqual(sorted(range(5), key=functools.cmp_to_key(mycmp)),
     365                         [4, 3, 2, 1, 0])
     366
     367    def test_hash(self):
     368        def mycmp(x, y):
     369            return y - x
     370        key = functools.cmp_to_key(mycmp)
     371        k = key(10)
     372        self.assertRaises(TypeError, hash(k))
     373
     374class TestTotalOrdering(unittest.TestCase):
     375
     376    def test_total_ordering_lt(self):
     377        @functools.total_ordering
     378        class A:
     379            def __init__(self, value):
     380                self.value = value
     381            def __lt__(self, other):
     382                return self.value < other.value
     383            def __eq__(self, other):
     384                return self.value == other.value
     385        self.assertTrue(A(1) < A(2))
     386        self.assertTrue(A(2) > A(1))
     387        self.assertTrue(A(1) <= A(2))
     388        self.assertTrue(A(2) >= A(1))
     389        self.assertTrue(A(2) <= A(2))
     390        self.assertTrue(A(2) >= A(2))
     391
     392    def test_total_ordering_le(self):
     393        @functools.total_ordering
     394        class A:
     395            def __init__(self, value):
     396                self.value = value
     397            def __le__(self, other):
     398                return self.value <= other.value
     399            def __eq__(self, other):
     400                return self.value == other.value
     401        self.assertTrue(A(1) < A(2))
     402        self.assertTrue(A(2) > A(1))
     403        self.assertTrue(A(1) <= A(2))
     404        self.assertTrue(A(2) >= A(1))
     405        self.assertTrue(A(2) <= A(2))
     406        self.assertTrue(A(2) >= A(2))
     407
     408    def test_total_ordering_gt(self):
     409        @functools.total_ordering
     410        class A:
     411            def __init__(self, value):
     412                self.value = value
     413            def __gt__(self, other):
     414                return self.value > other.value
     415            def __eq__(self, other):
     416                return self.value == other.value
     417        self.assertTrue(A(1) < A(2))
     418        self.assertTrue(A(2) > A(1))
     419        self.assertTrue(A(1) <= A(2))
     420        self.assertTrue(A(2) >= A(1))
     421        self.assertTrue(A(2) <= A(2))
     422        self.assertTrue(A(2) >= A(2))
     423
     424    def test_total_ordering_ge(self):
     425        @functools.total_ordering
     426        class A:
     427            def __init__(self, value):
     428                self.value = value
     429            def __ge__(self, other):
     430                return self.value >= other.value
     431            def __eq__(self, other):
     432                return self.value == other.value
     433        self.assertTrue(A(1) < A(2))
     434        self.assertTrue(A(2) > A(1))
     435        self.assertTrue(A(1) <= A(2))
     436        self.assertTrue(A(2) >= A(1))
     437        self.assertTrue(A(2) <= A(2))
     438        self.assertTrue(A(2) >= A(2))
     439
     440    def test_total_ordering_no_overwrite(self):
     441        # new methods should not overwrite existing
     442        @functools.total_ordering
     443        class A(str):
     444            pass
     445        self.assertTrue(A("a") < A("b"))
     446        self.assertTrue(A("b") > A("a"))
     447        self.assertTrue(A("a") <= A("b"))
     448        self.assertTrue(A("b") >= A("a"))
     449        self.assertTrue(A("b") <= A("b"))
     450        self.assertTrue(A("b") >= A("b"))
     451
     452    def test_no_operations_defined(self):
     453        with self.assertRaises(ValueError):
     454            @functools.total_ordering
     455            class A:
     456                pass
     457
     458    def test_bug_10042(self):
     459        @functools.total_ordering
     460        class TestTO:
     461            def __init__(self, value):
     462                self.value = value
     463            def __eq__(self, other):
     464                if isinstance(other, TestTO):
     465                    return self.value == other.value
     466                return False
     467            def __lt__(self, other):
     468                if isinstance(other, TestTO):
     469                    return self.value < other.value
     470                raise TypeError
     471        with self.assertRaises(TypeError):
     472            TestTO(8) <= ()
    311473
    312474def test_main(verbose=None):
    313     import sys
    314475    test_classes = (
    315476        TestPartial,
     
    317478        TestPythonPartial,
    318479        TestUpdateWrapper,
     480        TestTotalOrdering,
    319481        TestWraps,
    320482        TestReduce,
Note: See TracChangeset for help on using the changeset viewer.