tbf/TBFTests/Rig/RegisterReaders/GenesisRegReader/communication/OptoHeadTest_Test.cs

151 lines
4.3 KiB
C#

using System;
using System.Diagnostics;
using System.Reflection;
using Common;
using JetBrains.Annotations;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using TBF.Rig.BridgeComponents.GciBridge;
using TBF.Rig.RegisterReaders.GenesisRegReader;
using TBF.Rig.RegisterReaders.GenesisRegReader.communication;
using TBF.Rig.RegisterReaders.GenesisRegReader.implementations;
using Factory = TBF.Rig.RegisterReaders.GenesisRegReader.Factory;
namespace TBFTests.Rig.RegisterReaders.GenesisRegReader.communication
{
[TestClass]
[TestSubject(typeof(GenesisSmartReader))]
public class OptoHeadTest_Test
{
private const string BridgeName = "GciBridge_Test";
private static GenesisCfg CreateConnectionCfg()
{
var factory = new Factory();
var cfg = new GenesisCfg(factory);
SetPrivateFieldByNames(cfg, 1,
"slotNr",
"_slotNr");
SetPrivateFieldByNames(cfg, 1,
"rfidComPortNr",
"_rfidComPortNr");
SetPrivateFieldByNames(cfg, 2,
"optoComPortNr",
"_optoComPortNr");
SetPrivateFieldByNames(cfg, BridgeName,
"communicationInterfaceBridge",
"_communicationInterfaceBridge");
return cfg;
}
private static GenesisSmartReader CreateSimulatedGenesisReader()
{
var cfg = CreateConnectionCfg();
var reader = new GenesisSmartReader(cfg);
SetPrivateFieldByNames(reader,
"Genesis1",
"name",
"_name");
SetPrivateFieldByNames(reader,
DebugMode.Simulate,
"debugLevel",
"_debugLevel");
var bridge = new GciBridge();
SetPrivateFieldByNames(bridge,
BridgeName,
"name",
"_name");
InjectBridge(reader, bridge);
return reader;
}
private static void InjectBridge(
GenesisSmartReader reader,
GciBridge bridge)
{
SetPrivateFieldByNames(reader,
bridge,
"commInterfaceBridge",
"_commInterfaceBridge");
}
private static void SetPrivateFieldByNames(
object target,
object value,
params string[] fieldNames)
{
foreach (var fieldName in fieldNames)
{
var field = target.GetType().GetField(
fieldName,
BindingFlags.Instance |
BindingFlags.NonPublic |
BindingFlags.Public);
if (field != null)
{
field.SetValue(target, value);
return;
}
}
throw new MissingFieldException(
target.GetType().FullName,
string.Join(" or ", fieldNames));
}
[TestMethod]
public void BuildConnection_Simulation_ShouldWaitForInitAndUpdate_AndFinishWithin1500ms()
{
// Arrange
var reader = CreateSimulatedGenesisReader();
var optoHeadTest = new OptoHeadTest(reader);
var stopwatch = Stopwatch.StartNew();
// Act
optoHeadTest.BuildConnection(reader);
stopwatch.Stop();
// Assert
Assert.IsTrue(
stopwatch.ElapsedMilliseconds >= 950,
$"BuildConnection finished too fast. " +
$"InitSlotAsync + UpdateSlotAsync were probably not awaited. " +
$"Elapsed={stopwatch.ElapsedMilliseconds}ms");
Assert.IsTrue(
stopwatch.ElapsedMilliseconds <= 1500,
$"BuildConnection took too long. " +
$"Elapsed={stopwatch.ElapsedMilliseconds}ms");
}
[TestMethod]
public void BuildConnection_NullGenesisHead_ShouldThrowArgumentNullException()
{
// Arrange
var reader = CreateSimulatedGenesisReader();
var optoHeadTest = new OptoHeadTest(reader);
// Act + Assert
Assert.ThrowsException<ArgumentNullException>(() =>
{
optoHeadTest.BuildConnection(null);
});
}
}
}