~pythonregexp2.7/python/issue2636-11

« back to all changes in this revision

Viewing changes to Lib/test/test_hash.py

  • Committer: Jeffrey C. "The TimeHorse" Jacobs
  • Date: 2008-09-21 13:47:31 UTC
  • mfrom: (39021.1.404 Regexp-2.7)
  • mto: This revision was merged to the branch mainline in revision 39030.
  • Revision ID: darklord@timehorse.com-20080921134731-rudomuzeh1b2tz1y
Merged in changes from the latest python source snapshot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# test the invariant that
2
2
#   iff a==b then hash(a)==hash(b)
3
3
#
 
4
# Also test that hash implementations are inherited as expected
4
5
 
5
6
import unittest
6
7
from test import test_support
 
8
from collections import Hashable
7
9
 
8
10
 
9
11
class HashEqualityTestCase(unittest.TestCase):
39
41
        self.same_hash(float(0.5), complex(0.5, 0.0))
40
42
 
41
43
 
 
44
_default_hash = object.__hash__
 
45
class DefaultHash(object): pass
 
46
 
 
47
_FIXED_HASH_VALUE = 42
 
48
class FixedHash(object):
 
49
    def __hash__(self):
 
50
        return _FIXED_HASH_VALUE
 
51
 
 
52
class OnlyEquality(object):
 
53
    def __eq__(self, other):
 
54
        return self is other
 
55
    # Trick to suppress Py3k warning in 2.x
 
56
    __hash__ = None
 
57
del OnlyEquality.__hash__
 
58
 
 
59
class OnlyInequality(object):
 
60
    def __ne__(self, other):
 
61
        return self is not other
 
62
 
 
63
class OnlyCmp(object):
 
64
    def __cmp__(self, other):
 
65
        return cmp(id(self), id(other))
 
66
    # Trick to suppress Py3k warning in 2.x
 
67
    __hash__ = None
 
68
del OnlyCmp.__hash__
 
69
 
 
70
class InheritedHashWithEquality(FixedHash, OnlyEquality): pass
 
71
class InheritedHashWithInequality(FixedHash, OnlyInequality): pass
 
72
class InheritedHashWithCmp(FixedHash, OnlyCmp): pass
 
73
 
 
74
class NoHash(object):
 
75
    __hash__ = None
 
76
 
 
77
class HashInheritanceTestCase(unittest.TestCase):
 
78
    default_expected = [object(),
 
79
                        DefaultHash(),
 
80
                        OnlyEquality(),
 
81
                        OnlyInequality(),
 
82
                        OnlyCmp(),
 
83
                       ]
 
84
    fixed_expected = [FixedHash(),
 
85
                      InheritedHashWithEquality(),
 
86
                      InheritedHashWithInequality(),
 
87
                      InheritedHashWithCmp(),
 
88
                      ]
 
89
    error_expected = [NoHash()]
 
90
 
 
91
    def test_default_hash(self):
 
92
        for obj in self.default_expected:
 
93
            self.assertEqual(hash(obj), _default_hash(obj))
 
94
 
 
95
    def test_fixed_hash(self):
 
96
        for obj in self.fixed_expected:
 
97
            self.assertEqual(hash(obj), _FIXED_HASH_VALUE)
 
98
 
 
99
    def test_error_hash(self):
 
100
        for obj in self.error_expected:
 
101
            self.assertRaises(TypeError, hash, obj)
 
102
 
 
103
    def test_hashable(self):
 
104
        objects = (self.default_expected +
 
105
                   self.fixed_expected)
 
106
        for obj in objects:
 
107
            self.assert_(isinstance(obj, Hashable), repr(obj))
 
108
 
 
109
    def test_not_hashable(self):
 
110
        for obj in self.error_expected:
 
111
            self.assertFalse(isinstance(obj, Hashable), repr(obj))
 
112
 
 
113
 
42
114
def test_main():
43
 
    test_support.run_unittest(HashEqualityTestCase)
 
115
    test_support.run_unittest(HashEqualityTestCase,
 
116
                              HashInheritanceTestCase)
44
117
 
45
118
 
46
119
if __name__ == "__main__":