mirror of https://github.com/dahall/Vanara.git
170 lines
6.4 KiB
C#
170 lines
6.4 KiB
C#
using NUnit.Framework;
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.Security;
|
|
using Vanara.PInvoke;
|
|
|
|
namespace Vanara.InteropServices.Tests
|
|
{
|
|
[TestFixture()]
|
|
public class SafeCoTaskMemHandleTests
|
|
{
|
|
[Test(Description = "Allocate an enumeration")]
|
|
public void CreateFromListTest()
|
|
{
|
|
var r = new[] { 5, 5, 5, 5 };
|
|
var h = SafeCoTaskMemHandle.CreateFromList(r, r.Length);
|
|
Assert.That(!h.IsClosed && !h.IsInvalid);
|
|
Assert.That((int)h.Size, Is.EqualTo(Marshal.SizeOf(typeof(int)) * r.Length));
|
|
Assert.That(h.ToStructure<int>(), Is.EqualTo(5));
|
|
Assert.That(h.ToEnumerable<int>(4), Has.Exactly(4).EqualTo(5).And.Exactly(4).Items);
|
|
|
|
var d = new[] { new RECT(1, 1, 1, 1), new RECT(2, 2, 2, 2) };
|
|
h = SafeCoTaskMemHandle.CreateFromList(d, d.Length);
|
|
Assert.That(!h.IsClosed && !h.IsInvalid);
|
|
Assert.That((int)h.Size, Is.EqualTo(Marshal.SizeOf(typeof(RECT)) * d.Length));
|
|
Assert.That(h.ToStructure<RECT>().X, Is.EqualTo(1));
|
|
Assert.That(h.ToArray<RECT>(2), Has.Exactly(2).Items);
|
|
|
|
var p = new[] { new PRECT(1, 1, 1, 1), new PRECT(2, 2, 2, 2) };
|
|
h = SafeCoTaskMemHandle.CreateFromList(p);
|
|
Assert.That(!h.IsClosed && !h.IsInvalid);
|
|
Assert.That((int)h.Size, Is.EqualTo(Marshal.SizeOf(typeof(PRECT)) * p.Length));
|
|
Assert.That(h.ToArray<RECT>(2), Has.Exactly(2).Items);
|
|
|
|
Assert.That(() => SafeCoTaskMemHandle.CreateFromList(new[] { "X" }), Throws.ArgumentException);
|
|
}
|
|
|
|
[Test(Description = "Allocate an enumeration of strings.")]
|
|
public void CreateFromStringListTest()
|
|
{
|
|
var r = new[] { "5", "5", "5", "5" };
|
|
|
|
var h = SafeCoTaskMemHandle.CreateFromStringList(r, StringListPackMethod.Concatenated, CharSet.Ansi, 7);
|
|
Assert.That(!h.IsClosed && !h.IsInvalid);
|
|
Assert.That((int)h.Size, Is.EqualTo(16));
|
|
Assert.That(h.ToStringEnum(CharSet.Ansi, 7), Has.Exactly(4).EqualTo("5").And.Exactly(4).Items);
|
|
h = SafeCoTaskMemHandle.CreateFromStringList(r, StringListPackMethod.Concatenated, CharSet.Unicode, 7);
|
|
Assert.That(!h.IsClosed && !h.IsInvalid);
|
|
Assert.That((int)h.Size, Is.EqualTo(25));
|
|
Assert.That(h.ToStringEnum(CharSet.Unicode, 7), Has.Exactly(4).EqualTo("5").And.Exactly(4).Items);
|
|
h = SafeCoTaskMemHandle.CreateFromStringList(r);
|
|
Assert.That(!h.IsClosed && !h.IsInvalid);
|
|
Assert.That((int)h.Size, Is.EqualTo(18));
|
|
Assert.That(h.ToString(-1), Is.EqualTo("5"));
|
|
Assert.That(h.ToStringEnum(), Has.Exactly(4).EqualTo("5").And.Exactly(4).Items);
|
|
|
|
h = SafeCoTaskMemHandle.CreateFromStringList(r, StringListPackMethod.Packed, CharSet.Ansi, 7);
|
|
Assert.That(!h.IsClosed && !h.IsInvalid);
|
|
Assert.That((int)h.Size, Is.EqualTo(7 + IntPtr.Size + r.Length * (2 + IntPtr.Size)));
|
|
Assert.That(h.ToStringEnum(4, CharSet.Ansi, 7), Has.Exactly(4).EqualTo("5").And.Exactly(4).Items);
|
|
h = SafeCoTaskMemHandle.CreateFromStringList(r, StringListPackMethod.Packed, CharSet.Unicode, 7);
|
|
Assert.That(!h.IsClosed && !h.IsInvalid);
|
|
Assert.That((int)h.Size, Is.EqualTo(7 + IntPtr.Size + r.Length * (4 + IntPtr.Size)));
|
|
Assert.That(h.ToStringEnum(4, CharSet.Unicode, 7), Has.Exactly(4).EqualTo("5").And.Exactly(4).Items);
|
|
h = SafeCoTaskMemHandle.CreateFromStringList(r, StringListPackMethod.Packed);
|
|
Assert.That(!h.IsClosed && !h.IsInvalid);
|
|
Assert.That((int)h.Size, Is.EqualTo(IntPtr.Size + r.Length * (4 + IntPtr.Size)));
|
|
Assert.That(h.ToStringEnum(4, CharSet.Unicode), Has.Exactly(4).EqualTo("5").And.Exactly(4).Items);
|
|
|
|
h = SafeCoTaskMemHandle.CreateFromStringList(null);
|
|
Assert.That((int)h.Size, Is.EqualTo(Extensions.StringHelper.GetCharSize()));
|
|
}
|
|
|
|
[Test(Description = "Allocate a structure")]
|
|
public void CreateFromStructureTest()
|
|
{
|
|
var r = new RECT(5, 5, 5, 5);
|
|
var h = SafeCoTaskMemHandle.CreateFromStructure(r);
|
|
Assert.That(!h.IsClosed && !h.IsInvalid);
|
|
Assert.That((int)h.Size, Is.EqualTo(Marshal.SizeOf(typeof(RECT))));
|
|
Assert.That(h.ToStructure<RECT>().X, Is.EqualTo(5));
|
|
}
|
|
|
|
[Test()]
|
|
public void ResizeTest()
|
|
{
|
|
var h = new SafeCoTaskMemHandle(5);
|
|
Assert.That(!h.IsClosed && !h.IsInvalid && h.Size == 5);
|
|
var ptr = (IntPtr)h;
|
|
h.Size = 50;
|
|
Assert.That(!h.IsClosed && !h.IsInvalid && h.Size == 50 && (IntPtr)h != ptr);
|
|
}
|
|
|
|
[Test()]
|
|
public void SafeCoTaskMemHandleTest()
|
|
{
|
|
var h = new SafeCoTaskMemHandle(5);
|
|
Assert.That(!h.IsClosed && !h.IsInvalid);
|
|
Assert.That((int)h.Size, Is.EqualTo(5));
|
|
h.Dispose();
|
|
Assert.That(h.IsClosed && h.IsInvalid);
|
|
|
|
h = Marshal.AllocCoTaskMem(5);
|
|
Assert.That(!h.IsClosed && !h.IsInvalid);
|
|
Assert.That(h, Is.Not.EqualTo(SafeHGlobalHandle.Null));
|
|
h.Dispose();
|
|
Assert.That(h.IsClosed && h.IsInvalid);
|
|
|
|
Assert.That(SafeCoTaskMemHandle.Null.IsInvalid, Is.True);
|
|
|
|
Assert.That(() => new SafeCoTaskMemHandle(-1), Throws.TypeOf<ArgumentOutOfRangeException>());
|
|
}
|
|
|
|
[Test()]
|
|
public void SafeCoTaskMemHandleTest1()
|
|
{
|
|
var h = new SafeCoTaskMemHandle(Marshal.AllocCoTaskMem(5), 5);
|
|
Assert.That(!h.IsClosed && !h.IsInvalid);
|
|
Assert.That((int)h.Size, Is.EqualTo(5));
|
|
h.Dispose();
|
|
Assert.That(h.IsClosed && h.IsInvalid);
|
|
}
|
|
|
|
[Test()]
|
|
public void SafeCoTaskMemHandleTest2()
|
|
{
|
|
var h = new SafeCoTaskMemHandle(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 });
|
|
Assert.That(!h.IsClosed && !h.IsInvalid);
|
|
Assert.That((int)h.Size, Is.EqualTo(10));
|
|
h.Dispose();
|
|
Assert.That(h.IsClosed && h.IsInvalid);
|
|
}
|
|
|
|
[Test()]
|
|
public void SafeCoTaskMemHandleTest3()
|
|
{
|
|
var h = new SafeCoTaskMemHandle(new[] { (IntPtr)1, (IntPtr)2, (IntPtr)3, (IntPtr)4, (IntPtr)5 });
|
|
Assert.That(!h.IsClosed && !h.IsInvalid);
|
|
Assert.That((int)h.Size, Is.EqualTo(5 * IntPtr.Size));
|
|
h.Dispose();
|
|
Assert.That(h.IsClosed && h.IsInvalid);
|
|
}
|
|
|
|
[Test()]
|
|
public void SafeCoTaskMemHandleTest4()
|
|
{
|
|
var h = new SafeCoTaskMemHandle("0123456789");
|
|
Assert.That(!h.IsClosed && !h.IsInvalid);
|
|
Assert.That((int)h.Size, Is.EqualTo(11 * Marshal.SystemDefaultCharSize));
|
|
h.Dispose();
|
|
Assert.That(h.IsClosed && h.IsInvalid);
|
|
}
|
|
|
|
[Test()]
|
|
public void CoTaskMemoryMethodsTest()
|
|
{
|
|
var mm = new CoTaskMemoryMethods();
|
|
var h = mm.AllocStringAnsi("Test");
|
|
Assert.That(h, Is.Not.EqualTo(IntPtr.Zero));
|
|
Assert.That(() => mm.FreeMem(h), Throws.Nothing);
|
|
var ss = new SecureString();
|
|
h = mm.AllocSecureStringUni(ss);
|
|
Assert.That(h, Is.Not.EqualTo(IntPtr.Zero));
|
|
Assert.That(() => mm.FreeSecureStringUni(h), Throws.Nothing);
|
|
h = mm.AllocSecureStringAnsi(ss);
|
|
Assert.That(h, Is.Not.EqualTo(IntPtr.Zero));
|
|
Assert.That(() => mm.FreeSecureStringAnsi(h), Throws.Nothing);
|
|
}
|
|
}
|
|
} |