using Microsoft.CodeAnalysis;
using UnitTestSharp;
namespace Ariadne.Generator.UnitTests
{
///
/// Calls from a derived class's Run to the Run it overrides.
///
public class BaseRunTests : TestFixture
{
public const string Basis = @"
public abstract partial class Basis : Arc
{
protected override void Run(string context)
{
int count = 1;
first:
while (context.Length == 0)
{
Yield();
}
count++;
}
}
";
public const string Derived = @"
public partial class Derived : Basis
{
protected override void Run(string context)
{
string count = ""a"";
second:
while (context.Length == 0)
{
Yield();
}
base.Run(context);
count += ""b"";
}
}
";
public class CallTests : TestFixture
{
public void BaseRun_CompilesWithoutComplaint()
{
GeneratorRun run = GeneratorRun.Of(Basis + Derived);
CheckEqual(0, run.Reported.Count);
CheckEqual(0, run.Compiled.Count);
}
public void BaseRun_RunsTheBasesCopyOnAFrameOfTheBase()
{
GeneratorRun run = GeneratorRun.Of(Basis + Derived);
CheckTrue(run.CodeBehind.Contains("base.Run__Passage("));
CheckTrue(run.CodeBehind.Contains("new global::Basis.__Frame()"));
}
public void BaseRun_SavesItsLocalsThroughTheBasesCopy()
{
GeneratorRun run = GeneratorRun.Of(Basis + Derived);
CheckTrue(run.CodeBehind.Contains("base.Run__LocalsToSave("));
}
public void BaseRun_NeverCallsTheDerivedCopyFromItself()
{
GeneratorRun run = GeneratorRun.Of(Basis + Derived);
CheckFalse(run.CodeBehind.Contains("if (!Run__Passage(__frame"));
}
public void BaseRunThatSavesNothing_LeavesNoTableToSave()
{
GeneratorRun run = GeneratorRun.Of(@"
public abstract partial class Basis : Arc
{
protected override void Run(string context)
{
first:
while (context.Length == 0)
{
Yield();
}
}
}" + Derived);
CheckEqual(0, run.Compiled.Count);
CheckFalse(run.CodeBehind.Contains("base.Run__LocalsToSave("));
}
public void BaseRunOfAnotherAssembly_CompilesWithoutComplaint()
{
MetadataReference library = GeneratorRun.CompileGeneratedLibrary("Bases", Basis);
GeneratorRun run = GeneratorRun.Of(library, Derived);
CheckEqual(0, run.Reported.Count);
CheckEqual(0, run.Compiled.Count);
CheckTrue(run.CodeBehind.Contains("base.Run__Passage("));
CheckTrue(run.CodeBehind.Contains("base.Run__LocalsToSave("));
}
public void BaseRunInAChainOfThree_CompilesWithoutComplaint()
{
GeneratorRun run = GeneratorRun.Of(Basis + Derived + @"
public partial class Leaf : Derived
{
protected override void Run(string context)
{
base.Run(context);
}
}");
CheckEqual(0, run.Reported.Count);
CheckEqual(0, run.Compiled.Count);
}
}
}
}