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(); 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 { 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 { 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)); } } }