using System.Runtime.InteropServices; using WhiteMagic; namespace WhiteMagicTest; /// /// Tests for : blittable size, marshal-required flag, /// IsIntPtr, and computed-once behavior. /// public class MarshalCacheTests { [Fact] public void Size_for_int_is_4() { Assert.Equal(4, MarshalCache.Size); } [Fact] public void Size_for_byte_is_1() { Assert.Equal(1, MarshalCache.Size); } [Fact] public void Size_for_IntPtr_matches_native_pointer_size() { Assert.Equal(IntPtr.Size, MarshalCache.Size); } [Fact] public void Size_for_bool_is_1() { Assert.Equal(1, MarshalCache.Size); } [Fact] public void Size_for_enum_matches_underlying_type() { Assert.Equal(4, MarshalCache.Size); } [Fact] public void Size_for_blittable_struct_is_accurate() { Assert.Equal(8, MarshalCache.Size); } [Fact] public void TypeRequiresMarshal_is_false_for_blittable_types() { Assert.False(MarshalCache.TypeRequiresMarshal); Assert.False(MarshalCache.TypeRequiresMarshal); Assert.False(MarshalCache.TypeRequiresMarshal); } [Fact] public void TypeRequiresMarshal_is_true_for_types_with_MarshalAs_field() { Assert.True(MarshalCache.TypeRequiresMarshal); } [Fact] public void IsIntPtr_is_true_for_IntPtr() { Assert.True(MarshalCache.IsIntPtr); } [Fact] public void IsIntPtr_is_false_for_non_IntPtr_types() { Assert.False(MarshalCache.IsIntPtr); Assert.False(MarshalCache.IsIntPtr); Assert.False(MarshalCache.IsIntPtr); } [Fact] public void All_properties_are_computed_once_and_cached() { int size1 = MarshalCache.Size; bool marshal1 = MarshalCache.TypeRequiresMarshal; bool intPtr1 = MarshalCache.IsIntPtr; int size2 = MarshalCache.Size; bool marshal2 = MarshalCache.TypeRequiresMarshal; bool intPtr2 = MarshalCache.IsIntPtr; Assert.Equal(size1, size2); Assert.Equal(marshal1, marshal2); Assert.Equal(intPtr1, intPtr2); } [Fact] public void SizeU_matches_Size_as_uint() { Assert.Equal((uint)MarshalCache.Size, MarshalCache.SizeU); } [StructLayout(LayoutKind.Sequential)] private struct BlittableStruct { public int X; public int Y; } [StructLayout(LayoutKind.Sequential)] private struct MarshalAsStruct { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] Data; } }