1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-16 15:24:10 +02:00
Beef/IDEHelper/Tests/src/Append.bf
2019-08-23 11:56:54 -07:00

115 lines
2.3 KiB
Beef

#pragma warning disable 168
using System;
namespace Tests
{
class Append
{
class ClassA
{
int32 mA = 0x11223344;
[AllowAppend]
public this()
{
uint8* ptr = append uint8[3]*;
ptr[0] = 0x55;
ptr[1] = 0x66;
ptr[2] = 0x77;
}
}
class ClassB
{
[AllowAppend]
public this(int16 i, int32 j)
{
uint8* ptr = append uint8[i]*;
for (int k < i)
ptr[k] = (uint8)(0xA0 | k);
}
}
class ClassC : ClassB
{
public static int sCallCount;
static int GetIntVal()
{
sCallCount++;
return 123;
}
[AllowAppend]
public this(int16 i) : base(i, (int32)GetIntVal())
{
uint32* val = append uint32[2]*;
val[0] = 0x11223344;
val[1] = 0x55667788;
}
}
class ClassD
{
int16 mA = 0x1122;
[AllowAppend]
public this()
{
uint32* val = append uint32[1]*;
uint8* val2 = append uint8[1]*;
val[0] = 0x33445566;
//Foof();
val2[0] = 0xBB;
}
}
class ClassE : ClassD
{
[AllowAppend]
public this()
{
uint64* val = append uint64[1]*;
val[0] = 0x1020304050607080L;
}
}
static void CheckData(Object obj, int lastAllocSize, uint8[] data)
{
int objSize = typeof(Object).InstanceSize;
Test.Assert(lastAllocSize == data.Count + objSize);
uint8* ptr = (uint8*)Internal.UnsafeCastToPtr(obj) + objSize;
for (int i < data.Count)
Test.Assert(ptr[i] == data[i]);
}
[Test]
public static void Test()
{
TrackedAlloc trackedAlloc = scope .();
int objSize = typeof(Object).InstanceSize;
let ca = new:trackedAlloc ClassA();
CheckData(ca, trackedAlloc.mLastAllocSize, scope .(
0x44, 0x33, 0x22, 0x11, 0x55, 0x66, 0x77));
delete:trackedAlloc ca;
let cc = new:trackedAlloc ClassC(10);
Test.Assert(ClassC.sCallCount == 1); // This ensures we had a constant evaluation of the size
CheckData(cc, trackedAlloc.mLastAllocSize, scope .(
0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0x00, 0x00, 0x44, 0x33, 0x22, 0x11,
0x88, 0x77, 0x66, 0x55));
delete:trackedAlloc cc;
let ce = new:trackedAlloc ClassE();
CheckData(cc, trackedAlloc.mLastAllocSize, scope .(
0x22, 0x11, 0x00, 0x00, 0x66, 0x55, 0x44, 0x33, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0x70, 0x60, 0x50, 0x40, 0x30, 0x20, 0x10
));
delete:trackedAlloc ce;
}
}
}