namespace Ariadne.Vellum.UnitTests { /// /// Keeps a local across a pause in a Run that a derived class overrides. /// public abstract partial class CollisionBase : Arc { public string BaseNote = "idle"; protected override void Run(Gates gates) { int count = 1; basewait: while (!gates.Open.Contains("go")) { Yield(); } BaseNote = "base " + count; } } /// /// Overrides Run with a local of the same name as the base's, but another type. /// public partial class CollisionDerived : CollisionBase { public string Note = "idle"; protected override void Run(Gates gates) { string count = "a"; derivedwait: while (!gates.Open.Contains("go")) { Yield(); } Note = "derived " + count; } } /// /// Runs the base's Run between two pauses of its own, with a local named like the base's but of another type. /// public partial class CollisionCaller : CollisionBase { public string Note = "idle"; protected override void Run(Gates gates) { string count = "a"; before: while (!gates.Open.Contains("start")) { Yield(); } base.Run(gates); Note = "derived " + count; } } /// /// Runs the base's Run from a call of its own, under a label. /// public partial class CollisionLabelled : CollisionBase { protected override void Run(Gates gates) { again: base.Run(gates); } } /// /// Runs the base's Run from a passage other than Run. /// public partial class CollisionHelper : CollisionBase { public string Note = "idle"; protected void Prepare(Gates gates) { string count = "p"; prepared: base.Run(gates); Note = "prepared " + count; } protected override void Run(Gates gates) { Prepare(gates); } } /// /// Holds a Run that waits for game time, with a local across the wait. /// public abstract partial class CollisionWaitBase : Arc { public string WaitNote = "idle"; protected override void Run(Gates gates) { int rounds = 3; rest: Wait(System.TimeSpan.FromSeconds(1)); WaitNote = "rested " + rounds; } } /// /// Runs a base Run that waits for game time. /// public partial class CollisionWaitDerived : CollisionWaitBase { public string Note = "idle"; protected override void Run(Gates gates) { string rounds = "x"; base.Run(gates); Note = "derived " + rounds; } } /// /// Runs the base's Run, and is itself the base of a script that does the same. /// public partial class CollisionMiddle : CollisionBase { public string MiddleNote = "idle"; protected override void Run(Gates gates) { double count = 2.5; middlewait: while (!gates.Open.Contains("middle")) { Yield(); } base.Run(gates); MiddleNote = "middle " + count; } } /// /// Runs the Run of a class that runs the Run of its own base. /// public partial class CollisionLeaf : CollisionMiddle { public string Note = "idle"; protected override void Run(Gates gates) { string count = "leaf"; leafwait: while (!gates.Open.Contains("start")) { Yield(); } base.Run(gates); Note = "leaf " + count; } } /// /// Overrides Run with a local of the same name and type as the base's, holding another value. /// public partial class CollisionSameType : CollisionBase { public string Note = "idle"; protected override void Run(Gates gates) { int count = 5; derivedwait: while (!gates.Open.Contains("go")) { Yield(); } Note = "derived " + count; } } }