From b7acd6b62c5ecbdf465c456af642552b7d1d9715 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Wed, 8 Apr 2020 15:12:59 -0700 Subject: [PATCH 1/6] Remove ActiveIssue from tests. Update tests to pass since issues are being marked "Won't Fix". --- .../Marshal/GetNativeVariantForObjectTests.cs | 23 +++++++++---------- .../GetObjectForNativeVariantTests.Windows.cs | 2 +- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs b/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs index 0d9957d79fe47a..a4fa243954c718 100644 --- a/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs +++ b/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs @@ -119,10 +119,6 @@ public static IEnumerable GetNativeVariantForObject_NonRoundtrippingPr { yield return new object[] { new DispatchWrapper(10), VarEnum.VT_DISPATCH, IntPtr.Zero, null }; } - else - { - Assert.Throws(() => new DispatchWrapper(10)); - } yield return new object[] { new ErrorWrapper(10), VarEnum.VT_ERROR, (IntPtr)10, 10 }; yield return new object[] { new CurrencyWrapper(10), VarEnum.VT_CY, (IntPtr)100000, 10m }; yield return new object[] { new BStrWrapper("a"), VarEnum.VT_BSTR, (IntPtr)(-1), "a" }; @@ -133,10 +129,6 @@ public static IEnumerable GetNativeVariantForObject_NonRoundtrippingPr { yield return new object[] { new DispatchWrapper[] { new DispatchWrapper(null), new DispatchWrapper(10) }, (VarEnum)8201, (IntPtr)(-1), new object[] { null, 10 } }; } - else - { - Assert.Throws(() => new DispatchWrapper(10)); - } yield return new object[] { new ErrorWrapper[] { new ErrorWrapper(10) }, (VarEnum)8202, (IntPtr)(-1), new uint[] { 10 } }; yield return new object[] { new CurrencyWrapper[] { new CurrencyWrapper(10) }, (VarEnum)8198, (IntPtr)(-1), new decimal[] { 10 } }; yield return new object[] { new BStrWrapper[] { new BStrWrapper("a"), new BStrWrapper(null), new BStrWrapper("c") }, (VarEnum)8200, (IntPtr)(-1), new string[] { "a", null, "c" } }; @@ -148,13 +140,21 @@ public static IEnumerable GetNativeVariantForObject_NonRoundtrippingPr var genericClass = new GenericClass(); yield return new object[] { new GenericClass[] { genericClass, null }, (VarEnum)8205, (IntPtr)(-1), new object[] { genericClass, null } }; - var nonGenericStruct = new NonGenericStruct(); - yield return new object[] { new NonGenericStruct[] { nonGenericStruct }, (VarEnum)8228, (IntPtr)(-1), new NonGenericStruct[] { nonGenericStruct } }; + if (!PlatformDetection.IsNetCore) + { + var nonGenericStruct = new NonGenericStruct(); + yield return new object[] { new NonGenericStruct[] { nonGenericStruct }, (VarEnum)8228, (IntPtr)(-1), new NonGenericStruct[] { nonGenericStruct } }; + } var classWithInterface = new ClassWithInterface(); var structWithInterface = new StructWithInterface(); yield return new object[] { new ClassWithInterface[] { classWithInterface, null }, (VarEnum)8201, (IntPtr)(-1), new object[] { classWithInterface, null } }; - yield return new object[] { new StructWithInterface[] { structWithInterface }, (VarEnum)8228, (IntPtr)(-1), new StructWithInterface[] { structWithInterface } }; + + if (!PlatformDetection.IsNetCore) + { + yield return new object[] { new StructWithInterface[] { structWithInterface }, (VarEnum)8228, (IntPtr)(-1), new StructWithInterface[] { structWithInterface } }; + } + yield return new object[] { new INonGenericInterface[] { classWithInterface, structWithInterface, null }, (VarEnum)8201, (IntPtr)(-1), new object[] { classWithInterface, structWithInterface, null } }; // Enums. @@ -183,7 +183,6 @@ public static IEnumerable GetNativeVariantForObject_NonRoundtrippingPr [Theory] [MemberData(nameof(GetNativeVariantForObject_NonRoundtrippingPrimitives_TestData))] [PlatformSpecific(TestPlatforms.Windows)] - [ActiveIssue("https://github.com/dotnet/runtime/issues/26820")] public void GetNativeVariantForObject_ValidObject_Success(object primitive, VarEnum expectedVarType, IntPtr expectedValue, object expectedRoundtripValue) { var v = new Variant(); diff --git a/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetObjectForNativeVariantTests.Windows.cs b/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetObjectForNativeVariantTests.Windows.cs index 5d78fafce205bd..4e4d77a417cd2c 100644 --- a/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetObjectForNativeVariantTests.Windows.cs +++ b/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetObjectForNativeVariantTests.Windows.cs @@ -538,7 +538,7 @@ public void GetObjectForNativeVariant_NestedVariant_ReturnsExpected(Variant sour } [Fact] - [ActiveIssue("https://github.com/dotnet/runtime/issues/27015", TargetFrameworkMonikers.Netcoreapp)] + [SkipOnTargetFramework(TargetFrameworkMonikers.Netcoreapp, "VT_RECORD not supported on .NET Core")] public void GetObjectForNativeVariant_Record_ReturnsExpected() { int record = 10; From 78beb7844a754ca3fb23f4b17b96f8dfc3dfd19b Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Wed, 8 Apr 2020 20:17:46 -0700 Subject: [PATCH 2/6] Update test to validate failure. --- .../Marshal/GetObjectForNativeVariantTests.Windows.cs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetObjectForNativeVariantTests.Windows.cs b/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetObjectForNativeVariantTests.Windows.cs index 4e4d77a417cd2c..dbe1b5383c920c 100644 --- a/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetObjectForNativeVariantTests.Windows.cs +++ b/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetObjectForNativeVariantTests.Windows.cs @@ -538,8 +538,7 @@ public void GetObjectForNativeVariant_NestedVariant_ReturnsExpected(Variant sour } [Fact] - [SkipOnTargetFramework(TargetFrameworkMonikers.Netcoreapp, "VT_RECORD not supported on .NET Core")] - public void GetObjectForNativeVariant_Record_ReturnsExpected() + public void GetObjectForNativeVariant_Record_Throws() { int record = 10; var recordInfo = new RecordInfo { Guid = typeof(int).GUID }; @@ -557,11 +556,8 @@ public void GetObjectForNativeVariant_Record_ReturnsExpected() _recordInfo = pRecordInfo } }); - Assert.Equal(10, GetObjectForNativeVariant(variant)); - GetObjectForNativeVariant_NestedVariant_ReturnsExpected(variant, record); - variant.m_Variant.vt |= VT_BYREF; - Assert.Equal(10, GetObjectForNativeVariant(variant)); + Assert.Throws(() => GetObjectForNativeVariant(variant)); } finally { From b3bbfd9556e6f4cd151733fd846626fd6048a8de Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Wed, 8 Apr 2020 21:29:25 -0700 Subject: [PATCH 3/6] Remove PlatformDetection checks --- .../Marshal/GetNativeVariantForObjectTests.cs | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs b/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs index a4fa243954c718..084f7981bbee90 100644 --- a/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs +++ b/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs @@ -115,20 +115,12 @@ public static IEnumerable GetNativeVariantForObject_NonRoundtrippingPr // Wrappers. yield return new object[] { new UnknownWrapper(10), VarEnum.VT_UNKNOWN, IntPtr.Zero, null }; - if (!PlatformDetection.IsNetCore) - { - yield return new object[] { new DispatchWrapper(10), VarEnum.VT_DISPATCH, IntPtr.Zero, null }; - } yield return new object[] { new ErrorWrapper(10), VarEnum.VT_ERROR, (IntPtr)10, 10 }; yield return new object[] { new CurrencyWrapper(10), VarEnum.VT_CY, (IntPtr)100000, 10m }; yield return new object[] { new BStrWrapper("a"), VarEnum.VT_BSTR, (IntPtr)(-1), "a" }; yield return new object[] { new BStrWrapper(null), VarEnum.VT_BSTR, IntPtr.Zero, null }; yield return new object[] { new UnknownWrapper[] { new UnknownWrapper(null), new UnknownWrapper(10) }, (VarEnum)8205, (IntPtr)(-1), new object[] { null, 10 } }; - if (!PlatformDetection.IsNetCore) - { - yield return new object[] { new DispatchWrapper[] { new DispatchWrapper(null), new DispatchWrapper(10) }, (VarEnum)8201, (IntPtr)(-1), new object[] { null, 10 } }; - } yield return new object[] { new ErrorWrapper[] { new ErrorWrapper(10) }, (VarEnum)8202, (IntPtr)(-1), new uint[] { 10 } }; yield return new object[] { new CurrencyWrapper[] { new CurrencyWrapper(10) }, (VarEnum)8198, (IntPtr)(-1), new decimal[] { 10 } }; yield return new object[] { new BStrWrapper[] { new BStrWrapper("a"), new BStrWrapper(null), new BStrWrapper("c") }, (VarEnum)8200, (IntPtr)(-1), new string[] { "a", null, "c" } }; @@ -140,21 +132,9 @@ public static IEnumerable GetNativeVariantForObject_NonRoundtrippingPr var genericClass = new GenericClass(); yield return new object[] { new GenericClass[] { genericClass, null }, (VarEnum)8205, (IntPtr)(-1), new object[] { genericClass, null } }; - if (!PlatformDetection.IsNetCore) - { - var nonGenericStruct = new NonGenericStruct(); - yield return new object[] { new NonGenericStruct[] { nonGenericStruct }, (VarEnum)8228, (IntPtr)(-1), new NonGenericStruct[] { nonGenericStruct } }; - } - var classWithInterface = new ClassWithInterface(); var structWithInterface = new StructWithInterface(); yield return new object[] { new ClassWithInterface[] { classWithInterface, null }, (VarEnum)8201, (IntPtr)(-1), new object[] { classWithInterface, null } }; - - if (!PlatformDetection.IsNetCore) - { - yield return new object[] { new StructWithInterface[] { structWithInterface }, (VarEnum)8228, (IntPtr)(-1), new StructWithInterface[] { structWithInterface } }; - } - yield return new object[] { new INonGenericInterface[] { classWithInterface, structWithInterface, null }, (VarEnum)8201, (IntPtr)(-1), new object[] { classWithInterface, structWithInterface, null } }; // Enums. From 997784a8e12609a86c9aeb6aad78ff994a86a53b Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Wed, 8 Apr 2020 21:53:05 -0700 Subject: [PATCH 4/6] Remove dead code --- .../Marshal/GetNativeVariantForObjectTests.cs | 78 ------------------- 1 file changed, 78 deletions(-) diff --git a/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs b/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs index 084f7981bbee90..fc96ebf9a2c411 100644 --- a/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs +++ b/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs @@ -15,71 +15,6 @@ namespace System.Runtime.InteropServices.Tests { public partial class GetNativeVariantForObjectTests { - public static IEnumerable GetNativeVariantForObject_RoundtrippingPrimitives_TestData() - { - yield return new object[] { null, VarEnum.VT_EMPTY, IntPtr.Zero }; - - yield return new object[] { (sbyte)10, VarEnum.VT_I1, (IntPtr)10 }; - yield return new object[] { (short)10, VarEnum.VT_I2, (IntPtr)10 }; - yield return new object[] { 10, VarEnum.VT_I4, (IntPtr)10 }; - yield return new object[] { (long)10, VarEnum.VT_I8, (IntPtr)10 }; - yield return new object[] { (byte)10, VarEnum.VT_UI1, (IntPtr)10 }; - yield return new object[] { (ushort)10, VarEnum.VT_UI2, (IntPtr)10 }; - yield return new object[] { (uint)10, VarEnum.VT_UI4, (IntPtr)10 }; - yield return new object[] { (ulong)10, VarEnum.VT_UI8, (IntPtr)10 }; - - yield return new object[] { true, VarEnum.VT_BOOL, (IntPtr)ushort.MaxValue }; - yield return new object[] { false, VarEnum.VT_BOOL, IntPtr.Zero }; - - yield return new object[] { 10m, VarEnum.VT_DECIMAL, (IntPtr)10 }; - - // Well known types. - DateTime dateTime = new DateTime(1899, 12, 30).AddDays(20); - yield return new object[] { dateTime, VarEnum.VT_DATE, (IntPtr)(-1) }; - - yield return new object[] { DBNull.Value, VarEnum.VT_NULL, IntPtr.Zero }; - yield return new object[] { DBNull.Value, VarEnum.VT_NULL, IntPtr.Zero }; - - // Arrays. - yield return new object[] { new sbyte[] { 10, 11, 12 }, (VarEnum)8208, (IntPtr)(-1) }; - yield return new object[] { new short[] { 10, 11, 12 }, (VarEnum)8194, (IntPtr)(-1) }; - yield return new object[] { new int[] { 10, 11, 12 }, (VarEnum)8195, (IntPtr)(-1) }; - yield return new object[] { new long[] { 10, 11, 12 }, (VarEnum)8212, (IntPtr)(-1) }; - yield return new object[] { new byte[] { 10, 11, 12 }, (VarEnum)8209, (IntPtr)(-1) }; - yield return new object[] { new ushort[] { 10, 11, 12 }, (VarEnum)8210, (IntPtr)(-1) }; - yield return new object[] { new uint[] { 10, 11, 12 }, (VarEnum)8211, (IntPtr)(-1) }; - yield return new object[] { new ulong[] { 10, 11, 12 }, (VarEnum)8213, (IntPtr)(-1) }; - - yield return new object[] { new bool[] { true, false }, (VarEnum)8203, (IntPtr)(-1) }; - - yield return new object[] { new float[] { 10, 11, 12 }, (VarEnum)8196, (IntPtr)(-1) }; - yield return new object[] { new double[] { 10, 11, 12 }, (VarEnum)8197, (IntPtr)(-1) }; - yield return new object[] { new decimal[] { 10m, 11m, 12m }, (VarEnum)8206, (IntPtr)(-1) }; - - yield return new object[] { new object[] { 10, 11, 12 }, (VarEnum)8204, (IntPtr)(-1) }; - yield return new object[] { new string[] { "a", "b", "c" }, (VarEnum)8200, (IntPtr)(-1) }; - - yield return new object[] { new TimeSpan[] { new TimeSpan(10) }, (VarEnum)8228, (IntPtr)(-1) }; - yield return new object[] { new int[,] { { 10 }, { 11 }, { 12 } }, (VarEnum)8195, (IntPtr)(-1) }; - - // Objects. - var nonGenericClass = new NonGenericClass(); - yield return new object[] { nonGenericClass, VarEnum.VT_DISPATCH, (IntPtr)(-1) }; - - var valueType = new StructWithValue { Value = 10 }; - yield return new object[] { valueType, VarEnum.VT_RECORD, (IntPtr)(-1) }; - - var genericClass = new GenericClass(); - yield return new object[] { new object[] { nonGenericClass, genericClass, null }, (VarEnum)8204, (IntPtr)(-1) }; - - yield return new object[] { new object[] { valueType, null }, (VarEnum)8204, (IntPtr)(-1) }; - - // Delegate. - MethodInfo method = typeof(GetNativeVariantForObjectTests).GetMethod(nameof(NonGenericMethod), BindingFlags.NonPublic | BindingFlags.Static); - Delegate d = method.CreateDelegate(typeof(NonGenericDelegate)); - yield return new object[] { d, VarEnum.VT_DISPATCH, (IntPtr)(-1) }; - } - private void GetNativeVariantForObject_RoundtrippingPrimitives_Success(object primitive, VarEnum expectedVarType, IntPtr expectedValue) { GetNativeVariantForObject_ValidObject_Success(primitive, expectedVarType, expectedValue, primitive); @@ -303,19 +238,6 @@ public void GetNativeVariantForObject_GenericObject_ThrowsArgumentException(obje AssertExtensions.Throws("obj", () => Marshal.GetNativeVariantForObject(obj, (IntPtr)1)); } - public static IEnumerable GetNativeVariant_NotInteropCompatible_TestData() - { - yield return new object[] { new TimeSpan(10) }; - - yield return new object[] { new object[] { new GenericStruct() } }; - - yield return new object[] { new GenericStruct[0]}; - yield return new object[] { new GenericStruct[] { new GenericStruct() } }; - - yield return new object[] { new Color[0] }; - yield return new object[] { new Color[] { Color.FromArgb(10) } }; - } - [Fact] [PlatformSpecific(TestPlatforms.Windows)] public void GetNativeVariant_InvalidArray_ThrowsSafeArrayTypeMismatchException() From f50397cf8e239238f58bce3d498c83488e2ab740 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Thu, 9 Apr 2020 13:59:25 -0700 Subject: [PATCH 5/6] Feedback. --- .../Marshal/GetNativeVariantForObjectTests.cs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs b/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs index fc96ebf9a2c411..010cfe573d47c9 100644 --- a/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs +++ b/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs @@ -50,6 +50,7 @@ public static IEnumerable GetNativeVariantForObject_NonRoundtrippingPr // Wrappers. yield return new object[] { new UnknownWrapper(10), VarEnum.VT_UNKNOWN, IntPtr.Zero, null }; + yield return new object[] { new DispatchWrapper[] { new DispatchWrapper(null), new DispatchWrapper(null) }, (VarEnum)8201, (IntPtr)(-1), new object[] { null, null } }; yield return new object[] { new ErrorWrapper(10), VarEnum.VT_ERROR, (IntPtr)10, 10 }; yield return new object[] { new CurrencyWrapper(10), VarEnum.VT_CY, (IntPtr)100000, 10m }; yield return new object[] { new BStrWrapper("a"), VarEnum.VT_BSTR, (IntPtr)(-1), "a" }; @@ -326,11 +327,6 @@ public static void GetNativeVariantForObject_CantCastToObject_ThrowsInvalidCastE } } - public struct StructWithValue - { - public int Value; - } - public class ClassWithInterface : INonGenericInterface { } public struct StructWithInterface : INonGenericInterface { } @@ -344,9 +340,6 @@ public enum UInt16Enum : ushort { Value1, Value2 } public enum UInt32Enum : uint { Value1, Value2 } public enum UInt64Enum : ulong { Value1, Value2 } - private static void NonGenericMethod(int i) { } - public delegate void NonGenericDelegate(int i); - public class FakeSafeHandle : SafeHandle { public FakeSafeHandle() : base(IntPtr.Zero, false) { } From b77985faf1459152bbeb8b43681c499d19c13150 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Fri, 10 Apr 2020 14:05:16 -0700 Subject: [PATCH 6/6] Fix IntPtr/UIntPtr Variant tests on 32-bit. Remove VarEnum casting of a decimal number. --- .../GetNativeVariantForObjectTests.Windows.cs | 8 +-- .../Marshal/GetNativeVariantForObjectTests.cs | 51 +++++++++++-------- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.Windows.cs b/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.Windows.cs index d2f4da6bdfd149..a324a596843b64 100644 --- a/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.Windows.cs +++ b/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.Windows.cs @@ -35,15 +35,15 @@ public static IEnumerable GetNativeVariantForObject_ComObjectArray_Tes { // Arrays. var empty = new ComImportObject(); - yield return new object[] { new ComImportObject[] { empty, null }, (VarEnum)8205, new object[] { empty, null } }; + yield return new object[] { new ComImportObject[] { empty, null }, (VarEnum.VT_ARRAY | VarEnum.VT_UNKNOWN), new object[] { empty, null } }; var nonDualEmpty = new NonDualComObjectEmpty(); var autoDispatchEmpty = new AutoDispatchComObjectEmpty(); var autoDualEmpty = new AutoDualComObjectEmpty(); - yield return new object[] { new NonDualComObjectEmpty[] { nonDualEmpty, null }, (VarEnum)8205, new object[] { nonDualEmpty, null } }; - yield return new object[] { new AutoDispatchComObjectEmpty[] { autoDispatchEmpty, null }, (VarEnum)8205, new object[] { autoDispatchEmpty, null } }; - yield return new object[] { new AutoDualComObjectEmpty[] { autoDualEmpty, null }, (VarEnum)8205, new object[] { autoDualEmpty, null } }; + yield return new object[] { new NonDualComObjectEmpty[] { nonDualEmpty, null }, (VarEnum.VT_ARRAY | VarEnum.VT_UNKNOWN), new object[] { nonDualEmpty, null } }; + yield return new object[] { new AutoDispatchComObjectEmpty[] { autoDispatchEmpty, null }, (VarEnum.VT_ARRAY | VarEnum.VT_UNKNOWN), new object[] { autoDispatchEmpty, null } }; + yield return new object[] { new AutoDualComObjectEmpty[] { autoDualEmpty, null }, (VarEnum.VT_ARRAY | VarEnum.VT_UNKNOWN), new object[] { autoDualEmpty, null } }; } [ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsNotWindowsNanoServer))] diff --git a/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs b/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs index 010cfe573d47c9..02f57a2c88347c 100644 --- a/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs +++ b/src/libraries/System.Runtime.InteropServices/tests/System/Runtime/InteropServices/Marshal/GetNativeVariantForObjectTests.cs @@ -35,14 +35,23 @@ public static IEnumerable GetNativeVariantForObject_NonRoundtrippingPr // because the native variant type uses mscorlib type VarEnum to store what type it contains. // To get back the original char, use GetObjectForNativeVariant and cast to char. yield return new object[] { 'a', VarEnum.VT_UI2, (IntPtr)'a', (ushort)97 }; - yield return new object[] { new char[] { 'a', 'b', 'c' }, (VarEnum)8210, (IntPtr)(-1), new ushort[] { 'a', 'b', 'c' } }; + yield return new object[] { new char[] { 'a', 'b', 'c' }, (VarEnum.VT_ARRAY | VarEnum.VT_UI2), (IntPtr)(-1), new ushort[] { 'a', 'b', 'c' } }; - // IntPtr/UIntPtr objects are converted to int/uint respectively. + // IntPtr/UIntPtr objects are _always_ converted to int/uint respectively. yield return new object[] { (IntPtr)10, VarEnum.VT_INT, (IntPtr)10, 10 }; yield return new object[] { (UIntPtr)10, VarEnum.VT_UINT, (IntPtr)10, (uint)10 }; - yield return new object[] { new IntPtr[] { (IntPtr)10, (IntPtr)11, (IntPtr)12 }, (VarEnum)8212, (IntPtr)(-1), new long[] { 10, 11, 12 } }; - yield return new object[] { new UIntPtr[] { (UIntPtr)10, (UIntPtr)11, (UIntPtr)12 }, (VarEnum)8213, (IntPtr)(-1), new ulong[] { 10, 11, 12 } }; + // IntPtr/UIntPtr objects in arrays are converted to the appropriate pointer width. + if (IntPtr.Size == 4) + { + yield return new object[] { new IntPtr[] { (IntPtr)10, (IntPtr)11, (IntPtr)12 }, (VarEnum.VT_ARRAY | VarEnum.VT_INT), (IntPtr)(-1), new int[] { 10, 11, 12 } }; + yield return new object[] { new UIntPtr[] { (UIntPtr)10, (UIntPtr)11, (UIntPtr)12 }, (VarEnum.VT_ARRAY | VarEnum.VT_UINT), (IntPtr)(-1), new uint[] { 10, 11, 12 } }; + } + else + { + yield return new object[] { new IntPtr[] { (IntPtr)10, (IntPtr)11, (IntPtr)12 }, (VarEnum.VT_ARRAY | VarEnum.VT_I8), (IntPtr)(-1), new long[] { 10, 11, 12 } }; + yield return new object[] { new UIntPtr[] { (UIntPtr)10, (UIntPtr)11, (UIntPtr)12 }, (VarEnum.VT_ARRAY | VarEnum.VT_UI8), (IntPtr)(-1), new ulong[] { 10, 11, 12 } }; + } // DateTime is converted to VT_DATE which is offset from December 30, 1899. DateTime earlyDateTime = new DateTime(1899, 12, 30); @@ -50,28 +59,28 @@ public static IEnumerable GetNativeVariantForObject_NonRoundtrippingPr // Wrappers. yield return new object[] { new UnknownWrapper(10), VarEnum.VT_UNKNOWN, IntPtr.Zero, null }; - yield return new object[] { new DispatchWrapper[] { new DispatchWrapper(null), new DispatchWrapper(null) }, (VarEnum)8201, (IntPtr)(-1), new object[] { null, null } }; + yield return new object[] { new DispatchWrapper[] { new DispatchWrapper(null), new DispatchWrapper(null) }, (VarEnum.VT_ARRAY | VarEnum.VT_DISPATCH), (IntPtr)(-1), new object[] { null, null } }; yield return new object[] { new ErrorWrapper(10), VarEnum.VT_ERROR, (IntPtr)10, 10 }; yield return new object[] { new CurrencyWrapper(10), VarEnum.VT_CY, (IntPtr)100000, 10m }; yield return new object[] { new BStrWrapper("a"), VarEnum.VT_BSTR, (IntPtr)(-1), "a" }; yield return new object[] { new BStrWrapper(null), VarEnum.VT_BSTR, IntPtr.Zero, null }; - yield return new object[] { new UnknownWrapper[] { new UnknownWrapper(null), new UnknownWrapper(10) }, (VarEnum)8205, (IntPtr)(-1), new object[] { null, 10 } }; - yield return new object[] { new ErrorWrapper[] { new ErrorWrapper(10) }, (VarEnum)8202, (IntPtr)(-1), new uint[] { 10 } }; - yield return new object[] { new CurrencyWrapper[] { new CurrencyWrapper(10) }, (VarEnum)8198, (IntPtr)(-1), new decimal[] { 10 } }; - yield return new object[] { new BStrWrapper[] { new BStrWrapper("a"), new BStrWrapper(null), new BStrWrapper("c") }, (VarEnum)8200, (IntPtr)(-1), new string[] { "a", null, "c" } }; + yield return new object[] { new UnknownWrapper[] { new UnknownWrapper(null), new UnknownWrapper(10) }, (VarEnum.VT_ARRAY | VarEnum.VT_UNKNOWN), (IntPtr)(-1), new object[] { null, 10 } }; + yield return new object[] { new ErrorWrapper[] { new ErrorWrapper(10) }, (VarEnum.VT_ARRAY | VarEnum.VT_ERROR), (IntPtr)(-1), new uint[] { 10 } }; + yield return new object[] { new CurrencyWrapper[] { new CurrencyWrapper(10) }, (VarEnum.VT_ARRAY | VarEnum.VT_CY), (IntPtr)(-1), new decimal[] { 10 } }; + yield return new object[] { new BStrWrapper[] { new BStrWrapper("a"), new BStrWrapper(null), new BStrWrapper("c") }, (VarEnum.VT_ARRAY | VarEnum.VT_BSTR), (IntPtr)(-1), new string[] { "a", null, "c" } }; // Objects. var nonGenericClass = new NonGenericClass(); - yield return new object[] { new NonGenericClass[] { nonGenericClass, null }, (VarEnum)8201, (IntPtr)(-1), new object[] { nonGenericClass, null } }; + yield return new object[] { new NonGenericClass[] { nonGenericClass, null }, (VarEnum.VT_ARRAY | VarEnum.VT_DISPATCH), (IntPtr)(-1), new object[] { nonGenericClass, null } }; var genericClass = new GenericClass(); - yield return new object[] { new GenericClass[] { genericClass, null }, (VarEnum)8205, (IntPtr)(-1), new object[] { genericClass, null } }; + yield return new object[] { new GenericClass[] { genericClass, null }, (VarEnum.VT_ARRAY | VarEnum.VT_UNKNOWN), (IntPtr)(-1), new object[] { genericClass, null } }; var classWithInterface = new ClassWithInterface(); var structWithInterface = new StructWithInterface(); - yield return new object[] { new ClassWithInterface[] { classWithInterface, null }, (VarEnum)8201, (IntPtr)(-1), new object[] { classWithInterface, null } }; - yield return new object[] { new INonGenericInterface[] { classWithInterface, structWithInterface, null }, (VarEnum)8201, (IntPtr)(-1), new object[] { classWithInterface, structWithInterface, null } }; + yield return new object[] { new ClassWithInterface[] { classWithInterface, null }, (VarEnum.VT_ARRAY | VarEnum.VT_DISPATCH), (IntPtr)(-1), new object[] { classWithInterface, null } }; + yield return new object[] { new INonGenericInterface[] { classWithInterface, structWithInterface, null }, (VarEnum.VT_ARRAY | VarEnum.VT_DISPATCH), (IntPtr)(-1), new object[] { classWithInterface, structWithInterface, null } }; // Enums. yield return new object[] { SByteEnum.Value2, VarEnum.VT_I1, (IntPtr)1, (sbyte)1 }; @@ -83,14 +92,14 @@ public static IEnumerable GetNativeVariantForObject_NonRoundtrippingPr yield return new object[] { UInt32Enum.Value2, VarEnum.VT_UI4, (IntPtr)1, (uint)1 }; yield return new object[] { UInt64Enum.Value2, VarEnum.VT_UI8, (IntPtr)1, (ulong)1 }; - yield return new object[] { new SByteEnum[] { SByteEnum.Value2 }, (VarEnum)8208, (IntPtr)(-1), new sbyte[] { 1 } }; - yield return new object[] { new Int16Enum[] { Int16Enum.Value2 }, (VarEnum)8194, (IntPtr)(-1), new short[] { 1 } }; - yield return new object[] { new Int32Enum[] { Int32Enum.Value2 }, (VarEnum)8195, (IntPtr)(-1), new int[] { 1 } }; - yield return new object[] { new Int64Enum[] { Int64Enum.Value2 }, (VarEnum)8212, (IntPtr)(-1), new long[] { 1 } }; - yield return new object[] { new ByteEnum[] { ByteEnum.Value2 }, (VarEnum)8209, (IntPtr)(-1), new byte[] { 1 } }; - yield return new object[] { new UInt16Enum[] { UInt16Enum.Value2 }, (VarEnum)8210, (IntPtr)(-1), new ushort[] { 1 } }; - yield return new object[] { new UInt32Enum[] { UInt32Enum.Value2 }, (VarEnum)8211, (IntPtr)(-1), new uint[] { 1 } }; - yield return new object[] { new UInt64Enum[] { UInt64Enum.Value2 }, (VarEnum)8213, (IntPtr)(-1), new ulong[] { 1 } }; + yield return new object[] { new SByteEnum[] { SByteEnum.Value2 }, (VarEnum.VT_ARRAY | VarEnum.VT_I1), (IntPtr)(-1), new sbyte[] { 1 } }; + yield return new object[] { new Int16Enum[] { Int16Enum.Value2 }, (VarEnum.VT_ARRAY | VarEnum.VT_I2), (IntPtr)(-1), new short[] { 1 } }; + yield return new object[] { new Int32Enum[] { Int32Enum.Value2 }, (VarEnum.VT_ARRAY | VarEnum.VT_I4), (IntPtr)(-1), new int[] { 1 } }; + yield return new object[] { new Int64Enum[] { Int64Enum.Value2 }, (VarEnum.VT_ARRAY | VarEnum.VT_I8), (IntPtr)(-1), new long[] { 1 } }; + yield return new object[] { new ByteEnum[] { ByteEnum.Value2 }, (VarEnum.VT_ARRAY | VarEnum.VT_UI1), (IntPtr)(-1), new byte[] { 1 } }; + yield return new object[] { new UInt16Enum[] { UInt16Enum.Value2 }, (VarEnum.VT_ARRAY | VarEnum.VT_UI2), (IntPtr)(-1), new ushort[] { 1 } }; + yield return new object[] { new UInt32Enum[] { UInt32Enum.Value2 }, (VarEnum.VT_ARRAY | VarEnum.VT_UI4), (IntPtr)(-1), new uint[] { 1 } }; + yield return new object[] { new UInt64Enum[] { UInt64Enum.Value2 }, (VarEnum.VT_ARRAY | VarEnum.VT_UI8), (IntPtr)(-1), new ulong[] { 1 } }; // Color is converted to uint. yield return new object[] { Color.FromArgb(10), VarEnum.VT_UI4, (IntPtr)655360, (uint)655360 };