GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/test_stft.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 69 0 69
Functions: 100.0% 20 0 20
Branches: 57.2% 91 0 159
Decisions: -% 0 - 0

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