diff --git a/UnitTests/PInvoke/Ole/Ole32/OleAut32Tests.cs b/UnitTests/PInvoke/Ole/Ole32/OleAut32Tests.cs index 0138dd1a..5ff2bc16 100644 --- a/UnitTests/PInvoke/Ole/Ole32/OleAut32Tests.cs +++ b/UnitTests/PInvoke/Ole/Ole32/OleAut32Tests.cs @@ -27,7 +27,7 @@ namespace Vanara.PInvoke.Tests [Test] public void SafeArrayCreateTest() { - using (var psa = SafeArrayCreate(VARTYPE.VT_I8, 1, new SAFEARRAYBOUND(5))) + using (var psa = SafeArrayCreate(VARTYPE.VT_I8, 1, new[] { new SAFEARRAYBOUND(5) })) SafeArrayMethodTest(psa, 5); } @@ -45,7 +45,7 @@ namespace Vanara.PInvoke.Tests [Test] public void SafeArrayCreateExTest() { - using (var psa = SafeArrayCreateEx(VARTYPE.VT_I8, 1, new SAFEARRAYBOUND(5), IntPtr.Zero)) + using (var psa = SafeArrayCreateEx(VARTYPE.VT_I8, 1, new[] { new SAFEARRAYBOUND(5) }, IntPtr.Zero)) SafeArrayMethodTest(psa, 5); } @@ -104,6 +104,45 @@ namespace Vanara.PInvoke.Tests psa.Dispose(); } + [Test] + public void SafeSAFEARRAYConvert1DimTest() + { + // Setup SAFEARRAY + var array = new int[] { 1, 2, 3, 4 }; + using var sa = SafeSAFEARRAY.CreateFromArray(array, VARTYPE.VT_I4); + Assert.That(sa.Length, Is.EqualTo(array.Length)); + Assert.That(sa.Rank, Is.EqualTo(array.Rank)); + + var toarray = sa.ToArray(); + Assert.That(toarray, Is.EquivalentTo(array)); + + var i = sa.GetValue(3); + Assert.That(i, Is.EqualTo(array[3])); + sa.SetValue(i + 10, 3); + Assert.That(sa.GetValue(3), Is.EqualTo(i + 10)); + Assert.That(sa.GetValue(3), Is.EqualTo(i + 10)); + } + + [Test] + public void SafeSAFEARRAYConvertMultDimTest() + { + // Setup SAFEARRAY + var array = new int[2, 3, 4] { { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } }, { { 13, 14, 15, 16 }, { 17, 18, 19, 20 }, { 21, 22, 23, 24 } } }; + using var sa = SafeSAFEARRAY.CreateFromArray(array, VARTYPE.VT_I4); + Assert.That(sa.Length, Is.EqualTo(array.Length)); + Assert.That(sa.Rank, Is.EqualTo(array.Rank)); + + var toarray = sa.ToArray(); + Assert.That(toarray, Is.EquivalentTo(array)); + + var i = sa.GetValue(1, 2, 3); + Assert.That(i, Is.EqualTo(array[1, 2, 3])); + sa.SetValue(i + 10, 1, 2, 3); + Assert.That(sa.GetValue(1, 2, 3), Is.EqualTo(i + 10)); + Assert.That(sa.GetValue(1, 2, 3), Is.EqualTo(i + 10)); + } + + // TODO: [Test] public void VariantClearTest() { diff --git a/UnitTests/PInvoke/Ole/Ole32/PROPVARIANTTests.cs b/UnitTests/PInvoke/Ole/Ole32/PROPVARIANTTests.cs index 55ed3fc0..bcf38dfd 100644 --- a/UnitTests/PInvoke/Ole/Ole32/PROPVARIANTTests.cs +++ b/UnitTests/PInvoke/Ole/Ole32/PROPVARIANTTests.cs @@ -102,6 +102,7 @@ namespace Vanara.PInvoke.Tests [TestCase(VARTYPE.VT_CF, "pclipdata")] [TestCase(VARTYPE.VT_ARRAY | VARTYPE.VT_VARIANT, "parray")] + [TestCase(VARTYPE.VT_ARRAY | VARTYPE.VT_I4, "parray")] [TestCase(VARTYPE.VT_BLOB, "blob")] [TestCase(VARTYPE.VT_BSTR, "bstrVal")] [TestCase(VARTYPE.VT_BYREF | VARTYPE.VT_BSTR, "pbstrVal")] @@ -160,6 +161,23 @@ namespace Vanara.PInvoke.Tests }, Throws.Nothing); } + [Test] + public void PROPVARIANTArrayTest() + { + // Setup SAFEARRAY + var array = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + using var sa = SafeSAFEARRAY.CreateFromArray(array, VARTYPE.VT_I4); + + // Add it to a PV + using var pv = new PROPVARIANT(sa, VarEnum.VT_ARRAY | VarEnum.VT_I4); + Assert.That(PropVariantGetElementCount(pv), Is.EqualTo(array.Length)); + Assert.That(PropVariantGetInt32Elem(pv, 5, out var iVal), ResultIs.Successful); + Assert.That(iVal, Is.EqualTo(array[5])); + + // Check GetValue func + Assert.That(pv.parray, Is.EquivalentTo(array)); + } + [TestCase(true, VARTYPE.VT_BOOL, "boolVal")] [TestCase((byte)255, VARTYPE.VT_UI1, "bVal")] [TestCase((sbyte)-126, VARTYPE.VT_I1, "cVal")] @@ -241,6 +259,14 @@ namespace Vanara.PInvoke.Tests { case VARTYPE.VT_ARRAY | VARTYPE.VT_VARIANT: return new object[] { 100, "100" }; + case VARTYPE.VT_ARRAY | VARTYPE.VT_I4: + var sa = SafeArrayCreateVector(VARTYPE.VT_I4, 0, 4U); + for (int i = 0; i < 4U; i++) + { + using var p = new PinnedObject(i); + SafeArrayPutElement(sa, i, p); + } + return sa; case VARTYPE.VT_BLOB: return new BLOB { cbSize = 200, pBlobData = Marshal.AllocCoTaskMem(200) }; case VARTYPE.VT_CY: