SdkTests/Functions/ParameterMarshallingTests.cs (215 lines of code) (raw):
using System;
using System.Runtime.InteropServices;
using SharpGen.Runtime;
using Xunit;
namespace Functions
{
public class ParameterMarshallingTests
{
[Fact]
public void InterfaceOutArrays()
{
int num = 3;
Interface[] results = new Interface[num];
NativeFunctions.GetInterfaces(num, results);
foreach (var result in results)
{
result.Method();
}
}
[Fact]
public void InterfaceOutArraysOptional()
{
int num = 3;
NativeFunctions.GetInterfacesOptional(num, null);
}
[Fact]
public void OutIntArray()
{
int num = 3;
int[] results = new int[num];
NativeFunctions.GetIntArray(num, results);
for (int i = 0; i < num; i++)
{
Assert.Equal(i, results[i]);
}
}
[Fact]
public void StringMarshalling()
{
Assert.Equal('W', NativeFunctions.GetFirstCharacter("Wide-char test"));
Assert.Equal((byte)'A', NativeFunctions.GetFirstAnsiCharacter("Ansi-char test"));
}
[Fact]
public void StructMarshalling()
{
var defaultMarshalling = new StructWithMarshal();
defaultMarshalling.I[1] = 6;
var staticMarshalling = new StructWithStaticMarshal();
staticMarshalling.I[1] = 10;
NativeFunctions.StructMarshalling(defaultMarshalling, staticMarshalling, out var defaultOut, out var staticOut);
Assert.Equal(defaultMarshalling.I[1], defaultOut.I[1]);
Assert.Equal(staticMarshalling.I[1], staticOut.I[1]);
}
[Fact]
public void StructArray()
{
var defaultMarshalling = new[] { new StructWithMarshal() };
var staticMarshalling = new[] { new StructWithStaticMarshal() };
defaultMarshalling[0].I[1] = 10;
staticMarshalling[0].I[1] = 30;
var defaultMarshallingOut = new[] { new StructWithMarshal() };
var staticMarshallingOut = new[] { new StructWithStaticMarshal() };
NativeFunctions.StructArrayMarshalling(
defaultMarshalling,
staticMarshalling ,
defaultMarshallingOut,
staticMarshallingOut );
Assert.Equal(defaultMarshalling[0].I[1], defaultMarshallingOut[0].I[1]);
Assert.Equal(staticMarshalling[0].I[1], staticMarshallingOut[0].I[1]);
}
[Fact]
public void FastOut()
{
var iface = new Interface(IntPtr.Zero);
NativeFunctions.FastOutTest(iface);
Assert.NotEqual(IntPtr.Zero, iface.NativePointer);
}
[Fact]
public void Enum()
{
Assert.Equal(1, (int)NativeFunctions.PassThroughEnum(MyEnum.TestValue));
}
[Fact]
public void EnumOut()
{
var value = NativeFunctions.EnumOut();
Assert.Equal(MyEnum.TestValue, value);
}
[Fact]
public void RefParameterTest()
{
int i = 1;
NativeFunctions.Increment(ref i);
Assert.Equal(2, i);
}
[Fact]
public void NullableParameterTest()
{
Assert.Equal(2, NativeFunctions.Add(2, null));
Assert.Equal(2, NativeFunctions.Add(1, 1));
}
[Fact]
public void BoolToIntTest()
{
Assert.True(NativeFunctions.BoolToIntTest(true));
Assert.False(NativeFunctions.BoolToIntTest(false));
}
[Fact]
public void BoolArrayTest()
{
var inArray = new bool[2];
inArray[1] = true;
var outArray = new bool[2];
NativeFunctions.BoolArrayTest(inArray, outArray, 2);
Assert.False(outArray[0]);
Assert.True(outArray[1]);
}
[Fact]
public void StringReturnTest()
{
Assert.Equal("Functions", NativeFunctions.GetName());
}
[Fact]
public void StructRefParameter()
{
var csStruct = new StructWithMarshal();
NativeFunctions.SetAllElements(ref csStruct);
Assert.Equal(10, csStruct.I[0]);
Assert.Equal(10, csStruct.I[1]);
Assert.Equal(10, csStruct.I[2]);
}
[Fact]
public void NullableStructParameter()
{
Assert.Equal(0, NativeFunctions.FirstElementOrZero(null));
var csStruct = new StructWithMarshal();
csStruct.I[0] = 4;
Assert.Equal(csStruct.I[0], NativeFunctions.FirstElementOrZero(csStruct));
}
[Fact]
public void OptionalArrayOfStruct()
{
var elements = new [] { new SimpleStruct{ I = 1 } };
Assert.Equal(1, NativeFunctions.Sum(1, elements));
Assert.Equal(0, NativeFunctions.Sum(0, null));
}
[Fact]
public void ParamsArray()
{
Assert.Equal(10, NativeFunctions.Product(1, new SimpleStruct{ I = 10 }));
}
[Fact]
public void ForcePassByValueParameter()
{
var value = new LargeStruct();
value.I[0] = 10;
value.I[1] = 20;
value.I[2] = 30;
Assert.Equal(60, NativeFunctions.SumValues(value));
}
[Fact]
public void PointerSize()
{
var value = new PointerSize(20);
Assert.Equal(new PointerSize(20), NativeFunctions.PassThroughPointerSize(value));
}
[Fact]
public void OptionalStructArrayOut()
{
NativeFunctions.StructArrayOut(new StructWithMarshal(), null);
}
[Fact]
public void ArrayOfStructAsClass()
{
var test = new [] { new StructAsClass {I = 1}, new StructAsClass {I = 2}};
Assert.Equal(3, NativeFunctions.SumInner(test, 2));
}
[Fact]
public void WrappedStructAsClass()
{
Assert.Equal(1, NativeFunctions.GetWrapper().Wrapped.I);
}
[Fact]
public unsafe void OptionalInOutStructPointer()
{
var test = new SimpleStruct { I = 5 };
void* addr = &test;
NativeFunctions.AddOne((IntPtr)addr);
Assert.Equal(6, test.I);
}
[Fact]
public void EnumArrayTest()
{
var test = new [] { MyEnum.TestValue, MyEnum.TestValue };
Assert.Equal(MyEnum.TestValue, NativeFunctions.FirstEnumElement(test));
}
[Fact]
public unsafe void PreserveVoidPointer1()
{
var ptr = Marshal.AllocHGlobal(4);
Marshal.WriteInt32(ptr, 42);
Assert.True(NativeFunctions.PreserveVoidPointer1None(ptr));
Assert.True(NativeFunctions.PreserveVoidPointer1False(ptr));
Assert.True(NativeFunctions.PreserveVoidPointer1True((void*) ptr));
Marshal.FreeHGlobal(ptr);
}
[Fact]
public unsafe void PreserveVoidPointer2()
{
Assert.True(NativeFunctions.PreserveVoidPointer2None((IntPtr) 42));
Assert.True(NativeFunctions.PreserveVoidPointer2False((IntPtr) 42));
Assert.True(NativeFunctions.PreserveVoidPointer2True((void*) 42));
}
}
}