~divmod-dev/divmod.org/trunk

« back to all changes in this revision

Viewing changes to Epsilon/epsilon/test/test_descriptor.py

  • Committer: Jean-Paul Calderone
  • Date: 2014-06-29 20:33:04 UTC
  • mfrom: (2749.1.1 remove-epsilon-1325289)
  • Revision ID: exarkun@twistedmatrix.com-20140629203304-gdkmbwl1suei4m97
mergeĀ lp:~exarkun/divmod.org/remove-epsilon-1325289

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
"""
2
 
Tests for L{epsilon.descriptor}.
3
 
"""
4
 
 
5
 
from twisted.trial import unittest
6
 
 
7
 
from epsilon import descriptor
8
 
 
9
 
class Test1(object):
10
 
    class a(descriptor.attribute):
11
 
        def get(self):
12
 
            return 1
13
 
        def set(self, value):
14
 
            pass
15
 
        def delete(self):
16
 
            pass
17
 
 
18
 
 
19
 
class Test2(object):
20
 
    class a(descriptor.attribute):
21
 
        "stuff"
22
 
        def get(self):
23
 
            return 10
24
 
 
25
 
 
26
 
class DescriptorTest(unittest.TestCase):
27
 
    def testCase1(self):
28
 
        t = Test1()
29
 
        self.assertEquals(t.a, 1)
30
 
        t.a = 2
31
 
        self.assertEquals(t.a, 1)
32
 
        del t.a
33
 
        self.assertEquals(t.a, 1)
34
 
 
35
 
 
36
 
    def testCase2(self):
37
 
        t = Test2()
38
 
        self.assertEquals(Test2.a.__doc__, 'stuff')
39
 
        self.assertEquals(t.a, 10)
40
 
        self.assertRaises(AttributeError, setattr, t, 'a', 1)
41
 
        self.assertRaises(AttributeError, delattr, t, 'a')
42
 
 
43
 
 
44
 
 
45
 
class AbstractClassic:
46
 
    """
47
 
    Toy classic class used by L{RequiredAttributeTestCase}.
48
 
    """
49
 
    foo = descriptor.requiredAttribute('foo')
50
 
    bar = descriptor.requiredAttribute('bar')
51
 
 
52
 
 
53
 
class ManifestClassic(AbstractClassic):
54
 
    """
55
 
    Toy classic class used by L{RequiredAttributeTestCase}.
56
 
    """
57
 
    foo = 'bar'
58
 
 
59
 
 
60
 
 
61
 
class AbstractNewStyle(object):
62
 
    """
63
 
    Toy new-style class used by L{RequiredAttributeTestCase}.
64
 
    """
65
 
    foo = descriptor.requiredAttribute('foo')
66
 
    bar = descriptor.requiredAttribute('bar')
67
 
 
68
 
 
69
 
 
70
 
class ManifestNewStyle(AbstractNewStyle):
71
 
    """
72
 
    Toy classic class used by L{RequiredAttributeTestCase}.
73
 
    """
74
 
    foo = 'bar'
75
 
 
76
 
 
77
 
 
78
 
class RequiredAttributeTestCase(unittest.TestCase):
79
 
    """
80
 
    Tests for L{descriptor.requiredAttribute}.
81
 
    """
82
 
    def _defaultAccess(self, abstractFoo):
83
 
        exception = self.assertRaises(AttributeError, getattr, abstractFoo, 'foo')
84
 
        self.assertEqual(len(exception.args), 1)
85
 
        self.assertEqual(
86
 
            exception.args[0],
87
 
            ("Required attribute 'foo' has not been changed"
88
 
                " from its default value on %r" % (abstractFoo,)))
89
 
 
90
 
    def test_defaultAccessClassic(self):
91
 
        """
92
 
        Accessing a L{descriptor.requiredAttribute} on a classic class raises
93
 
        an C{AttributeError} if its value has not been overridden.
94
 
        """
95
 
        abstractFoo = AbstractClassic()
96
 
        self._defaultAccess(abstractFoo)
97
 
 
98
 
 
99
 
    def test_defaultAccessNewStyle(self):
100
 
        """
101
 
        Accessing a L{descriptor.requiredAttribute} on a new-style class raises
102
 
        an C{AttributeError} if its value has not been overridden.
103
 
        """
104
 
        abstractFoo = AbstractNewStyle()
105
 
        self._defaultAccess(abstractFoo)
106
 
 
107
 
 
108
 
    def _derivedAccess(self, manifestFoo):
109
 
        self.assertEqual(manifestFoo.foo, 'bar')
110
 
 
111
 
 
112
 
    def test_derivedAccessClassic(self):
113
 
        """
114
 
        If a derived classic class sets a new value for a
115
 
        L{descriptor.requiredAttribute}, things should work fine.
116
 
        """
117
 
        manifestFoo = ManifestClassic()
118
 
        self._derivedAccess(manifestFoo)
119
 
 
120
 
 
121
 
    def test_derivedAccessNewStyle(self):
122
 
        """
123
 
        If a new-style derived class sets a new value for a
124
 
        L{descriptor.requiredAttribute}, things should work fine.
125
 
        """
126
 
        manifestFoo = ManifestNewStyle()
127
 
        self._derivedAccess(manifestFoo)
128
 
 
129
 
 
130
 
    def _instanceAccess(self, abstractMadeManifest):
131
 
        abstractMadeManifest.foo = 123
132
 
        self.assertEqual(abstractMadeManifest.foo, 123)
133
 
 
134
 
 
135
 
    def test_instanceAccessClassic(self):
136
 
        """
137
 
        Accessing a L{descriptor.requiredAttribute} after setting a value for
138
 
        it on an instance of a classic class evaluates to that value.
139
 
        """
140
 
        abstractMadeManifest = AbstractClassic()
141
 
        self._instanceAccess(abstractMadeManifest)
142
 
 
143
 
 
144
 
    def test_instanceAccessNewStyle(self):
145
 
        """
146
 
        Accessing a L{descriptor.requiredAttribute} after setting a value for
147
 
        it on an instance of a new-style class evaluates to that value.
148
 
        """
149
 
        abstractMadeManifest = AbstractNewStyle()
150
 
        self._instanceAccess(abstractMadeManifest)
151
 
 
152
 
 
153
 
    def test_instanceAttributesUnrelatedClassic(self):
154
 
        """
155
 
        Accessing one L{descriptor.requiredAttribute} after setting a value for
156
 
        a different L{descriptor.requiredAttribute} raises an
157
 
        L{AttributeError}.
158
 
        """
159
 
        partiallyAbstract = AbstractClassic()
160
 
        partiallyAbstract.bar = 123
161
 
        self._defaultAccess(partiallyAbstract)
162
 
 
163
 
 
164
 
    def test_instanceAttributesUnrelatedNewStyle(self):
165
 
        """
166
 
        Accessing one L{descriptor.requiredAttribute} after setting a value for
167
 
        a different L{descriptor.requiredAttribute} raises an
168
 
        L{AttributeError}.
169
 
        """
170
 
        partiallyAbstract = AbstractNewStyle()
171
 
        partiallyAbstract.bar = 123
172
 
        self._defaultAccess(partiallyAbstract)