96 lines
4.7 KiB
C#
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));
|
|
}
|
|
}
|
|
}
|