| Line | Branch | Decision | Exec | Source |
|---|---|---|---|---|
| 1 | #include "pch.h" | |||
| 2 | ||||
| 3 | #include "closed_loop_fuel_cell.h" | |||
| 4 | #include "closed_loop_fuel.h" | |||
| 5 | ||||
| 6 | using ::testing::_; | |||
| 7 | using ::testing::Return; | |||
| 8 | using ::testing::StrictMock; | |||
| 9 | ||||
| 10 | class MockClCell : public ClosedLoopFuelCellBase { | |||
| 11 | public: | |||
| 12 | 4 | MOCK_METHOD(float, getLambdaError, (), (const)); | ||
| 13 | 2 | MOCK_METHOD(float, getMaxAdjustment, (), (const)); | ||
| 14 | 2 | MOCK_METHOD(float, getMinAdjustment, (), (const)); | ||
| 15 | 2 | MOCK_METHOD(float, getIntegratorGain, (), (const)); | ||
| 16 | }; | |||
| 17 | ||||
| 18 | 4 | TEST(ClosedLoopCell, TestDeadband) { | ||
| 19 |
1/1✓ Branch 2 taken 1 time.
|
1 | StrictMock<MockClCell> cl; | |
| 20 | ||||
| 21 | // Error is more than deadtime, so nothing else should be called | |||
| 22 |
3/3✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
|
3 | EXPECT_CALL(cl, getLambdaError()) | |
| 23 |
3/3✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
|
3 | .WillOnce(Return(0.05f)); | |
| 24 | ||||
| 25 |
1/1✓ Branch 1 taken 1 time.
|
1 | cl.update(0.1f, true); | |
| 26 | ||||
| 27 | // Should be zero adjustment | |||
| 28 |
3/7✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
|
1 | EXPECT_FLOAT_EQ(cl.getAdjustment(), 1.0f); | |
| 29 | 2 | } | ||
| 30 | ||||
| 31 | 4 | TEST(ClosedLoopFuelCell, AdjustRate) { | ||
| 32 |
1/1✓ Branch 2 taken 1 time.
|
1 | StrictMock<MockClCell> cl; | |
| 33 | ||||
| 34 |
3/3✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
|
3 | EXPECT_CALL(cl, getLambdaError()) | |
| 35 |
3/3✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
|
3 | .WillOnce(Return(0.1f)); | |
| 36 |
3/3✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
|
3 | EXPECT_CALL(cl, getMinAdjustment()) | |
| 37 |
3/3✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
|
3 | .WillOnce(Return(-0.2f)); | |
| 38 |
3/3✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
|
3 | EXPECT_CALL(cl, getMaxAdjustment()) | |
| 39 |
3/3✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
|
3 | .WillOnce(Return(0.2f)); | |
| 40 |
3/3✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
|
3 | EXPECT_CALL(cl, getIntegratorGain()) | |
| 41 |
3/3✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
|
3 | .WillOnce(Return(2.0f)); | |
| 42 | ||||
| 43 |
1/1✓ Branch 1 taken 1 time.
|
1 | cl.update(0.0f, false); | |
| 44 | ||||
| 45 | // Should have integrated 0.2 * dt | |||
| 46 | // dt = 1000.0f / FAST_CALLBACK_PERIOD_MS | |||
| 47 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 13 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_FLOAT_EQ(cl.getAdjustment(), 1 + (0.2f / (1000.0f / FAST_CALLBACK_PERIOD_MS))); | |
| 48 | 2 | } | ||
| 49 | ||||
| 50 | 4 | TEST(ClosedLoopFuel, CellSelection) { | ||
| 51 | 1 | ShortTermFuelTrim stft; | ||
| 52 | 1 | stft_s cfg; | ||
| 53 | ||||
| 54 | // Sensible region config | |||
| 55 | 1 | cfg.maxIdleRegionRpm = 1500; | ||
| 56 | 1 | cfg.minPowerLoad = 80; | ||
| 57 | 1 | cfg.maxOverrunLoad = 30; | ||
| 58 | ||||
| 59 |
1/1✓ Branch 1 taken 1 time.
|
1 | stft.init(&cfg); | |
| 60 | ||||
| 61 | // Test idle | |||
| 62 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(0u, stft.computeStftBin(1000, 10, cfg)); | |
| 63 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(0u, stft.computeStftBin(1000, 50, cfg)); | |
| 64 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(0u, stft.computeStftBin(1000, 90, cfg)); | |
| 65 | ||||
| 66 | // Test overrun | |||
| 67 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(1u, stft.computeStftBin(2000, 10, cfg)); | |
| 68 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(1u, stft.computeStftBin(4000, 10, cfg)); | |
| 69 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(1u, stft.computeStftBin(10000, 10, cfg)); | |
| 70 | ||||
| 71 | // Test load | |||
| 72 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(2u, stft.computeStftBin(2000, 90, cfg)); | |
| 73 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(2u, stft.computeStftBin(4000, 90, cfg)); | |
| 74 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(2u, stft.computeStftBin(10000, 90, cfg)); | |
| 75 | ||||
| 76 | // Main cell | |||
| 77 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(3u, stft.computeStftBin(2000, 50, cfg)); | |
| 78 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(3u, stft.computeStftBin(4000, 50, cfg)); | |
| 79 |
3/7✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(3u, stft.computeStftBin(10000, 50, cfg)); | |
| 80 | 1 | } | ||
| 81 | ||||
| 82 | 4 | TEST(ClosedLoopFuel, afrLimits) { | ||
| 83 | 1 | ShortTermFuelTrim stft; | ||
| 84 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_ENGINE); | |
| 85 | ||||
| 86 | 1 | engineConfiguration->stft.minAfr = 10; // 10.0 AFR | ||
| 87 | 1 | engineConfiguration->stft.maxAfr = 18; // 18.0 AFR | ||
| 88 | ||||
| 89 |
1/1✓ Branch 1 taken 1 time.
|
1 | stft.init(&engineConfiguration->stft); | |
| 90 | ||||
| 91 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Lambda1, 0.1f); | |
| 92 |
3/7✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_NE(stft.getLearningState(SensorType::Lambda1), stftEnabled); | |
| 93 | ||||
| 94 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Lambda1, 1.0f); | |
| 95 |
3/7✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(stft.getLearningState(SensorType::Lambda1), stftEnabled); | |
| 96 | ||||
| 97 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Lambda1, 2.0f); | |
| 98 |
3/7✓ Branch 4 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_NE(stft.getLearningState(SensorType::Lambda1), stftEnabled); | |
| 99 | 2 | } | ||
| 100 |