summaryrefslogtreecommitdiff
path: root/lib/python2.7/ctypes/test/test_struct_fields.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/ctypes/test/test_struct_fields.py')
-rw-r--r--lib/python2.7/ctypes/test/test_struct_fields.py50
1 files changed, 50 insertions, 0 deletions
diff --git a/lib/python2.7/ctypes/test/test_struct_fields.py b/lib/python2.7/ctypes/test/test_struct_fields.py
new file mode 100644
index 0000000..22eb3b0
--- /dev/null
+++ b/lib/python2.7/ctypes/test/test_struct_fields.py
@@ -0,0 +1,50 @@
+import unittest
+from ctypes import *
+
+class StructFieldsTestCase(unittest.TestCase):
+ # Structure/Union classes must get 'finalized' sooner or
+ # later, when one of these things happen:
+ #
+ # 1. _fields_ is set.
+ # 2. An instance is created.
+ # 3. The type is used as field of another Structure/Union.
+ # 4. The type is subclassed
+ #
+ # When they are finalized, assigning _fields_ is no longer allowed.
+
+ def test_1_A(self):
+ class X(Structure):
+ pass
+ self.assertEqual(sizeof(X), 0) # not finalized
+ X._fields_ = [] # finalized
+ self.assertRaises(AttributeError, setattr, X, "_fields_", [])
+
+ def test_1_B(self):
+ class X(Structure):
+ _fields_ = [] # finalized
+ self.assertRaises(AttributeError, setattr, X, "_fields_", [])
+
+ def test_2(self):
+ class X(Structure):
+ pass
+ X()
+ self.assertRaises(AttributeError, setattr, X, "_fields_", [])
+
+ def test_3(self):
+ class X(Structure):
+ pass
+ class Y(Structure):
+ _fields_ = [("x", X)] # finalizes X
+ self.assertRaises(AttributeError, setattr, X, "_fields_", [])
+
+ def test_4(self):
+ class X(Structure):
+ pass
+ class Y(X):
+ pass
+ self.assertRaises(AttributeError, setattr, X, "_fields_", [])
+ Y._fields_ = []
+ self.assertRaises(AttributeError, setattr, X, "_fields_", [])
+
+if __name__ == "__main__":
+ unittest.main()