GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/controllers/algo/test_closed_loop_idle.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 202 0 202
Functions: 100.0% 40 0 40
Branches: 39.2% 115 0 293
Decisions: 100.0% 4 - 4

Line Branch Decision Exec Source
1 /*
2 * @file test_close_loop_idle.cpp
3 *
4 * @date: jun 18, 2025
5 * @author FDSoftware
6 */
7
8 #include "pch.h"
9 #include "closed_loop_idle.h"
10
11 using ::testing::StrictMock;
12 using ::testing::Eq;
13 using ::testing::_;
14
15 using ICP = IIdleController::Phase;
16 using TgtInfo = IIdleController::TargetInfo;
17
18 class MockIdleLTIT : public MockIdleController {
19 public:
20 bool useClosedLoop = true;
21 ICP m_lastPhase = ICP::Cranking;
22
23 6 ICP getCurrentPhase() const {
24 6 return m_lastPhase;
25 }
26 5 TgtInfo getTargetRpm(float clt){
27 5 TgtInfo targetInfo;
28 5 targetInfo.ClosedLoopTarget = 950;
29 5 targetInfo.IdleEntryRpm = 900;
30 5 targetInfo.IdleExitRpm = 1100;
31
32 5 return targetInfo;
33 }
34 };
35
36 4 TEST(LongTermIdleTrim, isValidConditionsForLearning){
37
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
38 // idle config
39 1 engineConfiguration->idleMode = idle_mode_e::IM_AUTO;
40
41 // ltit config
42 1 engineConfiguration->ltitEnabled = true;
43 1 engineConfiguration->ltitStableRpmThreshold = 50; // +-50 rpm
44 1 engineConfiguration->ltitStableTime = 1; // second
45 1 engineConfiguration->ltitIgnitionOnDelay = 1; // second
46 1 engineConfiguration->ltitIntegratorThreshold = 4; // % ?
47
48 1 constexpr int mocked_rpm = 920;
49
50
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockIdleLTIT> idler;
51
1/1
✓ Branch 1 taken 1 time.
1 engine->engineModules.get<IdleController>().set(&idler);
52 1 idler.m_lastPhase = ICP::Idling;
53
54 // LTIT not initialized
55
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(engine->m_ltit.isValidConditionsForLearning(4.5f));
56
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.loadLtitFromConfig();
57
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.onIgnitionStateChanged(true);
58
59
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(MS2US(500));
60 // not enough time has passed yet to fulfill ltitIgnitionOnDelay
61
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(engine->m_ltit.isValidConditionsForLearning(4.5f));
62
63 // integrator too low
64
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(engine->m_ltit.isValidConditionsForLearning(3.0f));
65
66 // integrator too high
67
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(engine->m_ltit.isValidConditionsForLearning(-30.f));
68
69 // isStableIdle update
70
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(MS2US(1000));
71
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.update(mocked_rpm,0,false,false,false,0.45);
72
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(engine->m_ltit.isValidConditionsForLearning(4.5f));
73 2 };
74
75 4 TEST(LongTermIdleTrim, onIgnitionStateChanged) {
76
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
77 1 engine->m_ltit.isStableIdle = true;
78
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.onIgnitionStateChanged(true);
79
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_FALSE(engine->m_ltit.isStableIdle);
80
81 1 engine->m_ltit.updatedLtit = true;
82
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.onIgnitionStateChanged(false);
83
1/6
✗ Branch 3 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 12 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_TRUE(engine->m_ltit.m_pendingSave);
84
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_FALSE(engine->m_ltit.updatedLtit);
85 2 }
86
87
88 4 TEST(LongTermIdleTrim, checkIfShouldSave) {
89
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
90 1 engineConfiguration->ltitIgnitionOffSaveDelay = 2;
91
92 // update m_pendingSave
93 1 engine->m_ltit.updatedLtit = true;
94
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.onIgnitionStateChanged(false);
95
96 // not enough time has passed yet to fulfill ltitIgnitionOffSaveDelay
97
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.checkIfShouldSave();
98
1/6
✗ Branch 3 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 12 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_TRUE(engine->m_ltit.m_pendingSave);
99
100
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(MS2US(2500));
101
102 // now we can save the table
103
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.checkIfShouldSave();
104
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_FALSE(engine->m_ltit.m_pendingSave);
105 2 }
106
107 4 TEST(LongTermIdleTrim, hasValidData) {
108
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
109
110 // controller not initialized
111
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(engine->m_ltit.hasValidData());
112
113 1 setArrayValues(config->ltitTable, 100);
114
115 // correct data
116
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(engine->m_ltit.hasValidData());
117
118 // Now we break almost the entire table with invalid values
119
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 6 times.
✓ Decision 'false' taken 1 time.
7 for (int i = 0; i < LTIT_TABLE_SIZE - 2 ; i++) {
120 6 config->ltitTable[i] = 200;
121 }
122
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(engine->m_ltit.hasValidData());
123 2 }
124
125 4 TEST(LongTermIdleTrim, loadLtitFromConfig) {
126
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
127 1 setArrayValues(config->ltitTable, 105);
128
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.loadLtitFromConfig();
129
1/6
✗ Branch 3 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 12 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_TRUE(engine->m_ltit.ltitTableInitialized);
130
2/6
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_EQ(engine->m_ltit.ltitTableHelper[0], 105);
131 2 }
132
133 4 TEST(LongTermIdleTrim, getLtitFactor) {
134
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
135 1 constexpr auto mocked_rpm = 920;
136 1 constexpr auto mocked_temp = 45.5;
137 // default is false pre-load, but we need to be explicit for LCOV
138 1 engine->m_ltit.ltitTableInitialized = false;
139
140
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(engine->m_ltit.getLtitFactor(mocked_rpm, mocked_temp), 1);
141
142 1 setArrayValues(config->ltitTable, 105);
143
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.loadLtitFromConfig();
144
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_NEAR(engine->m_ltit.getLtitFactor(mocked_rpm, mocked_temp), 1.05, EPS4D);
145 2 }
146
147 // from here to the bottom of the file we test all the branches of "update" function, so expect a lot of test more or less similar!
148
149 class mockedLTIT : public LongTermIdleTrim {
150 public:
151 2 MOCK_METHOD(void, loadLtitFromConfig, (), (override));
152 };
153
154 4 TEST(LongTermIdleTrim, update_not_enabled) {
155
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
156 1 engineConfiguration->ltitEnabled = false;
157 1 constexpr int mocked_rpm = 920;
158
159
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.update(mocked_rpm,0,false,false,false,0.45);
160
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_FALSE(engine->m_ltit.updatedLtit);
161 2 }
162
163 4 TEST(LongTermIdleTrim, update_not_Initialized) {
164
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
165 1 engineConfiguration->ltitEnabled = true;
166 1 constexpr int mocked_rpm = 920;
167
1/1
✓ Branch 2 taken 1 time.
1 mockedLTIT ltit_controller;
168
169
3/3
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
1 EXPECT_CALL(ltit_controller, loadLtitFromConfig());
170
1/1
✓ Branch 1 taken 1 time.
1 ltit_controller.update(mocked_rpm,0,false,false,false,0.45);
171
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_FALSE(ltit_controller.updatedLtit);
172 2 }
173
174 4 TEST(LongTermIdleTrim, update_ignition_delay) {
175
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
176 1 engineConfiguration->ltitIgnitionOnDelay = 1; // second
177 1 engineConfiguration->ltitEnabled = true;
178 1 engine->m_ltit.isStableIdle = true;
179 1 constexpr int mocked_rpm = 920;
180
181
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.loadLtitFromConfig();
182
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.onIgnitionStateChanged(true);
183
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.update(mocked_rpm,0,false,false,false,0.45);
184
185
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_FALSE(engine->m_ltit.updatedLtit);
186
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_FALSE(engine->m_ltit.isStableIdle);
187 2 }
188
189 4 TEST(LongTermIdleTrim, update_idle) {
190
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
191 1 engineConfiguration->ltitIgnitionOnDelay = 1; // second
192 1 engineConfiguration->ltitStableTime = 2;
193 1 engineConfiguration->ltitStableRpmThreshold = 50; // +-50 rpm
194 1 engineConfiguration->ltitEnabled = true;
195 1 engine->m_ltit.isStableIdle = true;
196 1 constexpr int mocked_rpm = 920;
197
198
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockIdleLTIT> idler;
199
1/1
✓ Branch 1 taken 1 time.
1 engine->engineModules.get<IdleController>().set(&idler);
200
201
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.loadLtitFromConfig();
202
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.onIgnitionStateChanged(true);
203
204
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(MS2US(1500));
205 1 idler.m_lastPhase = ICP::Running;
206
207 // Phase::Idling expect
208
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.update(mocked_rpm, 0, false, false, false, 0.45);
209
210
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_FALSE(engine->m_ltit.updatedLtit);
211
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_FALSE(engine->m_ltit.isStableIdle);
212
213 // rpm range expect
214 1 idler.m_lastPhase = ICP::Idling;
215 // rpm too high for learn!
216
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.update(mocked_rpm + 200, 0, false, false, false, 0.45);
217
218
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_FALSE(engine->m_ltit.updatedLtit);
219
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_FALSE(engine->m_ltit.isStableIdle);
220
221 // stable idle check (false & still not in time)
222 1 engine->m_ltit.isStableIdle = false;
223
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.update(mocked_rpm, 0, false, false, false, 0.45);
224
225
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_FALSE(engine->m_ltit.updatedLtit);
226
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_FALSE(engine->m_ltit.isStableIdle);
227
228 // stable idle check (false & still now in time)
229 1 engine->m_ltit.isStableIdle = false;
230
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.onIgnitionStateChanged(true);
231
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(MS2US(2500));
232
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.update(mocked_rpm, 0, false, false, false, 0.45);
233
234
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_FALSE(engine->m_ltit.updatedLtit);
235
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE(engine->m_ltit.isStableIdle);
236
237 2 }
238
239 4 TEST(LongTermIdleTrim, update) {
240
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
241 // idle config
242 1 engineConfiguration->idleMode = idle_mode_e::IM_AUTO;
243
244 // ltit config
245 1 engineConfiguration->ltitEnabled = true;
246 1 engineConfiguration->ltitStableRpmThreshold = 50; // +-50 rpm
247 1 engineConfiguration->ltitStableTime = 1; // second
248 1 engineConfiguration->ltitIgnitionOnDelay = 1; // second
249 1 engineConfiguration->ltitIntegratorThreshold = 4; // % ?
250 1 setArrayValues(config->ltitTable, 105);
251
252 1 constexpr int mocked_rpm = 920;
253 1 constexpr int mocked_temp = 45.5;
254
255
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockIdleLTIT> idler;
256
1/1
✓ Branch 1 taken 1 time.
1 engine->engineModules.get<IdleController>().set(&idler);
257 1 idler.m_lastPhase = ICP::Idling;
258 1 idler.useClosedLoop = true;
259
260 // LTIT not initialized
261
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(engine->m_ltit.isValidConditionsForLearning(4.5f));
262
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.loadLtitFromConfig();
263
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.onIgnitionStateChanged(true);
264
265 // idle controller isIdleClosedLoop
266
1/1
✓ Branch 1 taken 1 time.
1 engine->engineModules.get<IdleController>()->isIdleClosedLoop = true;
267
268
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(MS2US(2500));
269
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.update(mocked_rpm, mocked_temp, false, false, false, 4.5);
270
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_NEAR(engine->m_ltit.ltitTableHelper[0], 105, EPS4D);
271
1/6
✗ Branch 3 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 12 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_TRUE(engine->m_ltit.updatedLtit);
272 2 }
273
274 //TODO: this func is unused:
275 4 TEST(LongTermIdleTrim, smoothLtitTable){
276
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
277 // ltit config
278 1 engineConfiguration->ltitEnabled = true;
279 1 setArrayValues(engine->m_ltit.ltitTableHelper, 100);
280
281 // randomize a bit the table:
282
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 8 times.
✓ Decision 'false' taken 1 time.
9 for(size_t i = 0; i < LTIT_TABLE_SIZE; i++){
283 8 engine->m_ltit.ltitTableHelper[i] = engine->m_ltit.ltitTableHelper[i] + (5 * i);
284 }
285
286 // invalid factor:
287
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.smoothLtitTable(180);
288
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_FALSE(engine->m_ltit.m_pendingSave);
289
290 // valid factor
291
1/1
✓ Branch 1 taken 1 time.
1 engine->m_ltit.smoothLtitTable(45);
292
2/6
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_EQ(engine->m_ltit.ltitTableHelper[0], 101.125);
293
2/6
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_EQ(engine->m_ltit.ltitTableHelper[1], 105);
294
2/6
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_EQ(engine->m_ltit.ltitTableHelper[3], 115);
295
1/6
✗ Branch 3 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 12 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_TRUE(engine->m_ltit.m_pendingSave);
296 2 }
297