mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-16 07:14:09 +02:00
178 lines
3 KiB
Beef
178 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);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|