GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/test_launch.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 161 0 161
Functions: 100.0% 28 0 28
Branches: 45.4% 139 0 306
Decisions: 100.0% 4 - 4

Line Branch Decision Exec Source
1 #include "pch.h"
2
3 #include "launch_control.h"
4
5 4 TEST(LaunchControl, TpsCondition) {
6
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
7
8
1/1
✓ Branch 2 taken 1 time.
1 LaunchControlBase dut;
9
10 1 engineConfiguration->launchTpsThreshold = 10;
11
12 // Should return false with failed sensor
13
1/1
✓ Branch 1 taken 1 time.
1 Sensor::resetMockValue(SensorType::DriverThrottleIntent);
14
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(dut.isInsideTpsCondition());
15
16 // Should return false when throttle is closed
17
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::DriverThrottleIntent, 5.0f);
18
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(dut.isInsideTpsCondition());
19
20 // Should return true when throttle is opened past the threshold
21
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::DriverThrottleIntent, 20.0f);
22
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(dut.isInsideTpsCondition());
23 2 }
24
25
26 4 TEST(LaunchControl, VSSCondition) {
27
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
28
29
1/1
✓ Branch 2 taken 1 time.
1 LaunchControlBase dut;
30
31 // Test Speed threshold
32 1 engineConfiguration->launchActivationMode = ALWAYS_ACTIVE_LAUNCH;
33 1 engineConfiguration->launchSpeedThreshold = 30;
34
35
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::VehicleSpeed, 10.0);
36
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(dut.isInsideSpeedCondition());
37
38
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::VehicleSpeed, 40.0);
39
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(dut.isInsideSpeedCondition());
40
41 2 }
42
43 4 TEST(LaunchControl, ZeroVSSCondition) {
44
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
45
46
1/1
✓ Branch 2 taken 1 time.
1 LaunchControlBase dut;
47
48 // Test Speed threshold
49 1 engineConfiguration->launchActivationMode = ALWAYS_ACTIVE_LAUNCH;
50 1 engineConfiguration->launchSpeedThreshold = 0;
51
52
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::VehicleSpeed, 10.0);
53
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(dut.isInsideSpeedCondition());
54 2 }
55
56 4 TEST(LaunchControl, VSSConditionWithSwitch) {
57
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
58
59
1/1
✓ Branch 2 taken 1 time.
1 LaunchControlBase dut;
60
61 // Test Speed threshold
62 1 engineConfiguration->launchActivationMode = SWITCH_INPUT_LAUNCH;
63 1 engineConfiguration->launchActivatePin = Gpio::G1;
64
1/1
✓ Branch 1 taken 1 time.
1 setMockState(engineConfiguration->launchActivatePin, true);
65 1 engineConfiguration->launchSpeedThreshold = 30;
66
67
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::VehicleSpeed, 10.0);
68
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(dut.isInsideSpeedCondition());
69
70
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::VehicleSpeed, 40.0);
71
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(dut.isInsideSpeedCondition());
72 2 }
73
74 4 TEST(LaunchControl, RPMCondition) {
75
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
76
77
1/1
✓ Branch 2 taken 1 time.
1 LaunchControlBase dut;
78
79 1 engineConfiguration->launchRpm = 3000;
80
81
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(engineConfiguration->launchRpmWindow, 500);
82
83
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(dut.calculateRPMLaunchCondition(2499), LaunchCondition::NotMet);
84
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(dut.calculateRPMLaunchCondition(2500), LaunchCondition::PreLaunch);
85
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(dut.calculateRPMLaunchCondition(2900), LaunchCondition::PreLaunch);
86
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(dut.calculateRPMLaunchCondition(2999), LaunchCondition::PreLaunch);
87
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(dut.calculateRPMLaunchCondition(3000), LaunchCondition::Launch);
88
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(dut.calculateRPMLaunchCondition(3100), LaunchCondition::Launch);
89 2 }
90
91 4 TEST(LaunchControl, SwitchInputCondition) {
92
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
93
94
1/1
✓ Branch 2 taken 1 time.
1 LaunchControlBase dut;
95
96 //activation based on VSS
97 1 engineConfiguration->launchActivationMode = ALWAYS_ACTIVE_LAUNCH;
98
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(dut.isInsideSwitchCondition());
99
100 //active by switch
101 1 engineConfiguration->launchActivationMode = SWITCH_INPUT_LAUNCH;
102 1 engineConfiguration->launchActivatePin = Gpio::G1;
103
1/1
✓ Branch 1 taken 1 time.
1 setMockState(engineConfiguration->launchActivatePin, true);
104
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(dut.isInsideSwitchCondition());
105
106
1/1
✓ Branch 1 taken 1 time.
1 setMockState(engineConfiguration->launchActivatePin, false);
107
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(dut.isInsideSwitchCondition());
108
109 //by clutch
110 1 engineConfiguration->launchActivationMode = CLUTCH_INPUT_LAUNCH;
111 1 engineConfiguration->clutchDownPin = Gpio::G2;
112 1 engineConfiguration->clutchDownPinMode = PI_PULLUP;
113
1/1
✓ Branch 1 taken 1 time.
1 setMockState(engineConfiguration->clutchDownPin, true);
114
1/1
✓ Branch 1 taken 1 time.
1 engine->updateSwitchInputs();
115
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(dut.isInsideSwitchCondition());
116
117
1/1
✓ Branch 1 taken 1 time.
1 setMockState(engineConfiguration->clutchDownPin, false);
118
1/1
✓ Branch 1 taken 1 time.
1 engine->updateSwitchInputs();
119
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(dut.isInsideSwitchCondition());
120
121 1 engineConfiguration->clutchDownPinMode = PI_INVERTED_PULLDOWN;
122
1/1
✓ Branch 1 taken 1 time.
1 setMockState(engineConfiguration->clutchDownPin, false);
123
1/1
✓ Branch 1 taken 1 time.
1 engine->updateSwitchInputs();
124
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(dut.isInsideSwitchCondition());
125
126
1/1
✓ Branch 1 taken 1 time.
1 setMockState(engineConfiguration->clutchDownPin, true);
127
1/1
✓ Branch 1 taken 1 time.
1 engine->updateSwitchInputs();
128
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(dut.isInsideSwitchCondition());
129
130 2 }
131
132 4 TEST(LaunchControl, CombinedCondition) {
133
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
134
135
1/1
✓ Branch 2 taken 1 time.
1 LaunchControlBase dut;
136
137 //check VSS normal usage
138 1 engineConfiguration->launchActivationMode = ALWAYS_ACTIVE_LAUNCH;
139
140 1 engineConfiguration->launchRpm = 3000;
141 1 engineConfiguration->launchTpsThreshold = 10;
142 //valid TPS
143
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::DriverThrottleIntent, 20.0f);
144
145
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::VehicleSpeed, 10.0);
146
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 1200);
147
148
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(dut.calculateLaunchCondition(1200), LaunchCondition::NotMet);
149
150
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 3200);
151
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(dut.calculateLaunchCondition(3200), LaunchCondition::Launch);
152
153
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::VehicleSpeed, 40.0);
154
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(dut.calculateLaunchCondition(3200), LaunchCondition::NotMet);
155 2 }
156
157 1 static void setDefaultLaunchParameters() {
158 1 engineConfiguration->launchRpm = 4000; // Rpm to trigger Launch condition
159 // engineConfiguration->launchTimingRetard = 10; // retard in absolute degrees ATDC
160 1 engineConfiguration->launchRpmWindow = 500; // RPM window (Launch RPM - Window) for transitioning to full retard
161 1 engineConfiguration->launchSparkCutEnable = true;
162 1 engineConfiguration->launchFuelCutEnable = false;
163 1 engineConfiguration->launchSpeedThreshold = 10; //maximum speed allowed before disable launch
164 1 engineConfiguration->launchFuelAdderPercent = 10; // Extra fuel in % when launch are triggered
165 // engineConfiguration->launchBoostDuty = 70; // boost valve duty cycle at launch
166 // engineConfiguration->enableLaunchRetard = true;
167 1 engineConfiguration->launchSmoothRetard = true; //interpolates the advance linear from launchrpm to fully retarded at launchtimingrpmrange
168 1 }
169
170 4 TEST(LaunchControl, CompleteRun) {
171
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
172
173 //load default config
174 1 setDefaultLaunchParameters();
175
176 //check VSS normal usage
177 1 engineConfiguration->launchActivationMode = ALWAYS_ACTIVE_LAUNCH;
178 1 engineConfiguration->launchSpeedThreshold = 30;
179
180 1 engineConfiguration->launchRpm = 3000;
181 1 engineConfiguration->launchTpsThreshold = 10;
182 1 engineConfiguration->launchControlEnabled = true;
183 //valid TPS
184
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::DriverThrottleIntent, 20.0f);
185
186
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::VehicleSpeed, 10.0);
187
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 1200);
188
189
1/1
✓ Branch 1 taken 1 time.
1 engine->launchController.update();
190
191
192 //check if we have some sort of cut? we should not have at this point
193
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->launchController.isLaunchSparkRpmRetardCondition());
194
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->launchController.isLaunchFuelRpmRetardCondition());
195
196
197
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 3510);
198 //update condition check
199
1/1
✓ Branch 1 taken 1 time.
1 engine->launchController.update();
200
201
202
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardAndInvokeEventsSec(3);
203
1/1
✓ Branch 1 taken 1 time.
1 engine->launchController.update();
204
205
206
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->launchController.isLaunchSparkRpmRetardCondition());
207
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->launchController.isLaunchFuelRpmRetardCondition());
208
209
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::VehicleSpeed, 40.0);
210
1/1
✓ Branch 1 taken 1 time.
1 engine->launchController.update();
211
212
213
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->launchController.isLaunchSparkRpmRetardCondition());
214
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->launchController.isLaunchFuelRpmRetardCondition());
215
216 2 }
217
218 4 TEST(LaunchControl, hardSkip) {
219
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
220
221
1/1
✓ Branch 2 taken 1 time.
1 SoftSparkLimiter hardSparkLimiter(true);
222
3/9
✓ 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.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_FALSE(hardSparkLimiter.shouldSkip());
223
224
225
1/1
✓ Branch 1 taken 1 time.
1 hardSparkLimiter.updateTargetSkipRatio(1.0f, 0.0f);
226 // open question if we need special handling of '1' or random would just work?
227
3/9
✓ 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.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_TRUE(hardSparkLimiter.shouldSkip());
228
229 1 int counter = 0;
230
1/1
✓ Branch 1 taken 1 time.
1 hardSparkLimiter.updateTargetSkipRatio(0.5f, 0.0f);
231
2/2
✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 1000 times.
✓ Decision 'false' taken 1 time.
1001 for (int i =0;i<1000;i++) {
232
3/3
✓ Branch 1 taken 1000 times.
✓ Branch 3 taken 524 times.
✓ Branch 4 taken 476 times.
2/2
✓ Decision 'true' taken 524 times.
✓ Decision 'false' taken 476 times.
1000 if (hardSparkLimiter.shouldSkip()) {
233 524 counter++;
234 }
235
236 }
237
4/14
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✓ Branch 40 taken 1 time.
✗ Branch 41 not taken.
1 ASSERT_TRUE(counter > 400 && counter < 600) << "How good is random " << counter;
238 1 }
239
240
241
242
243
244
245
246
247
248
249
250
251