1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-14 14:24:10 +02:00
Beef/IDEHelper/Tests/src/Interop.bf
2021-01-28 05:41:34 -08:00

532 lines
14 KiB
Beef

using System;
namespace Tests
{
class Interop
{
[CRepr]
public struct StructA
{
public int32 mA;
[LinkName(.CPP)]
public static extern int32 sVal;
[LinkName(.CPP)]
public extern int32 MethodA0(int32 arg0) mut;
[LinkName(.CPP)]
public extern StructA MethodA1(StructA sa, int32 arg0) mut;
[LinkName(.CPP)]
[return: MangleConst]
public extern ref float MethodA2([MangleConst]ref float val);
[LinkName(.CPP)]
[return: MangleConst]
public extern ref float MethodA3(in float val);
}
[CRepr]
public struct StructB
{
public int32 mA;
public int8 mB;
[LinkName(.CPP)]
public extern int32 MethodB0(int32 arg0) mut;
[LinkName(.CPP)]
public extern StructB MethodB1(StructB sa, int32 arg0) mut;
}
[CRepr]
public struct StructC
{
public int8 mA;
public int32 mB;
[LinkName(.CPP)]
public extern int32 MethodC0(int32 arg0) mut;
[LinkName(.CPP)]
public extern StructC MethodC1(StructC sa, int32 arg0) mut;
}
[CRepr]
public struct StructD
{
public int32 mA;
public int32 mB;
[LinkName(.CPP)]
public extern int32 MethodD0(int32 arg0) mut;
[LinkName(.CPP)]
public extern StructD MethodD1(StructD sa, int32 arg0) mut;
}
[CRepr]
public struct StructE
{
public int32 mA;
public int32 mB;
public int32 mC;
[LinkName(.CPP)]
public extern int32 MethodE0(int32 arg0) mut;
[LinkName(.CPP)]
public extern StructE MethodE1(StructE sa, int32 arg0) mut;
}
[CRepr]
public struct StructF
{
public int8 mA;
public int8 mB;
public int8 mC;
[LinkName(.CPP)]
public extern int32 MethodF0(int32 arg0) mut;
[LinkName(.CPP)]
public extern StructF MethodF1(StructF sa, int32 arg0) mut;
}
[CRepr]
public struct StructG
{
public int8 mA;
public int8 mB;
public int8 mC;
public int8 mD;
[LinkName(.CPP)]
public extern int32 MethodG0(int32 arg0) mut;
[LinkName(.CPP)]
public extern StructG MethodG1(StructG sa, int32 arg0) mut;
}
[CRepr]
public struct StructH
{
public int64 mA;
public int64 mB;
public int64 mC;
[LinkName(.CPP)]
public extern int32 MethodH0(int32 arg0) mut;
[LinkName(.CPP)]
public extern StructH MethodH1(StructH sa, int32 arg0) mut;
}
[CRepr]
public struct StructI
{
public int8 mA;
public int8 mB;
public int8 mC;
public int8 mD;
public int8 mE;
[LinkName(.CPP)]
public extern int32 MethodI0(int32 arg0) mut;
[LinkName(.CPP)]
public extern StructI MethodI1(StructI sa, int32 arg0) mut;
}
[CRepr]
public struct StructJ
{
public char8* mPtr;
public int mLength;
[LinkName(.CPP)]
public extern int32 MethodJ0(int32 arg0) mut;
[LinkName(.CPP)]
public extern StructJ MethodJ1(StructJ sa, int32 arg0) mut;
}
[CRepr]
public struct StructK
{
public float mX;
public float mY;
}
[CRepr]
struct StructL
{
public float mX;
public float mY;
public float mZ;
}
[CRepr]
struct StructM
{
public float mX;
public float mY;
public float mZ;
public float mW;
}
[CRepr]
struct StructN
{
public float mX;
public float mY;
public float mZ;
public float mW;
public float mU;
}
[CRepr]
struct StructO
{
public float mX;
public int32 mY;
}
[CRepr]
struct StructP
{
public float mX;
public float mY;
public int32 mZ;
}
[CRepr]
struct StructQ
{
public float mX;
public float mY;
public int32 mZ;
public int32 mW;
}
[CRepr]
struct StructR
{
public double mX;
public double mY;
}
[CRepr]
struct StructS
{
public float mX;
public double mY;
}
[CRepr]
struct StructT
{
public double mX;
public double mY;
public double mZ;
}
[CRepr]
struct StructU
{
public StructK mK;
}
[CRepr]
struct StructV
{
public int64 mX;
public int16 mY;
}
[CRepr]
struct StructW
{
public float mX;
}
[LinkName(.C)]
public static extern int32 Func0(int32 a, int32 b);
[LinkName(.C)]
public static extern int32 Func0K(int32 a, StructK b);
[LinkName(.C)]
public static extern int32 Func0L(int32 a, StructL b);
[LinkName(.C)]
public static extern int32 Func0M(int32 a, StructM b);
[LinkName(.C)]
public static extern int32 Func0N(int32 a, StructN b);
[LinkName(.C)]
public static extern int32 Func0O(int32 a, StructO b);
[LinkName(.C)]
public static extern int32 Func0P(int32 a, StructP b);
[LinkName(.C)]
public static extern int32 Func0Q(int32 a, StructQ b);
[LinkName(.C)]
public static extern int32 Func0R(int32 a, StructR b);
[LinkName(.C)]
public static extern int32 Func0S(int32 a, StructS b);
[LinkName(.C)]
public static extern int32 Func0T(int32 a, StructT b);
[LinkName(.C)]
public static extern int32 Func0U(int32 a, StructU b);
[LinkName(.C)]
public static extern int32 Func0V(int32 a, StructV b);
[LinkName(.C)]
public static extern int32 Func0W(int32 a, StructW b);
[LinkName(.C)]
public static extern int32 Func0KM(StructK a, StructM b, StructK c);
[LinkName(.C)]
public static extern int32 Func1A(StructA arg0, StructA arg1, int32 arg2);
[LinkName(.C)]
public static extern int32 Func1B(StructB arg0, StructB arg1, int32 arg2);
[LinkName(.C)]
public static extern int32 Func1C(StructC arg0, StructC arg1, int32 arg2);
[LinkName(.C)]
public static extern int32 Func1D(StructD arg0, StructD arg1, int32 arg2);
[LinkName(.C)]
public static extern int32 Func1E(StructE arg0, StructE arg1, int32 arg2);
[LinkName(.C)]
public static extern int32 Func1F(StructF arg0, StructF arg1, int32 arg2);
[LinkName(.C)]
public static extern int32 Func1G(StructG arg0, StructG arg1, int32 arg2);
[LinkName(.C)]
public static extern int32 Func1H(StructH arg0, StructH arg1, int32 arg2);
[LinkName(.C)]
public static extern int32 Func1I(StructI arg0, StructI arg1, int32 arg2);
[LinkName(.C)]
public static extern StructA Func2A(StructA arg0, int32 arg2);
[LinkName(.C)]
public static extern StructB Func2B(StructB arg0, int32 arg2);
[LinkName(.C)]
public static extern StructC Func2C(StructC arg0, int32 arg2);
[LinkName(.C)]
public static extern StructD Func2D(StructD arg0, int32 arg2);
[LinkName(.C)]
public static extern StructE Func2E(StructE arg0, int32 arg2);
[LinkName(.C)]
public static extern StructF Func2F(StructF arg0, int32 arg2);
[LinkName(.C)]
public static extern StructG Func2G(StructG arg0, int32 arg2);
[LinkName(.C)]
public static extern StructH Func2H(StructH arg0, int32 arg2);
[LinkName(.C)]
public static extern StructI Func2I(StructI arg0, int32 arg2);
[LinkName(.C)]
public static extern StructJ Func4J(StructJ arg0, StructJ arg1, StructJ arg2, StructJ arg3);
[LinkName(.C)]
public static extern double Func5(float[2] v0, float[3] v1);
static int32 LocalFunc0K(int32 a, StructK b) => a + (int32)b.mX * 100 + (int32)b.mY * 10000;
static int32 LocalFunc0L(int32 a, StructL b) => a + (int32)b.mX * 100 + (int32)b.mY * 10000;
static int32 LocalFunc0M(int32 a, StructM b) => a + (int32)b.mX * 100 + (int32)b.mY * 10000;
static int32 LocalFunc0N(int32 a, StructN b) => a + (int32)b.mX * 100 + (int32)b.mY * 10000;
static int32 LocalFunc0O(int32 a, StructO b) => a + (int32)b.mX * 100 + (int32)b.mY * 10000;
static int32 LocalFunc0P(int32 a, StructP b) => a + (int32)b.mX * 100 + (int32)b.mY * 10000;
static int32 LocalFunc0Q(int32 a, StructQ b) => a + (int32)b.mX * 100 + (int32)b.mY * 10000;
static int32 LocalFunc0R(int32 a, StructR b) => a + (int32)b.mX * 100 + (int32)b.mY * 10000;
static int32 LocalFunc0S(int32 a, StructS b) => a + (int32)b.mX * 100 + (int32)b.mY * 10000;
static int32 LocalFunc0T(int32 a, StructT b) => a + (int32)b.mX * 100 + (int32)b.mY * 10000;
static int32 LocalFunc0U(int32 a, StructU b) => a + (int32)b.mK.mX * 100 + (int32)b.mK.mY * 10000;
static int32 LocalFunc0V(int32 a, StructV b) => a + (int32)b.mX * 100 + (int32)b.mY * 10000;
static int32 LocalFunc0W(int32 a, StructW b) => a + (int32)b.mX * 100;
static int32 LocalFunc0KM(StructK a, StructM b, StructK c) => (int32)a.mX + (int32)b.mX * 100 + (int32)c.mX * 1000;
[Test]
public static void TestBasics()
{
//return;
StructA sa0 = default;
sa0.mA = 10;
StructA sa1 = default;
sa1.mA = 11;
StructB sb0 = default;
sb0.mA = 20;
StructB sb1 = default;
sb1.mA = 21;
StructC sc0 = default;
sc0.mA = 30;
StructC sc1 = default;
sc1.mA = 31;
StructD sd0 = default;
sd0.mA = 40;
StructD sd1 = default;
sd1.mA = 41;
StructE se0 = default;
se0.mA = 50;
StructE se1 = default;
se1.mA = 51;
StructF sf0 = default;
sf0.mA = 60;
StructF sf1 = default;
sf1.mA = 61;
StructG sg0 = default;
sg0.mA = 70;
StructG sg1 = default;
sg1.mA = 71;
StructH sh0 = default;
sh0.mA = 80;
StructH sh1 = default;
sh1.mA = 81;
StructI si0 = default;
si0.mA = 90;
StructI si1 = default;
si1.mA = 91;
StructK sk = .() { mX = 3, mY = 4};
StructK sk2 = .() { mX = 11, mY = 12 };
StructL sl = .() { mX = 3, mY = 4};
StructM sm = .() { mX = 5, mY = 6, mZ = 7, mW = 8 };
StructN sn = .() { mX = 3, mY = 4};
StructO so = .() { mX = 3, mY = 4};
StructP sp = .() { mX = 3, mY = 4};
StructQ sq = .() { mX = 3, mY = 4};
StructR sr = .() { mX = 3, mY = 4};
StructS ss = .() { mX = 3, mY = 4};
StructT st = .() { mX = 3, mY = 4};
StructU su = .() { mK = .(){mX = 3, mY = 4}};
StructV sv = .() { mX = 3, mY = 4};
StructW sw = .() { mX = 3 };
void StartTest(String str)
{
//Console.WriteLine(str);
}
Test.Assert(StructA.sVal == 1234);
float f = 123;
Test.Assert(sa0.MethodA2(ref f) == 123);
Test.Assert(sa0.MethodA3(f) == 123);
StartTest("Func0");
Test.Assert(Func0(12, 34) == 3412);
StartTest("Func0K");
Test.Assert(Func0K(12, sk) == 40312);
StartTest("Func0L");
Test.Assert(Func0L(12, sl) == 40312);
StartTest("Func0M");
Test.Assert(Func0M(12, sm) == 60512);
StartTest("Func0N");
Test.Assert(Func0N(12, sn) == 40312);
StartTest("Func0O");
Test.Assert(Func0O(12, so) == 40312);
StartTest("Func0P");
Test.Assert(Func0P(12, sp) == 40312);
StartTest("Func0Q");
Test.Assert(Func0Q(12, sq) == 40312);
StartTest("Func0R");
Test.Assert(Func0R(12, sr) == 40312);
StartTest("Func0S");
Test.Assert(Func0S(12, ss) == 40312);
StartTest("Func0T");
Test.Assert(Func0T(12, st) == 40312);
StartTest("Func0U");
Test.Assert(Func0U(12, su) == 40312);
StartTest("Func0V");
Test.Assert(Func0V(12, sv) == 40312);
StartTest("Func0W");
Test.Assert(Func0W(12, sw) == 312);
StartTest("Func0KM");
Test.Assert(Func0KM(sk, sm, sk2) == 11503);
StartTest("LocalFunc0K");
Test.Assert(LocalFunc0K(12, sk) == 40312);
StartTest("LocalFunc0L");
Test.Assert(LocalFunc0L(12, sl) == 40312);
StartTest("LocalFunc0M");
Test.Assert(LocalFunc0M(12, sm) == 60512);
StartTest("LocalFunc0N");
Test.Assert(LocalFunc0N(12, sn) == 40312);
StartTest("LocalFunc0O");
Test.Assert(LocalFunc0O(12, so) == 40312);
StartTest("LocalFunc0P");
Test.Assert(LocalFunc0P(12, sp) == 40312);
StartTest("LocalFunc0Q");
Test.Assert(LocalFunc0Q(12, sq) == 40312);
StartTest("LocalFunc0R");
Test.Assert(LocalFunc0R(12, sr) == 40312);
StartTest("LocalFunc0S");
Test.Assert(LocalFunc0S(12, ss) == 40312);
StartTest("LocalFunc0T");
Test.Assert(LocalFunc0T(12, st) == 40312);
StartTest("LocalFunc0U");
Test.Assert(LocalFunc0U(12, su) == 40312);
StartTest("LocalFunc0V");
Test.Assert(LocalFunc0V(12, sv) == 40312);
StartTest("LocalFunc0W");
Test.Assert(LocalFunc0W(12, sw) == 312);
StartTest("Func0KM");
Test.Assert(LocalFunc0KM(sk, sm, sk2) == 11503);
StartTest("Func1A");
Test.Assert(Func1A(sa0, sa1, 12) == 121110);
Test.Assert(sa0.MethodA0(12) == 1012);
Test.Assert(sa0.MethodA1(sa1, 12).mA == 33);
Test.Assert(Func2A(sa0, 12).mA == 22);
Test.Assert(Func1B(sb0, sb1, 12) == 122120);
Test.Assert(sb0.MethodB0(12) == 2012);
Test.Assert(sb0.MethodB1(sb1, 12).mA == 53);
Test.Assert(Func2B(sb0, 12).mA == 32);
Test.Assert(Func1C(sc0, sc1, 12) == 123130);
Test.Assert(sc0.MethodC0(12) == 3012);
Test.Assert(sc0.MethodC1(sc1, 12).mA == 73);
Test.Assert(Func2C(sc0, 12).mA == 42);
Test.Assert(Func1D(sd0, sd1, 12) == 124140);
Test.Assert(sd0.MethodD0(12) == 4012);
Test.Assert(sd0.MethodD1(sd1, 12).mA == 93);
Test.Assert(Func2D(sd0, 12).mA == 52);
Test.Assert(Func1E(se0, se1, 12) == 125150);
Test.Assert(se0.MethodE0(12) == 5012);
Test.Assert(se0.MethodE1(se1, 12).mA == 113);
Test.Assert(Func2E(se0, 12).mA == 62);
Test.Assert(Func1F(sf0, sf1, 12) == 126160);
Test.Assert(sf0.MethodF0(12) == 6012);
Test.Assert(sf0.MethodF1(sf1, 12).mA == (int8)133);
Test.Assert(Func2F(sf0, 12).mA == 72);
Test.Assert(Func1G(sg0, sg1, 12) == 127170);
Test.Assert(sg0.MethodG0(12) == 7012);
Test.Assert(sg0.MethodG1(sg1, 12).mA == (int8)153);
Test.Assert(Func2G(sg0, 12).mA == 82);
Test.Assert(Func1H(sh0, sh1, 12) == 128180);
Test.Assert(sh0.MethodH0(12) == 8012);
Test.Assert(sh0.MethodH1(sh1, 12).mA == 173);
Test.Assert(Func2H(sh0, 12).mA == 92);
Test.Assert(Func1I(si0, si1, 12) == 129190);
Test.Assert(si0.MethodI0(12) == 9012);
Test.Assert(si0.MethodI1(si1, 12).mA == (int8)193);
Test.Assert(Func2I(si0, 12).mA == 102);
StructJ sj0;
sj0.mPtr = "ABC";
sj0.mLength = 3;
StructJ sj1;
sj1.mPtr = "DEFG";
sj1.mLength = 4;
StructJ sj2;
sj2.mPtr = "HIJKL";
sj2.mLength = 5;
StructJ sj3;
sj3.mPtr = "MNOPQR";
sj3.mLength = 6;
var sjRet = Func4J(sj0, sj1, sj2, sj3);
Test.Assert(sjRet.mLength == 6050403);
var val5 = Func5(.(1, 2), .(3, 4, 5));
Test.Assert(Math.Round(val5) == 54321);
}
}
}