GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/ignition_injection/test_fuelCut.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 98 0 98
Functions: 100.0% 6 0 6
Branches: 59.0% 98 0 166
Decisions: -% 0 - 0

Line Branch Decision Exec Source
1 /*
2 * @file test_fuelCut.cpp
3 *
4 * @date Mar 22, 2018
5 * @author Andrey Belomutskiy, (c) 2012-2020
6 */
7
8 #include "pch.h"
9
10 #include "event_queue.h"
11
12 using ::testing::_;
13
14 // Define some helpers for not-cut and cut
15 #define EXPECT_NORMAL() EXPECT_FLOAT_EQ(normalInjDuration, engine->engineState.injectionDuration)
16 #define EXPECT_CUT() EXPECT_FLOAT_EQ(0, engine->engineState.injectionDuration)
17
18 #if FUEL_RPM_COUNT == 16
19 4 TEST(fuelCut, coasting) {
20
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
21
5/5
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 10 taken 1 time.
✓ Branch 13 taken 1 time.
✓ Branch 17 taken 1 time.
3 EXPECT_CALL(*eth.mockAirmass, getAirmass(_, _))
22
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillRepeatedly(Return(AirmassResult{0.1008f, 50.0f}));
23
24 // configure coastingFuelCut
25 1 engineConfiguration->coastingFuelCutEnabled = true;
26 1 engineConfiguration->coastingFuelCutRpmLow = 1300;
27 1 engineConfiguration->coastingFuelCutRpmHigh = 1500;
28 1 engineConfiguration->coastingFuelCutTps = 2;
29 1 engineConfiguration->coastingFuelCutClt = 30;
30 1 engineConfiguration->coastingFuelCutMap = 100;
31 // set cranking threshold
32 1 engineConfiguration->cranking.rpm = 999;
33
34 // basic engine setup
35
1/1
✓ Branch 1 taken 1 time.
1 setupSimpleTestEngineWithMafAndTT_ONE_trigger(&eth);
36
37
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Map, 0);
38
39 // mock CLT - just above threshold ('hot engine')
40 1 float hotClt = engineConfiguration->coastingFuelCutClt + 1;
41
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Clt, hotClt);
42 // mock TPS - throttle is opened
43
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::DriverThrottleIntent, 60);
44 // set 'running' RPM - just above RpmHigh threshold
45
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, engineConfiguration->coastingFuelCutRpmHigh + 1);
46 // 'advance' time (amount doesn't matter)
47
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardUs(1000);
48
49 1 const float normalInjDuration = 1.5f;
50 /*
51 * We need to pass through all rpm changes (high-mid-low-mid-high) because of state-machine
52 */
53
54 // process
55
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
56
57 // this is normal injection mode (the throttle is opened), no fuel cut-off
58
2/6
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
1 EXPECT_NORMAL();
59
60 // 'releasing' the throttle
61
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::DriverThrottleIntent, 0);
62
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
63
64 // Fuel cut-off is enabled now
65
2/6
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
1 EXPECT_CUT();
66
67 // Now drop the CLT below threshold
68
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Clt, engineConfiguration->coastingFuelCutClt - 1);
69
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
70
71 // Fuel cut-off should be diactivated - the engine is 'cold'
72
2/6
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
1 EXPECT_NORMAL();
73
74 // restore CLT
75
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Clt, hotClt);
76 // And set RPM - somewhere between RpmHigh and RpmLow threshold
77
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, (engineConfiguration->coastingFuelCutRpmHigh + engineConfiguration->coastingFuelCutRpmLow) / 2);
78
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
79
80 // Fuel cut-off is enabled - nothing should change
81
2/6
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
1 EXPECT_NORMAL();
82
83 // Now drop RPM just below RpmLow threshold
84
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, engineConfiguration->coastingFuelCutRpmLow - 1);
85
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
86
87 // Fuel cut-off is now disabled (the engine is idling)
88
2/6
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
1 EXPECT_NORMAL();
89
90 // Now change RPM just below RpmHigh threshold
91
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, engineConfiguration->coastingFuelCutRpmHigh - 1);
92
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
93
94 // Fuel cut-off is still disabled
95
2/6
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
1 EXPECT_NORMAL();
96
97 // Now set RPM just above RpmHigh threshold
98
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, engineConfiguration->coastingFuelCutRpmHigh + 1);
99
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
100
101 // Fuel cut-off is active again!
102
2/6
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
1 EXPECT_CUT();
103
104 // Configure vehicle speed thresholds
105 1 engineConfiguration->coastingFuelCutVssHigh = 50;
106 1 engineConfiguration->coastingFuelCutVssLow = 40;
107
108 // High speed, should still be cut.
109
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::VehicleSpeed, 55);
110
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
111
2/6
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
1 EXPECT_CUT();
112
113 // Between thresholds, still cut.
114
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::VehicleSpeed, 45);
115
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
116
2/6
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
1 EXPECT_CUT();
117
118 // Below lower threshold, normal fuel resumes
119
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::VehicleSpeed, 35);
120
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
121
2/6
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
1 EXPECT_NORMAL();
122
123 // Between thresholds, still normal.
124
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::VehicleSpeed, 45);
125
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
126
2/6
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
1 EXPECT_NORMAL();
127
128 // Back above upper, cut again.
129
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::VehicleSpeed, 55);
130
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
131
2/6
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
1 EXPECT_CUT();
132 2 }
133 #endif //FUEL_RPM_COUNT == 16
134
135 #if FUEL_RPM_COUNT == 16
136 4 TEST(fuelCut, delay) {
137
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
138
5/5
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 10 taken 1 time.
✓ Branch 13 taken 1 time.
✓ Branch 17 taken 1 time.
3 EXPECT_CALL(*eth.mockAirmass, getAirmass(_, _))
139
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillRepeatedly(Return(AirmassResult{0.1008f, 50.0f}));
140
141 // configure coastingFuelCut
142 1 engineConfiguration->coastingFuelCutEnabled = true;
143 1 engineConfiguration->coastingFuelCutRpmLow = 1300;
144 1 engineConfiguration->coastingFuelCutRpmHigh = 1500;
145 1 engineConfiguration->coastingFuelCutTps = 2;
146 1 engineConfiguration->coastingFuelCutClt = 30;
147 1 engineConfiguration->coastingFuelCutMap = 100;
148 // set cranking threshold
149 1 engineConfiguration->cranking.rpm = 999;
150
151 // delay is 1 second
152 1 engineConfiguration->dfcoDelay = 1.0f;
153
154 // basic engine setup
155
1/1
✓ Branch 1 taken 1 time.
1 setupSimpleTestEngineWithMafAndTT_ONE_trigger(&eth);
156
157
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Map, 0);
158
159 // mock CLT - just above threshold ('hot engine')
160 1 float hotClt = engineConfiguration->coastingFuelCutClt + 1;
161
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Clt, hotClt);
162 // mock TPS - throttle is opened
163
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::DriverThrottleIntent, 60);
164 // set 'running' RPM - just above RpmHigh threshold
165
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, engineConfiguration->coastingFuelCutRpmHigh + 1);
166 // 'advance' time (amount doesn't matter)
167
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardUs(1000);
168
169 1 const float normalInjDuration = 1.5f;
170
171
1/1
✓ Branch 1 taken 1 time.
1 setTimeNowUs(1e6);
172
173 // process
174
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
175
176 // this is normal injection mode (the throttle is opened), no fuel cut-off
177
2/6
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
1 EXPECT_NORMAL();
178
179 // 'releasing' the throttle
180
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::DriverThrottleIntent, 0);
181
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
182
183 // Shouldn't cut yet, since not enough time has elapsed
184
2/6
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
1 EXPECT_NORMAL();
185
186 // Change nothing else, but advance time and update again
187
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(0.9e6);
188
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
189
190 // too soon, still no cut
191
2/6
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
1 EXPECT_NORMAL();
192
193 // Change nothing else, but advance time and update again
194
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(0.2e6);
195
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
196
197 // Should now be cut!
198
2/6
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
1 EXPECT_CUT();
199
200 // Put the throtle back, and it should come back instantly
201
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::DriverThrottleIntent, 30);
202
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
203
2/6
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
1 EXPECT_NORMAL();
204 2 }
205 #endif //FUEL_RPM_COUNT == 16
206