using UnitTestSharp; namespace Ariadne.Generator.UnitTests { public class TimeAccessTests : TestFixture { public class RewriteTests : TestFixture { public void GameTimeInAPassage_ReadsTheTimeParameter() { GeneratorRun run = GeneratorRun.Of(@" public partial class Clocked : Arc { public long Seen; protected override void Run(World world) { Seen = GameTime.Ticks; pause: Yield(); } }"); CheckEqual(0, run.Reported.Count); CheckEqual(0, run.Compiled.Count); CheckTrue(run.CodeBehind.Contains("Seen = __time.GameTime.Ticks;")); } public void DeltaTimeInAPassage_ReadsTheTimeParameter() { GeneratorRun run = GeneratorRun.Of(@" public partial class Clocked : Arc { public long Seen; protected override void Run(World world) { Seen = DeltaTime.Ticks; pause: Yield(); } }"); CheckEqual(0, run.Compiled.Count); CheckTrue(run.CodeBehind.Contains("Seen = __time.DeltaTime.Ticks;")); } public void TimeNamedThroughThis_ReadsTheTimeParameter() { GeneratorRun run = GeneratorRun.Of(@" public partial class Clocked : Arc { public long Seen; protected override void Run(World world) { Seen = this.GameTime.Ticks; pause: Yield(); } }"); CheckEqual(0, run.Reported.Count); CheckEqual(0, run.Compiled.Count); CheckTrue(run.CodeBehind.Contains("Seen = __time.GameTime.Ticks;")); } public void TimeInALambda_ReadsTheTimeParameter() { GeneratorRun run = GeneratorRun.Of(@" public partial class Clocked : Arc { public long Seen; protected override void Run(World world) { System.Func read = () => GameTime.Ticks; Seen = read(); pause: Yield(); } }"); CheckEqual(0, run.Reported.Count); CheckEqual(0, run.Compiled.Count); CheckTrue(run.CodeBehind.Contains("() => __time.GameTime.Ticks")); } public void TimeInAPauseLoopCondition_ReadsTheTimeParameter() { GeneratorRun run = GeneratorRun.Of(@" public partial class Waiting : Arc { protected override void Run(World world) { Amphora.Duration deadline = GameTime + Amphora.Duration.FromSeconds(1); wait: while (GameTime < deadline) { pause: Yield(); } } }"); CheckEqual(0, run.Reported.Count); CheckEqual(0, run.Compiled.Count); CheckTrue(run.CodeBehind.Contains("__time.GameTime < deadline")); } public void TimeInAPassageRunOnAnotherArc_ReadsTheTimeParameter() { GeneratorRun run = GeneratorRun.Of(@" public partial class Worker : Arc { public long Seen; public void Note(World world) { Seen = GameTime.Ticks; pause: Yield(); } protected override void Run(World world) { } } public partial class Client : Arc { public Worker Helper = new Worker(); protected override void Run(World world) { Helper.Note(world); } }"); CheckEqual(0, run.Reported.Count); CheckEqual(0, run.Compiled.Count); CheckTrue(run.CodeBehind.Contains("Seen = __time.GameTime.Ticks;")); } } public class ReportTests : TestFixture { public void TimeInAMethodThatIsNotAPassage_IsReported() { GeneratorRun run = GeneratorRun.Of(@" public partial class Clocked : Arc { private long Now() { return GameTime.Ticks; } protected override void Run(World world) { pause: Yield(); } }"); CheckEqual(new[] { "ARI0030:GameTime" }, run.Reported); } public void TimeReadOnAnotherArc_IsReported() { GeneratorRun run = GeneratorRun.Of(@" public partial class Clocked : Arc { public Clocked Other; protected override void Run(World world) { long seen = Other.GameTime.Ticks; pause: Yield(); } }"); CheckEqual(new[] { "ARI0030:GameTime" }, run.Reported); } public void TimeInAPassage_IsNotReported() { GeneratorRun run = GeneratorRun.Of(@" public partial class Clocked : Arc { protected override void Run(World world) { long seen = GameTime.Ticks + DeltaTime.Ticks; pause: Yield(); } }"); CheckEqual(0, run.Reported.Count); } } } }