using System;
using System.Collections.Generic;
using UnitTestSharp;
namespace Ariadne.UnitTests
{
public class LatchTests : TestFixture
{
///
/// Returns a wait on for an arc that logs when woken.
///
public static TriggerWait WaitOn(List woken, int order, int tag, bool requiresAll,
params Condition[] conditions)
{
var returnMe = new TriggerWait(capacity: Math.Max(1, conditions.Length), onConditions: true);
returnMe.Begin(new Frame { Wake = new RecordingSlot(woken, order, tag) }, requiresAll);
foreach (Condition condition in conditions)
{
returnMe.Add(condition);
}
return returnMe;
}
public static TriggerWait WaitOn(List woken, int order, params Condition[] conditions)
{
return WaitOn(woken, order, tag: order, requiresAll: false, conditions: conditions);
}
public class CtorTests : TestFixture
{
public void ByDefault_StartsClear()
{
CheckFalse(new Latch().IsSet);
}
public void InitiallySet_StartsSet()
{
CheckTrue(new Latch(initiallySet: true).IsSet);
}
public void MakesItsInverse()
{
var latch = new Latch();
CheckTrue(ReferenceEquals(latch, latch.Inverse.Original));
}
}
public class SetTests : TestFixture
{
private List woken;
private Latch latch;
public override void TestSetup()
{
woken = new List();
latch = new Latch();
}
public void MakesTheLatchSet()
{
latch.Set();
CheckTrue(latch.IsSet);
}
public void WakesTheArcsWaitingForTheLatch()
{
WaitOn(woken, order: 3, latch);
latch.Set();
CheckEqual(new[] { 3 }, woken.ToArray());
}
public void LatchThatIsAlreadySet_WakesNobody()
{
var set = new Latch(initiallySet: true);
WaitOn(woken, order: 0, set);
set.Set();
CheckEqual(0, woken.Count);
}
public void DoesNotWakeTheArcsWaitingForTheInverse()
{
WaitOn(woken, order: 0, latch.Inverse);
latch.Set();
CheckEqual(0, woken.Count);
}
}
public class ClearTests : TestFixture
{
private List woken;
private Latch latch;
public override void TestSetup()
{
woken = new List();
latch = new Latch(initiallySet: true);
}
public void MakesTheLatchClear()
{
latch.Clear();
CheckFalse(latch.IsSet);
}
public void WakesTheArcsWaitingForTheInverse()
{
WaitOn(woken, order: 2, latch.Inverse);
latch.Clear();
CheckEqual(new[] { 2 }, woken.ToArray());
}
public void LatchThatIsAlreadyClear_WakesNobody()
{
var clear = new Latch();
WaitOn(woken, order: 0, clear.Inverse);
clear.Clear();
CheckEqual(0, woken.Count);
}
public void DoesNotWakeTheArcsWaitingForTheLatch()
{
WaitOn(woken, order: 0, latch);
latch.Clear();
CheckEqual(0, woken.Count);
}
}
public class ContradictsTests : TestFixture
{
public void Inverse_IsContradicted()
{
var latch = new Latch();
CheckTrue(latch.Contradicts(latch.Inverse));
}
public void ItselfAndOtherConditions_AreNot()
{
var latch = new Latch();
CheckFalse(latch.Contradicts(latch));
CheckFalse(latch.Contradicts(new Latch()));
CheckFalse(latch.Contradicts(new Latch().Inverse));
}
}
public class NotOperatorTests : TestFixture
{
public void ReturnsTheInverse()
{
var latch = new Latch();
CheckTrue(ReferenceEquals(latch.Inverse, !latch));
}
public void NullLatch_Throws()
{
Latch latch = null;
CheckThrow(typeof(ArgumentNullException));
InvertedLatch ignored = !latch;
}
}
}
}