diff --git a/src/Common/tests/InternalUtilitiesForTests/src/ArchitectureDetection.cs b/src/Common/tests/InternalUtilitiesForTests/src/ArchitectureDetection.cs new file mode 100644 index 00000000000..44abcae44e9 --- /dev/null +++ b/src/Common/tests/InternalUtilitiesForTests/src/ArchitectureDetection.cs @@ -0,0 +1,12 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace System +{ + public static class ArchitectureDetection + { + public static bool Is32bit => IntPtr.Size == 4; + public static bool Is64bit => IntPtr.Size == 8; + } +} \ No newline at end of file diff --git a/src/System.Windows.Forms.Primitives/src/Interop/ComCtl32/Interop.MCGRIDINFO.cs b/src/System.Windows.Forms.Primitives/src/Interop/ComCtl32/Interop.MCGRIDINFO.cs index 3a5b6825d57..410666f0562 100644 --- a/src/System.Windows.Forms.Primitives/src/Interop/ComCtl32/Interop.MCGRIDINFO.cs +++ b/src/System.Windows.Forms.Primitives/src/Interop/ComCtl32/Interop.MCGRIDINFO.cs @@ -22,12 +22,12 @@ public unsafe struct MCGRIDINFO public int iCalendar; public int iRow; public int iCol; - public bool bSelected; + public BOOL bSelected; public Kernel32.SYSTEMTIME stStart; public Kernel32.SYSTEMTIME stEnd; public RECT rc; public char* pszName; - public uint cchName; + public UIntPtr cchName; } } } diff --git a/src/System.Windows.Forms.Primitives/tests/Interop/ComCtl32/MCGRIDINFOTests.cs b/src/System.Windows.Forms.Primitives/tests/Interop/ComCtl32/MCGRIDINFOTests.cs new file mode 100644 index 00000000000..53718ce831d --- /dev/null +++ b/src/System.Windows.Forms.Primitives/tests/Interop/ComCtl32/MCGRIDINFOTests.cs @@ -0,0 +1,115 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Runtime.InteropServices; +using Xunit; +using static Interop.ComCtl32; + +namespace System.Windows.Forms.Primitives.Tests.Interop.ComCtl32 +{ + public class MCGRIDINFOTests : IClassFixture + { + [ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is32bit))] + public unsafe void MCGRIDINFO_x32_Size() + { + Assert.Equal(84, sizeof(MCGRIDINFO)); + } + + [ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is32bit))] + public unsafe void MCGRIDINFO_x32_Marshal_Size() + { + Assert.Equal(84, Marshal.SizeOf()); + } + + [ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is32bit))] + public unsafe void MCGRIDINFO_x32_ensure_layout() + { + MCGRIDINFO sut = new MCGRIDINFO(); + byte* addr = (byte*)&sut; + + Assert.Equal(0, (byte*)&sut.cbSize - addr); // 4, UINT + Assert.Equal(4, (byte*)&sut.dwPart - addr); // 4, DWORD + Assert.Equal(8, (byte*)&sut.dwFlags - addr); // 4, DWORD + Assert.Equal(12, (byte*)&sut.iCalendar - addr); // 4, int + Assert.Equal(16, (byte*)&sut.iRow - addr); // 4, int + Assert.Equal(20, (byte*)&sut.iCol - addr); // 4, int + Assert.Equal(24, (byte*)&sut.bSelected - addr); // 4, BOOL + Assert.Equal(28, (byte*)&sut.stStart - addr); // 16, SYSTEMTIME + Assert.Equal(44, (byte*)&sut.stEnd - addr); // 16, SYSTEMTIME + Assert.Equal(60, (byte*)&sut.rc - addr); // 16, RECT + Assert.Equal(76, (byte*)&sut.pszName - addr); // 4, PWSTR + Assert.Equal(80, (byte*)&sut.cchName - addr); // 4, size_t + } + + [ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is32bit))] + public void MCGRIDINFO_x32_Marshal_OffsetOf_IsCorrect() + { + Assert.Equal(0, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.cbSize))); // 4, UINT + Assert.Equal(4, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.dwPart))); // 4, DWORD + Assert.Equal(8, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.dwFlags))); // 4, DWORD + Assert.Equal(12, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.iCalendar))); // 4, int + Assert.Equal(16, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.iRow))); // 4, int + Assert.Equal(20, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.iCol))); // 4, int + Assert.Equal(24, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.bSelected))); // 4, BOOL + Assert.Equal(28, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.stStart))); // 16, SYSTEMTIME + Assert.Equal(44, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.stEnd))); // 16, SYSTEMTIME + Assert.Equal(60, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.rc))); // 16, RECT + Assert.Equal(76, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.pszName))); // 8, PWSTR + Assert.Equal(80, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.cchName))); // 8, size_t + } + + [ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is64bit))] + public unsafe void MCGRIDINFO_x64_Size() + { + Assert.Equal(96, sizeof(MCGRIDINFO)); + } + + [ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is64bit))] + public void MCGRIDINFO_x64_Marshal_Size() + { + Assert.Equal(96, Marshal.SizeOf()); + } + + private bool a = ArchitectureDetection.Is64bit; + + [ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is64bit))] + public unsafe void MCGRIDINFO_x64_ensure_layout() + { + MCGRIDINFO sut = new MCGRIDINFO(); + byte* addr = (byte*)&sut; + + Assert.Equal(0, (byte*)&sut.cbSize - addr); // 4, UINT + Assert.Equal(4, (byte*)&sut.dwPart - addr); // 4, DWORD + Assert.Equal(8, (byte*)&sut.dwFlags - addr); // 4, DWORD + Assert.Equal(12, (byte*)&sut.iCalendar - addr); // 4, int + Assert.Equal(16, (byte*)&sut.iRow - addr); // 4, int + Assert.Equal(20, (byte*)&sut.iCol - addr); // 4, int + Assert.Equal(24, (byte*)&sut.bSelected - addr); // 4, BOOL + Assert.Equal(28, (byte*)&sut.stStart - addr); // 16, SYSTEMTIME + Assert.Equal(44, (byte*)&sut.stEnd - addr); // 16, SYSTEMTIME + Assert.Equal(60, (byte*)&sut.rc - addr); // 16, RECT + // 4 bytes alignment 76 -> 80 + Assert.Equal(80, (byte*)&sut.pszName - addr); // 8, PWSTR + Assert.Equal(88, (byte*)&sut.cchName - addr); // 8, size_t + } + + [ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is64bit))] + public void MCGRIDINFO_x64_Marshal_OffsetOf_IsCorrect() + { + Assert.Equal(0, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.cbSize))); // 4, UINT + Assert.Equal(4, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.dwPart))); // 4, DWORD + Assert.Equal(8, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.dwFlags))); // 4, DWORD + Assert.Equal(12, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.iCalendar))); // 4, int + Assert.Equal(16, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.iRow))); // 4, int + Assert.Equal(20, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.iCol))); // 4, int + Assert.Equal(24, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.bSelected))); // 4, BOOL + Assert.Equal(28, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.stStart))); // 16, SYSTEMTIME + Assert.Equal(44, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.stEnd))); // 16, SYSTEMTIME + Assert.Equal(60, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.rc))); // 16, RECT + // 4 bytes alignment 76 -> 80 + Assert.Equal(80, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.pszName))); // 8, PWSTR + Assert.Equal(88, (int)Marshal.OffsetOf(nameof(MCGRIDINFO.cchName))); // 8, size_t + } + } +} diff --git a/src/System.Windows.Forms.Primitives/tests/Interop/Comdlg32/PRINTDLGWTests.cs b/src/System.Windows.Forms.Primitives/tests/Interop/Comdlg32/PRINTDLGWTests.cs index 9414aef7ea8..9ef53777b33 100644 --- a/src/System.Windows.Forms.Primitives/tests/Interop/Comdlg32/PRINTDLGWTests.cs +++ b/src/System.Windows.Forms.Primitives/tests/Interop/Comdlg32/PRINTDLGWTests.cs @@ -10,16 +10,13 @@ namespace System.Windows.Forms.Primitives.Tests.Interop.Comdlg32 { public class PRINTDLGWTests : IClassFixture { - public static bool Is32bit => IntPtr.Size == 4; - public static bool Is64bit => IntPtr.Size == 8; - - [ConditionalFact(nameof(Is32bit))] + [ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is32bit))] public unsafe void PRINTDLGW_32_Size() { Assert.Equal(66, sizeof(PRINTDLGW_32)); } - [ConditionalFact(nameof(Is32bit))] + [ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is32bit))] public unsafe void PRINTDLGW_32_ensure_layout() { PRINTDLGW_32 sut = new PRINTDLGW_32(); @@ -46,13 +43,13 @@ public unsafe void PRINTDLGW_32_ensure_layout() Assert.Equal(62, (byte*)&sut._hSetupTemplate - addr); // 4, HGLOBAL } - [ConditionalFact(nameof(Is64bit))] + [ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is64bit))] public unsafe void PRINTDLGW_64_Size() { Assert.Equal(120, sizeof(PRINTDLGW_64)); } - [ConditionalFact(nameof(Is64bit))] + [ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is64bit))] public unsafe void PRINTDLGW_64_ensure_layout() { PRINTDLGW_64 sut = new PRINTDLGW_64(); diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/MonthCalendar.MonthCalendarAccessibleObject.cs b/src/System.Windows.Forms/src/System/Windows/Forms/MonthCalendar.MonthCalendarAccessibleObject.cs index b4f627aecb1..a8f53723f19 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/MonthCalendar.MonthCalendarAccessibleObject.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/MonthCalendar.MonthCalendarAccessibleObject.cs @@ -520,7 +520,7 @@ private unsafe bool GetCalendarGridInfoText(MCGIP dwPart, int calendarIndex, int iCol = column, iRow = row, pszName = pName, - cchName = (uint)name.Length - 1 + cchName = (UIntPtr)name.Length - 1 }; result = User32.SendMessageW(_owner, (User32.WM)MCM.GETCALENDARGRIDINFO, IntPtr.Zero, ref gridInfo) != IntPtr.Zero;