diff --git a/Lib/test/test_ctypes/test_bitfields.py b/Lib/test/test_ctypes/test_bitfields.py index dad71a0ba7ee4a..a5d1e2645c2631 100644 --- a/Lib/test/test_ctypes/test_bitfields.py +++ b/Lib/test/test_ctypes/test_bitfields.py @@ -3,6 +3,7 @@ from test import support import unittest import os +import sys import _ctypes_test @@ -236,6 +237,79 @@ class X(Structure): else: self.assertEqual(sizeof(X), sizeof(c_int) * 2) + @unittest.skipIf(sys.platform == 'win32', "Doesn't fail on Windows") + @unittest.expectedFailure # gh-97588 + def test_mixed_5(self): + class X(Structure): + _fields_ = [ + ('A', c_uint, 1), + ('B', c_ushort, 16)] + a = X() + a.A = 0 + a.B = 1 + self.assertEqual(1, a.B) + + @unittest.skipIf(sys.platform == 'win32', "Doesn't fail on Windows") + @unittest.expectedFailure # gh-97588 + def test_mixed_6(self): + class X(Structure): + _fields_ = [ + ('A', c_ulonglong, 1), + ('B', c_uint, 32)] + a = X() + a.A = 0 + a.B = 1 + self.assertEqual(1, a.B) + + @unittest.skipIf(sys.platform == 'win32', "Doesn't fail on Windows") + @unittest.expectedFailure # gh-97588 + def test_mixed_7(self): + class X(Structure): + _fields_ = [ + ("A", c_uint), + ('B', c_uint, 20), + ('C', c_ulonglong, 24)] + self.assertEqual(16, sizeof(X)) + + @unittest.skipIf(sys.platform == 'win32', "Doesn't fail on Windows") + @unittest.expectedFailure # gh-97588 + def test_mixed_8(self): + class Foo(Structure): + _fields_ = [ + ("A", c_uint), + ("B", c_uint, 32), + ("C", c_ulonglong, 1), + ] + + class Bar(Structure): + _fields_ = [ + ("A", c_uint), + ("B", c_uint), + ("C", c_ulonglong, 1), + ] + self.assertEqual(sizeof(Foo), sizeof(Bar)) + + @unittest.skipIf(sys.platform == 'win32', "Doesn't fail on Windows") + @unittest.expectedFailure # gh-97588 + def test_mixed_9(self): + class X(Structure): + _fields_ = [ + ("A", c_uint8), + ("B", c_uint, 1), + ] + self.assertEqual(4, sizeof(X)) + + @unittest.skipIf(sys.platform == 'win32', "Doesn't fail on Windows") + @unittest.expectedFailure # gh-97588 + def test_mixed_10(self): + class X(Structure): + _fields_ = [ + ("A", c_uint32, 1), + ("B", c_uint64, 1), + ] + self.assertEqual(8, alignment(X)) + self.assertEqual(8, sizeof(X)) + def test_anon_bitfields(self): # anonymous bit-fields gave a strange error message class X(Structure): diff --git a/Misc/NEWS.d/next/C API/2022-09-30-07-16-00.gh-issue-97588.yQFteB.rst b/Misc/NEWS.d/next/C API/2022-09-30-07-16-00.gh-issue-97588.yQFteB.rst new file mode 100644 index 00000000000000..e781a475fcc796 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2022-09-30-07-16-00.gh-issue-97588.yQFteB.rst @@ -0,0 +1 @@ +Add failing tests to document problems with ctypes structs.