only:refactoring: convert `TestBase` class into template to make base GoogleTest class customizable #7117

This commit is contained in:
kifir 2024-12-17 15:36:35 +02:00 committed by kifir23917
parent f048161b7d
commit 2dbdad0698
24 changed files with 195 additions and 176 deletions

View File

@ -24,7 +24,7 @@ private:
std::optional<float> m_AcPressureEnableHysteresis;
};
class AcTestBase : public TestBase {
class AcTestBase : public TestBase<> {
protected:
void updateAcPressure(float acPressure);

View File

@ -6,7 +6,7 @@
#include "util/test_base.h"
class BoostTestBase : public TestBase {
class BoostTestBase : public TestBase<> {
protected:
using ValueByIndexRetriever = std::function<std::optional<float>(int)>;

View File

@ -13,7 +13,7 @@ namespace {
using AlternatorVoltageTargetValues = float[ALTERNATOR_VOLTAGE_TARGET_SIZE][ALTERNATOR_VOLTAGE_TARGET_SIZE];
using AlternatorVoltageTargetBins = uint16_t[ALTERNATOR_VOLTAGE_TARGET_SIZE];
class AlternatorVoltageTargetSetPointTest : public TestBase {
class AlternatorVoltageTargetSetPointTest : public TestBase<> {
protected:
virtual void SetUp() override;

View File

@ -26,7 +26,7 @@ namespace {
.setFuelReferencePressure(TEST_PRIMARY_INJECTOR_FUEL_REFERENCE_PRESSURE)
.setSecondaryInjectorFuelReferencePressure(TEST_SECONDARY_INJECTOR_FUEL_REFERENCE_PRESSURE);
class FuelDifferentialPressureTest : public TestBase {
class FuelDifferentialPressureTest : public TestBase<> {
protected:
void SetUp() override;

View File

@ -38,7 +38,7 @@ namespace {
.setInjectorSecondaryFlow(TEST_SECONDARY_INJECTOR_FLOW)
.setInjectorSecondaryBattLagCorr(TEST_SECONDARY_INJECTOR_BATT_LAG_CORR_CURVE);
class StagedInjectionTest : public TestBase {
class StagedInjectionTest : public TestBase<> {
protected:
void SetUp() override;
};

View File

@ -19,7 +19,7 @@ private:
bool m_satisfyActivationSwithSpeedAndTpsConditions { false };
};
class LaunchTestBase : public TestBase {
class LaunchTestBase : public TestBase<> {
protected:
void setUpTestConfig(const LaunchTestConfig& config);

View File

@ -11,7 +11,7 @@ namespace {
constexpr float TEST_LUA_SOFT_SPARK_SKIP = 239.0f;
constexpr float TEST_LUA_HARD_SPARK_SKIP = 174.0f;
class LaunchTargetSkipRatioTest : public TestBase {
class LaunchTargetSkipRatioTest : public TestBase<> {
protected:
void SetUp() override;
};

View File

@ -6,7 +6,7 @@
#include "util/test_base.h"
class NitrousTestBase : public TestBase {
class NitrousTestBase : public TestBase<> {
protected:
static constexpr switch_input_pin_e TEST_NITROUS_CONTROL_ARMING_PIN = Gpio::A13;
static constexpr uint16_t TEST_MIN_VEHICLE_SPEED = 25;

View File

@ -15,7 +15,7 @@ namespace {
const char* const context;
};
class NitrousAfrConditionTest : public TestBase {
class NitrousAfrConditionTest : public TestBase<> {
protected:
static constexpr float TEST_DEFAULT_LAMBDA1 = engine_configuration_defaults::NITROUS_MAXIMUM_AFR / STOICH_RATIO;

View File

@ -7,8 +7,7 @@
#include "util/test_base.h"
namespace {
class NitrousArmingTest: public TestBase
{
class NitrousArmingTest: public TestBase<> {
protected:
static constexpr switch_input_pin_e TEST_NITROUS_CONTROL_ARMING_PIN = Gpio::A13;
static constexpr lua_gauge_e TEST_NITROUS_LUA_GAUGE = LUA_GAUGE_3;

View File

@ -15,7 +15,7 @@ namespace {
const char* const context;
};
class NitrousCltConditionTest : public TestBase {
class NitrousCltConditionTest : public TestBase<> {
protected:
static constexpr uint8_t TEST_MIN_CLT = 51;

View File

@ -13,7 +13,7 @@ namespace {
const char* const context;
};
class NitrousMapConditionTest : public TestBase {
class NitrousMapConditionTest : public TestBase<> {
protected:
static constexpr int TEST_MAX_MAP = 45;

View File

@ -15,7 +15,7 @@ namespace {
const char* const context;
};
class NitrousRpmConditionTest : public TestBase {
class NitrousRpmConditionTest : public TestBase<> {
protected:
static constexpr uint16_t TEST_ACTIVATION_RPM = 239;
static constexpr uint16_t TEST_DEACTIVATION_RPM = 932;

View File

@ -15,7 +15,7 @@ namespace {
const char* const context;
};
class NitrousSpeedConditionTest : public TestBase {
class NitrousSpeedConditionTest : public TestBase<> {
protected:
static constexpr uint16_t TEST_MIN_VEHICLE_SPEED = 33;

View File

@ -15,7 +15,7 @@ namespace {
const char* const context;
};
class NitrousTpsConditionTest : public TestBase {
class NitrousTpsConditionTest : public TestBase<> {
protected:
static constexpr int TEST_MIN_TPS = 34;

View File

@ -6,7 +6,7 @@
#include "util/test_base.h"
class FlatShiftConditionTestBase : public TestBase {
class FlatShiftConditionTestBase : public TestBase<> {
protected:
static constexpr switch_input_pin_e TEST_TORQUE_REDUCTION_BUTTON_PIN = Gpio::G10;
static constexpr float TEST_TORQUE_REDUCTION_ARMING_APP = 7.89;

View File

@ -9,7 +9,7 @@
namespace {
constexpr float TEST_TORQUE_REDUCTION_ARMING_APP = 17.0f;
class ShiftTorqueReductionAppConditionTest : public TestBase {
class ShiftTorqueReductionAppConditionTest : public TestBase<> {
protected:
void checkAppCondition(std::optional<float> rpm, bool expectedAppCondition, const char* context);
};

View File

@ -7,7 +7,7 @@
#include "util/test_base.h"
namespace {
class ShiftTorqueReductionFlatShiftConditionTest : public TestBase {
class ShiftTorqueReductionFlatShiftConditionTest : public TestBase<> {
protected:
static constexpr switch_input_pin_e TEST_TORQUE_REDUCTION_BUTTON_PIN = Gpio::E13;
static constexpr float TEST_TORQUE_REDUCTION_TIME = 123.45f;

View File

@ -9,7 +9,7 @@
namespace {
constexpr float TEST_TORQUE_REDUCTION_ARMING_RPM = 239.0f;
class ShiftTorqueReductionRpmConditionTest : public TestBase {
class ShiftTorqueReductionRpmConditionTest : public TestBase<> {
protected:
void checkRpmCondition(float rpm, bool expectedRpmCondition, const char* context);
};

View File

@ -11,7 +11,7 @@ namespace {
constexpr float TEST_TORQUE_REDUCTION_TIME = 239.17;
constexpr float IMMEDIATELY = 0.0f;
class ShiftTorqueReductionTimeConditionTest : public TestBase {
class ShiftTorqueReductionTimeConditionTest : public TestBase<> {
protected:
void waitAndCheckTimeCondition(
float timeoutInMs,

View File

@ -17,7 +17,7 @@ namespace {
const bool torqueReductionTriggerPinState;
};
class ShiftTorqueReductionTriggerPinTest : public TestBase {
class ShiftTorqueReductionTriggerPinTest : public TestBase<> {
protected:
void checkShiftTorqueReductionState(const ShiftTorqueReductionTriggerPinTestData& expected);
void checkShiftTorqueReductionStateAfterPeriodicFastCallback(

View File

@ -5,153 +5,3 @@
#include "pch.h"
#include "test_base.h"
void TestBase::SetUp() {
eth = std::make_unique<EngineTestHelper>(engine_type_e::TEST_ENGINE);
}
void TestBase::TearDown() {
eth.reset();
}
TestEngineConfiguration& TestBase::getTestEngineConfiguration() {
return TestEngineConfiguration::getInstance();
}
TestPersistentConfiguration& TestBase::getTestPersistentConfiguration() {
return TestPersistentConfiguration::getInstance();
}
TestLuaScriptExecutor& TestBase::getTestLuaScriptExecutor() {
return TestLuaScriptExecutor::getInstance();
}
TestEngineState& TestBase::getTestEngineState() {
return TestEngineState::getInstance();
}
void TestBase::setUpEngineConfiguration(const EngineConfig& config) {
// Other Sensor Inputs
getTestEngineConfiguration().configureClutchDownPin(config.getClutchDownPin());
// Launch Control
getTestEngineConfiguration().configureLaunchActivatePin(config.getLaunchActivatePin());
getTestEngineConfiguration().configureLaunchActivateInverted(config.getLaunchActivateInverted());
getTestEngineConfiguration().configureLaunchControlEnabled(config.getLaunchControlEnabled());
getTestEngineConfiguration().configureLaunchRpm(config.getLaunchRpm());
getTestEngineConfiguration().configureLaunchRpmWindow(config.getLaunchRpmWindow());
getTestEngineConfiguration().configureLaunchCorrectionsEndRpm(config.getLaunchCorrectionsEndRpm());
getTestEngineConfiguration().configureIgnitionRetardEnable(config.getIgnitionRetardEnable());
getTestEngineConfiguration().configureIgnitionRetard(config.getIgnitionRetard());
getTestEngineConfiguration().configureSmoothRetardMode(config.getSmoothRetardMode());
getTestEngineConfiguration().configureEnableIgnitionCut(config.getEnableIgnitionCut());
getTestEngineConfiguration().configureInitialIgnitionCutPercent(config.getInitialIgnitionCut());
getTestEngineConfiguration().configureFinalIgnitionCutPercentBeforeLaunch(config.getFinalIgnitionCutBeforeLaunch());
// Shift Torque Reduction (Flat Shift)
getTestEngineConfiguration().configureTorqueReductionEnabled(config.getTorqueReductionEnabled());
getTestEngineConfiguration().configureTorqueReductionActivationMode(config.getTorqueReductionActivationMode());
getTestEngineConfiguration().configureTorqueReductionTriggerPin(config.getTorqueReductionTriggerPin());
getTestEngineConfiguration().configureTorqueReductionButtonInverted(config.getTorqueReductionTriggerPinInverted());
getTestEngineConfiguration().configureLimitTorqueReductionTime(config.getLimitTorqueReductionTime());
getTestEngineConfiguration().configureTorqueReductionTime(config.getTorqueReductionTime());
getTestEngineConfiguration().configureTorqueReductionArmingRpm(config.getTorqueReductionArmingRpm());
getTestEngineConfiguration().configureTorqueReductionArmingApp(config.getTorqueReductionArmingApp());
getTestEngineConfiguration().configureTorqueReductionIgnitionCut(config.getTorqueReductionIgnitionCut());
getTestEngineConfiguration().configureTorqueReductionIgnitionRetard(config.getTorqueReductionIgnitionRetard());
getTestEngineConfiguration().configureFuelPressureSensorMode(config.getFuelPressureSensorMode());
// Injector
getTestEngineConfiguration().configureInjectorFlowAsMassFlow(config.getInjectorFlowAsMassFlow());
getTestEngineConfiguration().configureInjectorFlow(config.getInjectorFlow());
getTestEngineConfiguration().configureInjectorBattLagCorr(config.getInjectorBattLagCorr());
getTestEngineConfiguration().configureFuelReferencePressure(config.getFuelReferencePressure());
getTestEngineConfiguration().configureInjectorCompensationMode(config.getInjectorCompensationMode());
// Secondary injector
getTestEngineConfiguration().configureInjectorSecondaryFlow(config.getInjectorSecondaryFlow());
getTestEngineConfiguration().configureInjectorSecondaryBattLagCorr(config.getInjectorSecondaryBattLagCorr());
getTestEngineConfiguration().configureSecondaryInjectorFuelReferencePressure(
config.getSecondaryInjectorFuelReferencePressure()
);
getTestEngineConfiguration().configureSecondaryInjectorCompensationMode(
config.getSecondaryInjectorCompensationMode()
);
// Staged injection
getTestEngineConfiguration().configureEnableStagedInjection(config.getStagedInjectionEnabled());
// Nitrous control
getTestEngineConfiguration().configureNitrousControlEnabled(config.getNitrousControlEnabled());
getTestEngineConfiguration().configureNitrousControlArmingMethod(config.getNitrousControlArmingMethod());
getTestEngineConfiguration().configureNitrousControlTriggerPin(config.getNitrousControlTriggerPin());
getTestEngineConfiguration().configureNitrousControlTriggerPinInverted(
config.getNitrousControlTriggerPinInverted()
);
getTestEngineConfiguration().configureNitrousControlTriggerPinMode(config.getNitrousControlTriggerPinMode());
getTestEngineConfiguration().configureNitrousLuaGauge(config.getNitrousLuaGauge());
getTestEngineConfiguration().configureNitrousLuaGaugeMeaning(config.getNitrousLuaGaugeMeaning());
getTestEngineConfiguration().configureNitrousLuaGaugeArmingValue(config.getNitrousLuaGaugeArmingValue());
getTestEngineConfiguration().configureNitrousMinimumVehicleSpeed(config.getNitrousMinimumVehicleSpeed());
getTestEngineConfiguration().configureNitrousMinimumTps(config.getNitrousMinimumTps());
getTestEngineConfiguration().configureNitrousMinimumClt(config.getNitrousMinimumClt());
getTestEngineConfiguration().configureNitrousMaximumMap(config.getNitrousMaximumMap());
getTestEngineConfiguration().configureNitrousMaximumAfr(config.getNitrousMaximumAfr());
getTestEngineConfiguration().configureNitrousActivationRpm(config.getNitrousActivationRpm());
getTestEngineConfiguration().configureNitrousDeactivationRpm(config.getNitrousDeactivationRpm());
getTestEngineConfiguration().configureNitrousDeactivationRpmWindow(
config.getNitrousDeactivationRpmWindow()
);
getTestEngineConfiguration().configureNitrousFuelAdderPercent(
config.getNitrousFuelAdderPercent()
);
getTestEngineConfiguration().configureNitrousIgnitionRetard(config.getNitrousIgnitionRetard());
}
void TestBase::periodicFastCallback() {
// run the ignition math
engine->periodicFastCallback();
}
void TestBase::periodicSlowCallback() {
engine->periodicSlowCallback();
}
void TestBase::updateVehicleSpeed(const std::optional<float> speed, void (TestBase::* const postAction)()) {
updateSensor(SensorType::VehicleSpeed, speed, postAction);
}
void TestBase::updateRpm(const std::optional<float> rpm, void (TestBase::* const postAction)()) {
updateSensor(SensorType::Rpm, rpm, postAction);
}
void TestBase::updateApp(const std::optional<float> app, void (TestBase::* const postAction)()) {
updateSensor(SensorType::DriverThrottleIntent, app, postAction);
}
void TestBase::updateClt(const std::optional<float> clt, void (TestBase::* const postAction)()) {
updateSensor(SensorType::Clt, clt, postAction);
}
void TestBase::updateMap(const std::optional<float> map, void (TestBase::* const postAction)()) {
updateSensor(SensorType::Map, map, postAction);
}
void TestBase::updateLambda1(std::optional<float> lambda1, void (TestBase::* const postAction)()) {
updateSensor(SensorType::Lambda1, lambda1, postAction);
}
void TestBase::updateSensor(
const SensorType sensor,
const std::optional<float> sensorReading,
void (TestBase::* const postAction)()
) {
if (sensorReading.has_value()) {
Sensor::setMockValue(sensor, sensorReading.value());
} else {
Sensor::resetMockValue(sensor);
}
(this->*postAction)();
}

View File

@ -10,7 +10,8 @@
#include "test_lua_script_executor.h"
#include "engine_config.h"
class TestBase : public testing::Test {
template <class GtestBase = testing::Test>
class TestBase : public GtestBase {
protected:
void SetUp() override;
void TearDown() override;
@ -42,6 +43,4 @@ private:
std::unique_ptr<EngineTestHelper> eth;
};
template<typename ModuleType> ModuleType& TestBase::getModule() {
return engine->module<ModuleType>().unmock();
}
#include "test_base.hpp" // template methods implementation

View File

@ -0,0 +1,171 @@
template<class GtestBase>
template<typename ModuleType>
ModuleType& TestBase<GtestBase>::getModule() {
return engine->module<ModuleType>().unmock();
}
template<class GtestBase>
void TestBase<GtestBase>::SetUp() {
eth = std::make_unique<EngineTestHelper>(engine_type_e::TEST_ENGINE);
}
template<class GtestBase>
void TestBase<GtestBase>::TearDown() {
eth.reset();
}
template<class GtestBase>
TestEngineConfiguration& TestBase<GtestBase>::getTestEngineConfiguration() {
return TestEngineConfiguration::getInstance();
}
template<class GtestBase>
TestPersistentConfiguration& TestBase<GtestBase>::getTestPersistentConfiguration() {
return TestPersistentConfiguration::getInstance();
}
template<class GtestBase>
TestLuaScriptExecutor& TestBase<GtestBase>::getTestLuaScriptExecutor() {
return TestLuaScriptExecutor::getInstance();
}
template<class GtestBase>
TestEngineState& TestBase<GtestBase>::getTestEngineState() {
return TestEngineState::getInstance();
}
template<class GtestBase>
void TestBase<GtestBase>::setUpEngineConfiguration(const EngineConfig& config) {
// Other Sensor Inputs
getTestEngineConfiguration().configureClutchDownPin(config.getClutchDownPin());
// Launch Control
getTestEngineConfiguration().configureLaunchActivatePin(config.getLaunchActivatePin());
getTestEngineConfiguration().configureLaunchActivateInverted(config.getLaunchActivateInverted());
getTestEngineConfiguration().configureLaunchControlEnabled(config.getLaunchControlEnabled());
getTestEngineConfiguration().configureLaunchRpm(config.getLaunchRpm());
getTestEngineConfiguration().configureLaunchRpmWindow(config.getLaunchRpmWindow());
getTestEngineConfiguration().configureLaunchCorrectionsEndRpm(config.getLaunchCorrectionsEndRpm());
getTestEngineConfiguration().configureIgnitionRetardEnable(config.getIgnitionRetardEnable());
getTestEngineConfiguration().configureIgnitionRetard(config.getIgnitionRetard());
getTestEngineConfiguration().configureSmoothRetardMode(config.getSmoothRetardMode());
getTestEngineConfiguration().configureEnableIgnitionCut(config.getEnableIgnitionCut());
getTestEngineConfiguration().configureInitialIgnitionCutPercent(config.getInitialIgnitionCut());
getTestEngineConfiguration().configureFinalIgnitionCutPercentBeforeLaunch(config.getFinalIgnitionCutBeforeLaunch());
// Shift Torque Reduction (Flat Shift)
getTestEngineConfiguration().configureTorqueReductionEnabled(config.getTorqueReductionEnabled());
getTestEngineConfiguration().configureTorqueReductionActivationMode(config.getTorqueReductionActivationMode());
getTestEngineConfiguration().configureTorqueReductionTriggerPin(config.getTorqueReductionTriggerPin());
getTestEngineConfiguration().configureTorqueReductionButtonInverted(config.getTorqueReductionTriggerPinInverted());
getTestEngineConfiguration().configureLimitTorqueReductionTime(config.getLimitTorqueReductionTime());
getTestEngineConfiguration().configureTorqueReductionTime(config.getTorqueReductionTime());
getTestEngineConfiguration().configureTorqueReductionArmingRpm(config.getTorqueReductionArmingRpm());
getTestEngineConfiguration().configureTorqueReductionArmingApp(config.getTorqueReductionArmingApp());
getTestEngineConfiguration().configureTorqueReductionIgnitionCut(config.getTorqueReductionIgnitionCut());
getTestEngineConfiguration().configureTorqueReductionIgnitionRetard(config.getTorqueReductionIgnitionRetard());
getTestEngineConfiguration().configureFuelPressureSensorMode(config.getFuelPressureSensorMode());
// Injector
getTestEngineConfiguration().configureInjectorFlowAsMassFlow(config.getInjectorFlowAsMassFlow());
getTestEngineConfiguration().configureInjectorFlow(config.getInjectorFlow());
getTestEngineConfiguration().configureInjectorBattLagCorr(config.getInjectorBattLagCorr());
getTestEngineConfiguration().configureFuelReferencePressure(config.getFuelReferencePressure());
getTestEngineConfiguration().configureInjectorCompensationMode(config.getInjectorCompensationMode());
// Secondary injector
getTestEngineConfiguration().configureInjectorSecondaryFlow(config.getInjectorSecondaryFlow());
getTestEngineConfiguration().configureInjectorSecondaryBattLagCorr(config.getInjectorSecondaryBattLagCorr());
getTestEngineConfiguration().configureSecondaryInjectorFuelReferencePressure(
config.getSecondaryInjectorFuelReferencePressure()
);
getTestEngineConfiguration().configureSecondaryInjectorCompensationMode(
config.getSecondaryInjectorCompensationMode()
);
// Staged injection
getTestEngineConfiguration().configureEnableStagedInjection(config.getStagedInjectionEnabled());
// Nitrous control
getTestEngineConfiguration().configureNitrousControlEnabled(config.getNitrousControlEnabled());
getTestEngineConfiguration().configureNitrousControlArmingMethod(config.getNitrousControlArmingMethod());
getTestEngineConfiguration().configureNitrousControlTriggerPin(config.getNitrousControlTriggerPin());
getTestEngineConfiguration().configureNitrousControlTriggerPinInverted(
config.getNitrousControlTriggerPinInverted()
);
getTestEngineConfiguration().configureNitrousControlTriggerPinMode(config.getNitrousControlTriggerPinMode());
getTestEngineConfiguration().configureNitrousLuaGauge(config.getNitrousLuaGauge());
getTestEngineConfiguration().configureNitrousLuaGaugeMeaning(config.getNitrousLuaGaugeMeaning());
getTestEngineConfiguration().configureNitrousLuaGaugeArmingValue(config.getNitrousLuaGaugeArmingValue());
getTestEngineConfiguration().configureNitrousMinimumVehicleSpeed(config.getNitrousMinimumVehicleSpeed());
getTestEngineConfiguration().configureNitrousMinimumTps(config.getNitrousMinimumTps());
getTestEngineConfiguration().configureNitrousMinimumClt(config.getNitrousMinimumClt());
getTestEngineConfiguration().configureNitrousMaximumMap(config.getNitrousMaximumMap());
getTestEngineConfiguration().configureNitrousMaximumAfr(config.getNitrousMaximumAfr());
getTestEngineConfiguration().configureNitrousActivationRpm(config.getNitrousActivationRpm());
getTestEngineConfiguration().configureNitrousDeactivationRpm(config.getNitrousDeactivationRpm());
getTestEngineConfiguration().configureNitrousDeactivationRpmWindow(
config.getNitrousDeactivationRpmWindow()
);
getTestEngineConfiguration().configureNitrousFuelAdderPercent(
config.getNitrousFuelAdderPercent()
);
getTestEngineConfiguration().configureNitrousIgnitionRetard(config.getNitrousIgnitionRetard());
}
template<class GtestBase>
void TestBase<GtestBase>::periodicFastCallback() {
// run the ignition math
engine->periodicFastCallback();
}
template<class GtestBase> void
TestBase<GtestBase>::periodicSlowCallback() {
engine->periodicSlowCallback();
}
template<class GtestBase>
void TestBase<GtestBase>::updateVehicleSpeed(const std::optional<float> speed, void (TestBase::* const postAction)()) {
updateSensor(SensorType::VehicleSpeed, speed, postAction);
}
template<class GtestBase>
void TestBase<GtestBase>::updateRpm(const std::optional<float> rpm, void (TestBase::* const postAction)()) {
updateSensor(SensorType::Rpm, rpm, postAction);
}
template<class GtestBase>
void TestBase<GtestBase>::updateApp(const std::optional<float> app, void (TestBase::* const postAction)()) {
updateSensor(SensorType::DriverThrottleIntent, app, postAction);
}
template<class GtestBase>
void TestBase<GtestBase>::updateClt(const std::optional<float> clt, void (TestBase::* const postAction)()) {
updateSensor(SensorType::Clt, clt, postAction);
}
template<class GtestBase>
void TestBase<GtestBase>::updateMap(const std::optional<float> map, void (TestBase::* const postAction)()) {
updateSensor(SensorType::Map, map, postAction);
}
template<class GtestBase>
void TestBase<GtestBase>::updateLambda1(std::optional<float> lambda1, void (TestBase::* const postAction)()) {
updateSensor(SensorType::Lambda1, lambda1, postAction);
}
template<class GtestBase>
void TestBase<GtestBase>::updateSensor(
const SensorType sensor,
const std::optional<float> sensorReading,
void (TestBase::* const postAction)()
) {
if (sensorReading.has_value()) {
Sensor::setMockValue(sensor, sensorReading.value());
} else {
Sensor::resetMockValue(sensor);
}
(this->*postAction)();
}