SdkTests/Interface/AutoShadowTests.cs (235 lines of code) (raw):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Disposables;
using System.Text;
using SharpGen.Runtime;
using Xunit;
namespace Interface
{
public class AutoShadowTests
{
public AutoShadowTests()
{
}
private static IDisposable SetupTests(bool supportExceptions, out CallbackInterfaceNative nativeView, out ManagedImplementation target)
{
target = supportExceptions ? new ExceptionEnabledManagedImplementation() : new ManagedImplementation();
nativeView = new CallbackInterfaceNative(MarshallingHelpers.ToCallbackPtr<CallbackInterface>(target));
return new CompositeDisposable
{
target,
nativeView
};
}
[Fact]
public void OutParameterCorrectlySet()
{
using (SetupTests(false, out var nativeView, out _))
{
var zero = nativeView.GetZero();
Assert.Equal(0, zero);
}
}
[Fact]
public void SimpleParameters()
{
using (SetupTests(false, out var nativeView, out _))
{
Assert.Equal(3, nativeView.Add(1, 2));
}
}
[Fact]
public void StringMarshalling()
{
using (SetupTests(false, out var nativeView, out _))
{
var str = "ABC";
Assert.Equal('A', nativeView.GetFirstCharacter(str));
Assert.Equal((byte)'A', nativeView.GetFirstAnsiCharacter(str));
}
}
[Fact]
public void RefParameter()
{
using (SetupTests(false, out var nativeView, out _))
{
var i = 4;
nativeView.Increment(ref i);
Assert.Equal(5, i);
}
}
[Fact]
public void LargeStruct()
{
using (SetupTests(false, out var nativeView, out _))
{
var result = nativeView.GetLargeStruct(4, 10);
Assert.Equal(4, result.A);
Assert.Equal(10, result.B);
}
}
[Fact]
public void MarshalledLargeStruct()
{
using (SetupTests(false, out var nativeView, out _))
{
var result = nativeView.GetLargeMarshalledStruct(3, 2, 1);
Assert.Equal(3, result.I[0]);
Assert.Equal(2, result.I[1]);
Assert.Equal(1, result.I[2]);
}
}
[Fact]
public void MappedType()
{
using (SetupTests(false, out var nativeView, out _))
{
Assert.Equal(20, nativeView.MappedTypeTest(20));
}
}
[Fact]
public void InInterfaceParameter()
{
using (SetupTests(false, out var nativeView, out _))
{
using (var test = new ManagedImplementation())
{
Assert.True(nativeView.AreEqual(test));
}
}
}
[Fact]
public void OutInterfaceParameters()
{
using (SetupTests(false, out var nativeView, out _))
{
var test = nativeView.CloneInstance();
using (test)
{
Assert.Equal(1, test.Add(0, 1));
}
}
}
[Fact]
public void ExceptionsOnResultReturningMethods()
{
using (SetupTests(false, out var nativeView, out var target))
{
target.ThrowExceptionInClone = true;
Assert.Throws<SharpGen.Runtime.SharpGenException>(() => nativeView.CloneInstance());
}
}
[Fact]
public void ExceptionsRethrownOnManagedSideWhenSupportIsImplemented()
{
using (SetupTests(true, out var nativeView, out var target))
{
target.ThrowExceptionInClone = true;
Assert.Throws<InvalidOperationException>(() => nativeView.CloneInstance());
}
}
[Fact]
public void ReturnMappings()
{
using (SetupTests(false, out var nativeView, out var target))
{
IntPtr val = new IntPtr(5);
Assert.Equal(val, nativeView.ModifyPointer(val, MethodOperation.PassThrough));
Assert.Equal(new IntPtr(6), nativeView.ModifyPointer(val, 0));
}
}
[Fact]
public void ValueTypeArrayReverseMarshalling()
{
using (SetupTests(false, out var nativeView, out _))
{
var array = new int[] {1,2,3,4,5};
Assert.Equal(15, nativeView.ArrayRelationSum(array));
}
}
class ExceptionEnabledManagedImplementation : ManagedImplementation, IExceptionCallback
{
public void RaiseException(Exception e)
{
throw e;
}
}
class ManagedImplementation : CallbackBase, CallbackInterface
{
public bool ThrowExceptionInClone { get; set; }
public int Add(int i, int j)
{
return i + j;
}
public bool AreEqual(CallbackInterface rhs)
{
return Add(1, 1) == rhs.Add(1, 1);
}
public CallbackInterface CloneInstance()
{
if (ThrowExceptionInClone)
{
throw new InvalidOperationException();
}
return new ManagedImplementation();
}
public byte GetFirstAnsiCharacter(string str)
{
return Encoding.ASCII.GetBytes(str)[0];
}
public char GetFirstCharacter(string str)
{
return str[0];
}
public LargeStructWithMarshalling GetLargeMarshalledStruct(long a, long b, long c)
{
var result = new LargeStructWithMarshalling();
result.I[0] = a;
result.I[1] = b;
result.I[2] = c;
return result;
}
public LargeStruct GetLargeStruct(long a, long b)
{
return new LargeStruct
{
A = a,
B = b
};
}
public int GetZero()
{
return 0;
}
public void Increment(ref int valueRef)
{
valueRef += 1;
}
public int MappedTypeTest(uint i)
{
return (int)i;
}
public IntPtr ModifyPointer(IntPtr ptr, MethodOperation op)
{
if (op != MethodOperation.PassThrough)
{
return IntPtr.Add(ptr, 1);
}
return ptr;
}
public bool ArrayRelationAnd(bool[] arr)
{
return arr.Aggregate(true, (agg, val) => agg && val);
}
public int ArrayRelationSum(int[] arr)
{
return arr.Sum();
}
public long ArrayRelationSumStruct(LargeStructWithMarshalling[] arr)
{
return arr.SelectMany(x => x.I).Sum();
}
}
}
}