blob: c957ec272c1dadb53e2f4bae2ba9554adf3090dd [file] [log] [blame]
Christian Heimes0449f632007-12-15 01:27:15 +00001# Test case for property
2# more tests are in test_descr
3
4import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005from test.support import run_unittest
Christian Heimes0449f632007-12-15 01:27:15 +00006
7class PropertyBase(Exception):
8 pass
9
10class PropertyGet(PropertyBase):
11 pass
12
13class PropertySet(PropertyBase):
14 pass
15
16class PropertyDel(PropertyBase):
17 pass
18
19class BaseClass(object):
20 def __init__(self):
21 self._spam = 5
22
23 @property
24 def spam(self):
25 """BaseClass.getter"""
26 return self._spam
27
28 @spam.setter
29 def spam(self, value):
30 self._spam = value
31
32 @spam.deleter
33 def spam(self):
34 del self._spam
35
36class SubClass(BaseClass):
37
38 @BaseClass.spam.getter
39 def spam(self):
40 """SubClass.getter"""
41 raise PropertyGet(self._spam)
42
43 @spam.setter
44 def spam(self, value):
45 raise PropertySet(self._spam)
46
47 @spam.deleter
48 def spam(self):
49 raise PropertyDel(self._spam)
50
51class PropertyDocBase(object):
52 _spam = 1
53 def _get_spam(self):
54 return self._spam
55 spam = property(_get_spam, doc="spam spam spam")
56
57class PropertyDocSub(PropertyDocBase):
58 @PropertyDocBase.spam.getter
59 def spam(self):
60 """The decorator does not use this doc string"""
61 return self._spam
62
63class PropertyTests(unittest.TestCase):
64 def test_property_decorator_baseclass(self):
65 # see #1620
66 base = BaseClass()
67 self.assertEqual(base.spam, 5)
68 self.assertEqual(base._spam, 5)
69 base.spam = 10
70 self.assertEqual(base.spam, 10)
71 self.assertEqual(base._spam, 10)
72 delattr(base, "spam")
73 self.assert_(not hasattr(base, "spam"))
74 self.assert_(not hasattr(base, "_spam"))
75 base.spam = 20
76 self.assertEqual(base.spam, 20)
77 self.assertEqual(base._spam, 20)
78 self.assertEqual(base.__class__.spam.__doc__, "BaseClass.getter")
79
80 def test_property_decorator_subclass(self):
81 # see #1620
82 sub = SubClass()
83 self.assertRaises(PropertyGet, getattr, sub, "spam")
84 self.assertRaises(PropertySet, setattr, sub, "spam", None)
85 self.assertRaises(PropertyDel, delattr, sub, "spam")
86 self.assertEqual(sub.__class__.spam.__doc__, "SubClass.getter")
87
88 def test_property_decorator_doc(self):
89 base = PropertyDocBase()
90 sub = PropertyDocSub()
91 self.assertEqual(base.__class__.spam.__doc__, "spam spam spam")
92 self.assertEqual(sub.__class__.spam.__doc__, "spam spam spam")
93
94def test_main():
95 run_unittest(PropertyTests)
96
97if __name__ == '__main__':
98 test_main()