using System;
using System.Collections.Generic;
using UnitTestSharp;
namespace Ariadne.UnitTests
{
public class ConditionTests : TestFixture
{
///
/// A condition that is always set and leaves what it contradicts to the base.
///
public class AlwaysSet : Condition
{
public override bool IsSet => true;
}
public class ContradictsTests : TestFixture
{
public void ConditionThatDoesNotOverrideIt_ContradictsNothing()
{
var condition = new AlwaysSet();
CheckFalse(condition.Contradicts(condition));
CheckFalse(condition.Contradicts(new AlwaysSet()));
CheckFalse(condition.Contradicts(new Latch()));
}
}
public class WakeWaitersTests : TestFixture
{
private List woken;
private Latch door;
private Latch alarm;
public override void TestSetup()
{
woken = new List();
door = new Latch(initiallySet: true);
alarm = new Latch();
}
public void NothingWaiting_DoesNothing()
{
door.WakeWaiters();
CheckEqual(0, woken.Count);
}
public void WakesTheArcsInTheOrderTheyWereAddedToTheirScheduler()
{
LatchTests.WaitOn(woken, order: 2, door);
LatchTests.WaitOn(woken, order: 0, door);
LatchTests.WaitOn(woken, order: 1, door);
door.WakeWaiters();
CheckEqual(new[] { 0, 1, 2 }, woken.ToArray());
}
public void KeepsTheSubscriptions()
{
LatchTests.WaitOn(woken, order: 0, door);
door.WakeWaiters();
CheckEqual(1, door.SubscriptionCount);
}
public void WakesTheSameArcAgainOnTheNextCall()
{
LatchTests.WaitOn(woken, order: 4, door);
door.WakeWaiters();
door.WakeWaiters();
CheckEqual(new[] { 4, 4 }, woken.ToArray());
}
public void WaitForEveryOneThatIsNotMet_StaysAsleep()
{
LatchTests.WaitOn(woken, order: 0, tag: 0, requiresAll: true, door, alarm);
door.WakeWaiters();
CheckEqual(0, woken.Count);
}
public void WaitForEveryOneThatIsMet_WakesOnceTheLastIsSet()
{
LatchTests.WaitOn(woken, order: 0, tag: 0, requiresAll: true, door, alarm);
alarm.Set();
CheckEqual(new[] { 0 }, woken.ToArray());
}
public void WaitThatBeganAgain_IsNotWokenForItsEarlierConditions()
{
TriggerWait wait = LatchTests.WaitOn(woken, order: 0, door);
wait.Begin(new Frame { Wake = wait.Slot }, requiresAll: false);
wait.Add(alarm);
door.WakeWaiters();
CheckEqual(0, woken.Count);
}
public void WaitThatWasFinished_IsNotWoken()
{
TriggerWait wait = LatchTests.WaitOn(woken, order: 0, door);
wait.Finish();
door.WakeWaiters();
CheckEqual(0, woken.Count);
}
public void FinishedWait_IsSweptFromTheSubscriptions()
{
LatchTests.WaitOn(woken, order: 0, door).Finish();
door.WakeWaiters();
CheckEqual(0, door.SubscriptionCount);
}
public void ArcThatWasDropped_IsNotWoken()
{
LatchTests.WaitOn(woken, order: 0, door).Slot.Dropped = true;
door.WakeWaiters();
CheckEqual(0, woken.Count);
}
public void WaitWhoseArcIsNotHeldByAScheduler_Throws()
{
LatchTests.WaitOn(woken, order: 0, door).Slot = null;
CheckThrow(typeof(InvalidOperationException));
door.WakeWaiters();
}
public void LatchSetAgainAfterBeingCleared_WakesTheArcAgain()
{
LatchTests.WaitOn(woken, order: 6, alarm);
alarm.Set();
alarm.Clear();
alarm.Set();
CheckEqual(new[] { 6, 6 }, woken.ToArray());
}
}
}
}