1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 11:38:21 +02:00
Beef/IDEHelper/Tests/src/Enums.bf
2025-03-17 13:05:38 -04:00

319 lines
5.6 KiB
Beef

#pragma warning disable 168
using System;
namespace Tests
{
class Enums
{
enum EnumA
{
A,
B
}
enum EnumB
{
A,
B = 600
}
enum EnumC
{
A,
B = 0x7FFFFFFF
}
enum EnumD
{
A,
B = 0x7FFFFFFFFFFFFFFFL
}
enum EnumE
{
case A;
case B(int a);
case C(int a, int b);
}
enum EnumF
{
case None;
case EE(EnumE ee);
}
enum EnumG
{
case A = (.)'A';
case B = (.)'B';
public void Set(int val) mut
{
this = (.)val;
}
}
enum EnumH { A, B }
enum EnumI
{
case A;case B;case C;case D;case E;
case F;case G;case H;case I;case J;
case K;case L;case M;case N;case O;
case P;case Q;case R;case S;case T;
case U;case V;case W;case X;case Y;
case Z;case AA;case AB;case AC;case AD;
case AE;case AF;case AG;case AH;case AI;
case AJ;case AK;case AL;case AM;case AN;
case AO;case AP;case AQ;case AR;case AS;
case AT;case AU;case AV;case AW;case AX;
case AY;case AZ;case BA;case BB;case BC;
case BD;case BE;case BF;case BG;case BH;
case BI;case BJ;case BK;case BL;case BM;
case BN;case BO;case BP;case BQ;case BR;
case BS;case BT;case BU;case BV;case BW;
case BX;case BY;case BZ;case CA;case CB;
case CC;case CD;case CE;case CF;case CG;
case CH;case CI;case CJ;case CK;case CL;
case CM;case CN;case CO;case CP;case CQ;
case CR;case CS;case CT;case CU;case CV;
case CW;case CX;case CY;case CZ;case DA;
case DB;case DC;case DD;case DE;case DF;
case DG;case DH;case DI;case DJ;case DK;
case DL;case DM;case DN;case DO;case DP;
case DQ;case DR;case DS;case DT;case DU;
case DV;case DW;case DX;
case DY(EnumH val);
// Started from 129 elements, no less
}
[AllowDuplicates]
public enum EnumJ : uint32
{
SDL_BUTTON_LEFT = 1,
SDL_BUTTON_LMASK = (1u << ((SDL_BUTTON_LEFT.Underlying) - 1)),
}
[AllowDuplicates]
public enum EnumK
{
SDL_BUTTON_LEFT = 1,
SDL_BUTTON_LMASK = (1u << ((SDL_BUTTON_LEFT.Underlying) - 1)),
}
public enum EnumL
{
case A;
public static int operator implicit(Self self);
}
public enum EnumM
{
public static implicit operator int(Self self);
case A;
case B;
case C;
}
[CRepr]
public enum EnumN
{
A,
B,
C,
D = 4
}
[Test]
static void TestBasic()
{
EnumA ea = .A;
Test.Assert((int)ea == 0);
Test.Assert(sizeof(EnumA) == 1);
Test.Assert(sizeof(EnumB) == 2);
Test.Assert(sizeof(EnumC) == 4);
Test.Assert(sizeof(EnumD) == 8);
EnumM em = ?;
int i = em;
uint u = (uint)em;
i = 123;
EnumA e = (EnumA)i;
}
[Test]
static void TestPayloads()
{
Test.Assert(sizeof(EnumE) == sizeof(int)*2 + 1);
Test.Assert(sizeof(EnumF) == sizeof(int)*2 + 1 + 1);
EnumE ee = .C(1, 2);
int a = 0;
int b = 0;
switch (ee)
{
case .A:
case .B(out a):
case .C(out a, out b):
}
Test.Assert(a == 1);
Test.Assert(b == 2);
ee = default;
switch (ee)
{
case default:
Test.Assert(true);
default:
Test.Assert(false);
}
ee = .B(123);
switch (ee)
{
case default:
Test.Assert(false);
default:
Test.Assert(true);
}
switch (ee)
{
case .B(100):
Test.Assert(false);
case .B(123):
Test.Assert(true);
default:
Test.Assert(false);
}
switch (ee)
{
case .B(123):
Test.Assert(true);
case .B:
Test.Assert(false);
default:
Test.Assert(false);
}
switch (ee)
{
case .A:
case .B(123):
Test.Assert(true);
case .B:
Test.Assert(false);
case .C:
}
EnumF ef = .EE(.C(3, 4));
switch (ef)
{
case .EE(let eeVal):
if (!(eeVal case .C(out a, out b)))
{
Test.FatalError();
}
default:
}
Test.Assert(a == 3);
Test.Assert(b == 4);
const EnumE e0 = .A;
const EnumE e1 = .B(1);
}
[Test]
static void TestCases()
{
EnumE ee = .A;
int val = 123;
bool matches = ee case .B(out val);
Test.Assert(val == 0);
// We only assign to 'val' on true here
val = 123;
if (ee case .B(out val))
{
Test.Assert(val == 0 );
}
Test.Assert(val == 123);
// We always assign to 'val' here because we may enter even if there's no match
val = 123;
if ((ee case .B(out val)) || (val > 0))
{
}
Test.Assert(val == 0);
const EnumA cea = .A;
switch (cea)
{
case .A:
val = 123;
}
ee = .B(10);
EnumG eg = .A;
eg.Set(66);
Test.Assert(eg == .B);
var ea = Enum.GetMaxValue<EnumA>();
Test.Assert(ea == .B);
Test.Assert(Enum.GetCount<EnumA>() == 2);
EnumI ei = .DY(.B);
bool foundH = false;
if (ei case .DY(var eh))
foundH = eh == .B;
Test.Assert(foundH);
Test.Assert((int)EnumJ.SDL_BUTTON_LMASK == 1);
Test.Assert(typeof(EnumJ).Size == 4);
Test.Assert((int)EnumK.SDL_BUTTON_LMASK == 1);
Test.Assert(typeof(EnumK).Size == 8);
EnumL el = .A;
Test.Assert(el == 0);
}
[Test]
static void TestCrepr()
{
EnumN value = .B;
Test.Assert(sizeof(EnumN) == sizeof(System.Interop.c_int));
Test.Assert(value.HasFlag(.A) == true);
Test.Assert(value.HasFlag(.B) == true);
Test.Assert(value.HasFlag(.B | .C) == false);
Test.Assert(value.HasFlag(.D) == false);
Test.Assert(value.Underlying == 1);
value = .B | .C;
Test.Assert(value.HasFlag(.A) == true);
Test.Assert(value.HasFlag(.B) == true);
Test.Assert(value.HasFlag(.B | .C) == true);
Test.Assert(value.HasFlag(.D) == false);
Test.Assert(value.Underlying == 3);
ref System.Interop.c_int valueRef = ref value.UnderlyingRef;
valueRef = 2;
Test.Assert(value == .C);
String str = scope String();
value.ToString(str);
Test.Assert(str == "C");
}
}
}