SdkTests/Struct/MarshalledStructTests.cs (186 lines of code) (raw):
using System;
using SharpGen.Runtime;
using Xunit;
namespace Struct
{
public class MarshalledStructTests
{
[Fact]
public void StructWithArrayMakesArrayCorrectLength()
{
var obj = new StructWithArray();
Assert.Equal(3, obj.I.Length);
}
[Fact]
public void StructWithArrayMarshalsCorrectly()
{
var obj = new StructWithArray
{
J = 8.0
};
obj.I[0] = 3;
obj.I[1] = 5;
obj.I[2] = 42;
var result = Functions.PassThrough(obj);
Assert.Equal(obj.I[0], result.I[0]);
Assert.Equal(obj.I[1], result.I[1]);
Assert.Equal(obj.I[2], result.I[2]);
Assert.Equal(obj.J, result.J);
}
[Fact]
public void UnionMarshalsCorrectly()
{
var obj = new TestUnion
{
Decimal = 2.0f
};
Assert.Equal(obj.Integer, Functions.PassThrough(obj).Integer);
}
[Fact]
public void UnionWithArrayMemberMarshalsCorrectly()
{
var obj = new UnionWithArray();
obj.Parts[0] = 20u;
obj.Parts[1] = 40u;
var result = Functions.PassThrough(obj);
Assert.Equal(obj.Parts[0], result.Parts[0]);
Assert.Equal(obj.Parts[1], result.Parts[1]);
}
[Fact]
public void BitFieldMarshalsCorrectly()
{
var obj = new BitField
{
FirstBit = true,
LastBits = 42
};
var result = Functions.PassThrough(obj);
Assert.Equal(obj.FirstBit, result.FirstBit);
Assert.Equal(obj.LastBits, obj.LastBits);
}
[Fact]
public void InplaceAsciiStringMarshalsCorrectly()
{
var obj = new AsciiTest
{
SmallString = "Test"
};
Assert.Equal(obj.SmallString, Functions.PassThrough(obj).SmallString);
}
[Fact]
public void InplaceAsciiStringTruncatedToFit()
{
var obj = new AsciiTest
{
SmallString = "123456789011"
};
var result = Functions.PassThrough(obj);
Assert.Equal("123456789", result.SmallString);
Assert.Null(result.LargeString);
}
[Fact]
public void InplaceUtf16StringMarshalsCorrectly()
{
var obj = new Utf16Test
{
SmallString = "Test"
};
Assert.Equal(obj.SmallString, Functions.PassThrough(obj).SmallString);
}
[Fact]
public void AsciiStringMarshalsCorrectly()
{
var obj = new AsciiTest
{
LargeString = "This is a test"
};
Assert.Equal(obj.LargeString, Functions.PassThrough(obj).LargeString);
}
[Fact]
public void UtfStringMarshalsCorrectly()
{
var obj = new Utf16Test
{
LargeString = "This is a test"
};
Assert.Equal(obj.LargeString, Functions.PassThrough(obj).LargeString);
}
[Fact]
public void StructWithNestedMarshalTypeMarshalsCorrectly()
{
var obj = new NestedTest
{
Ascii = new AsciiTest
{
SmallString = "Test"
},
Utf = new Utf16Test
{
SmallString = "Test"
}
};
var result = Functions.PassThrough(obj);
Assert.Equal(obj.Ascii.SmallString, result.Ascii.SmallString);
Assert.Equal(obj.Utf.SmallString, result.Utf.SmallString);
}
[Fact]
public void BitFieldWithMarshalTypeMarshalsCorrectly()
{
var obj = new BitField2
{
ReservedBits = 20
};
Assert.True(Functions.VerifyReservedBits(obj));
obj.UpperBits = 4;
obj.LowerBits = 10;
Assert.True(Functions.VerifyReservedBits(obj));
}
[Fact]
public void BoolToIntMarshalsCorrectly()
{
var obj = new BoolToInt2
{
Test = true
};
Assert.True(Functions.PassThrough(obj).Test);
}
[Fact]
public void BoolToIntShortcutCorrectlyTracksValue()
{
var obj = new BoolToInt
{
Test = true
};
Assert.Equal(1, obj._Test);
}
[SkippableFact]
public void BoolArrayMemberMarshalsCorrectly()
{
Skip.If(IntPtr.Size < 8, "Known x86 issue - crashes the whole testhost");
var obj = new BoolArray();
obj.Elements[0] = true;
obj.Elements[1] = true;
var result = Functions.PassThrough(obj);
Assert.Equal(obj.Elements[0], result.Elements[0]);
Assert.Equal(obj.Elements[1], result.Elements[1]);
Assert.Equal(obj.Elements[2], result.Elements[2]);
}
[Fact]
public void InterfaceField()
{
var obj = Functions.GetStructWithInterface();
Assert.Equal(1, obj.Test.One());
var result = Functions.PassThrough(obj);
Assert.Equal(1, obj.Test.One());
}
[Fact]
public void PointerSizeMember()
{
var obj = new PointerSizeMember
{
PointerSize = new PointerSize(25)
};
Assert.Equal(new PointerSize(25), Functions.PassThrough(obj).PointerSize);
}
}
}