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

177 lines
3 KiB
Beef

using System;
namespace Tests
{
class Scopes
{
[Test]
public static void TestRestore()
{
// This shouldn't overflow because we should restore the stack between 'i' iterations
for (int i < 100)
IBlock:
{
// Allocate 500kb
for (int j < 5)
{
scope:IBlock uint8[100*1024];
}
}
}
[Test]
public static void TestGetStrScope()
{
var str = GetStr!();
Test.Assert(str == "TestString");
{
str = GetStr!::();
}
Test.Assert(str == "TestString");
}
/*[Test(ShouldFail=true)]
public static void TestFailGetStrScope()
{
String str;
{
str = GetStr!();
}
// Should detect as deleted
#unwarn
str.Contains('T');
}*/
public static mixin GetStr()
{
scope:mixin String("TestString")
}
class ClassA
{
public int mA = 123;
public static int sAllocCount = 0;
public this()
{
sAllocCount++;
}
public ~this()
{
Test.Assert(mA == 123);
sAllocCount--;
}
}
class ClassB
{
public int mA = 234;
public static int sAllocCount = 0;
public this()
{
sAllocCount++;
}
public ~this()
{
Test.Assert(mA == 234);
sAllocCount--;
}
}
static bool CheckTrue(Object obj)
{
return true;
}
static bool CheckFalse(Object obj)
{
return false;
}
[Test]
public static void TestIf()
{
//
{
if ((CheckTrue(scope ClassA())) || (CheckTrue(scope ClassB())))
{
Test.Assert(ClassA.sAllocCount == 1);
Test.Assert(ClassB.sAllocCount == 0);
}
Test.Assert(ClassA.sAllocCount == 0);
Test.Assert(ClassB.sAllocCount == 0);
}
//
{
if ((CheckFalse(scope ClassA())) || (CheckTrue(scope ClassB())))
{
Test.Assert(ClassA.sAllocCount == 1);
Test.Assert(ClassB.sAllocCount == 1);
}
Test.Assert(ClassA.sAllocCount == 0);
Test.Assert(ClassB.sAllocCount == 0);
}
//
{
if ((CheckFalse(scope ClassA())) || (CheckFalse(scope ClassB())))
{
Test.FatalError();
}
else
{
Test.Assert(ClassA.sAllocCount == 1);
Test.Assert(ClassB.sAllocCount == 1);
}
Test.Assert(ClassA.sAllocCount == 0);
Test.Assert(ClassB.sAllocCount == 0);
}
//
{
if ((CheckTrue(scope ClassA())) && (CheckTrue(scope ClassB())))
{
Test.Assert(ClassA.sAllocCount == 1);
Test.Assert(ClassB.sAllocCount == 1);
}
Test.Assert(ClassA.sAllocCount == 0);
Test.Assert(ClassB.sAllocCount == 0);
}
//
{
if ((CheckTrue(scope ClassA())) && (CheckFalse(scope ClassB())))
{
Test.FatalError();
}
else
{
Test.Assert(ClassA.sAllocCount == 1);
Test.Assert(ClassB.sAllocCount == 1);
}
Test.Assert(ClassA.sAllocCount == 0);
Test.Assert(ClassB.sAllocCount == 0);
}
//
{
if ((CheckFalse(scope ClassA())) && (CheckFalse(scope ClassB())))
{
Test.FatalError();
}
else
{
Test.Assert(ClassA.sAllocCount == 1);
Test.Assert(ClassB.sAllocCount == 0);
}
Test.Assert(ClassA.sAllocCount == 0);
Test.Assert(ClassB.sAllocCount == 0);
}
}
}
}