tbf/TBFTests/Rig/RegisterReaders/PoseidonCmdStartStop/PoseidonReadCycleTest.cs

96 lines
4.7 KiB
C#

using System.Collections.Generic;
using JetBrains.Annotations;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using TBF.Rig;
using TBF.Rig.RegisterReaders.PoseidonCmdStartStop;
using CmdPoseidonReader = TBF.Rig.RegisterReaders.PoseidonCmdStartStop.PoseidonReader;
namespace TBFTests.Rig.RegisterReaders.PoseidonCmdStartStop
{
[TestClass]
[TestSubject(typeof(PoseidonReadCycle))]
public class PoseidonReadCycleTest
{
private sealed class FakeReader : IPoseidonReadOperation
{
private readonly int iterationsToComplete;
private int iterations;
public FakeReader(string name, int iterationsToComplete) { Name = name; this.iterationsToComplete = iterationsToComplete; }
public string Name { get; private set; }
public int StartCount { get; private set; }
public CmdPoseidonReader.CurrentPoseidonOp CurrentOp { get; private set; }
public bool IsNotStarted { get { return CurrentOp == CmdPoseidonReader.CurrentPoseidonOp.None; } }
public bool IsFinished { get { return CurrentOp == CmdPoseidonReader.CurrentPoseidonOp.Done || CurrentOp == CmdPoseidonReader.CurrentPoseidonOp.Error; } }
public bool HasError { get { return CurrentOp == CmdPoseidonReader.CurrentPoseidonOp.Error; } }
public void Start(bool readStart) { StartCount++; CurrentOp = readStart ? CmdPoseidonReader.CurrentPoseidonOp.ReadDataStream_Start : CmdPoseidonReader.CurrentPoseidonOp.ReadDataStream_End; }
public Event Run()
{
if (CurrentOp == CmdPoseidonReader.CurrentPoseidonOp.ReadDataStream_Start || CurrentOp == CmdPoseidonReader.CurrentPoseidonOp.ReadDataStream_End)
{ CurrentOp = CmdPoseidonReader.CurrentPoseidonOp.ReadDatastream_Running; return Event.Busy; }
if (CurrentOp == CmdPoseidonReader.CurrentPoseidonOp.ReadDatastream_Running && ++iterations >= iterationsToComplete)
{ CurrentOp = CmdPoseidonReader.CurrentPoseidonOp.Done; return Event.Done; }
return Event.Busy;
}
}
[TestMethod]
public void RunIteration_FullBench_ArmsEachReaderOnce()
{
var readers = new List<IPoseidonReadOperation>();
for (int i = 1; i <= 48; i++) readers.Add(new FakeReader("PoseidonPos" + i, 1 + i % 3));
for (int i = 0; i < 5; i++) PoseidonReadCycle.RunIteration(readers, true);
foreach (FakeReader reader in readers) Assert.AreEqual(1, reader.StartCount, reader.Name);
}
[TestMethod]
public void RunIteration_ReducedBench_DoesNotRestartCompletedReader()
{
var readers = new List<IPoseidonReadOperation> { new FakeReader("Pos1", 1), new FakeReader("Pos2", 3) };
for (int i = 0; i < 5; i++) PoseidonReadCycle.RunIteration(readers, false);
foreach (FakeReader reader in readers) Assert.AreEqual(1, reader.StartCount, reader.Name);
}
[TestMethod]
public void StartThenStop_PhasesArmTheSameReaderOncePerPhase()
{
var reader = new FakeReader("Pos1", 1);
var readers = new List<IPoseidonReadOperation> { reader };
var startPhase = new PoseidonReadPhaseRunner(true);
// START phase completes.
startPhase.RunIteration(readers);
startPhase.RunIteration(readers);
Assert.AreEqual(CmdPoseidonReader.CurrentPoseidonOp.Done, reader.CurrentOp);
// A new STOP phase re-arms the terminal reader exactly once.
var stopPhase = new PoseidonReadPhaseRunner(false);
stopPhase.RunIteration(readers);
stopPhase.RunIteration(readers);
Assert.AreEqual(2, reader.StartCount);
Assert.AreEqual(CmdPoseidonReader.CurrentPoseidonOp.Done, reader.CurrentOp);
}
[TestMethod]
public void InputJson_ZeroReading_WithDecimalCommaOrDot_IsValid()
{
foreach (string reading in new[] { "00000,0", "00000.0" })
{
double value;
Assert.IsTrue(CmdPoseidonReader.TryParseCliReading(reading, out value));
Assert.AreEqual(0d, value);
}
}
[TestMethod]
public void CliReadResponse_RequiresNfcAndCompletedReading()
{
string reason;
var data = new JsonDataFromPoseidon { NfcTagDetected = true, ReadingComplete = true, Reading = "00000.0" };
Assert.IsTrue(CmdPoseidonReader.TryValidateCliReadResponse(data, out reason));
data.ReadingComplete = false;
Assert.IsFalse(CmdPoseidonReader.TryValidateCliReadResponse(data, out reason));
}
}
}