GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/ignition_injection/test_injector_model.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 98.9% 259 0 262
Functions: 95.7% 67 0 70
Branches: 60.4% 344 0 570
Decisions: 100.0% 2 - 2

Line Branch Decision Exec Source
1 #include "pch.h"
2 #include "injector_model.h"
3
4 using ::testing::_;
5 using ::testing::StrictMock;
6
7 class MockInjectorModel : public InjectorModelBase {
8 public:
9 8 MOCK_METHOD(floatms_t, getDeadtime, (), (const, override));
10 8 MOCK_METHOD(float, getBaseFlowRate, (), (const, override));
11 8 MOCK_METHOD(float, getInjectorFlowRatio, (), (override));
12 MOCK_METHOD(void, updateState, (), (override));
13 MOCK_METHOD(expected<float>, getFuelDifferentialPressure, (), (const, override));
14 MOCK_METHOD(expected<float>, getFuelPressure, (), (const, override));
15 2 MOCK_METHOD(float, getSmallPulseFlowRate, (), (const, override));
16 2 MOCK_METHOD(float, getSmallPulseBreakPoint, (), (const, override));
17 33 MOCK_METHOD(InjectorNonlinearMode, getNonlinearMode, (), (const, override));
18 };
19
20 4 TEST(InjectorModel, Prepare) {
21
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockInjectorModel> dut;
22
23
3/3
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
1 EXPECT_CALL(dut, getDeadtime());
24
3/3
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
1 EXPECT_CALL(dut, getBaseFlowRate());
25
3/3
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
1 EXPECT_CALL(dut, getNonlinearMode());
26
3/3
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
1 EXPECT_CALL(dut, getInjectorFlowRatio());
27
28
1/1
✓ Branch 1 taken 1 time.
1 dut.prepare();
29 2 }
30
31 4 TEST(InjectorModel, getInjectionDuration) {
32
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockInjectorModel> dut;
33
34
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(dut, getDeadtime())
35
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillOnce(Return(2.0f));
36
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(dut, getInjectorFlowRatio())
37
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillOnce(Return(1.0f));
38
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(dut, getBaseFlowRate())
39
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillOnce(Return(4.8f)); // 400cc/min
40
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(dut, getNonlinearMode())
41
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillRepeatedly(Return(INJ_None));
42
43
1/1
✓ Branch 1 taken 1 time.
1 dut.prepare();
44
45
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(dut.getInjectionDuration(0.01f), 10 / 4.8f + 2.0f, EPS4D);
46
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(dut.getInjectionDuration(0.02f), 20 / 4.8f + 2.0f, EPS4D);
47 2 }
48
49 4 TEST(InjectorModel, getInjectionDurationWithFlowRatio) {
50
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockInjectorModel> dut;
51
52
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(dut, getDeadtime())
53
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillOnce(Return(2.0f));
54
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(dut, getInjectorFlowRatio())
55
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillOnce(Return(1.1f));
56
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(dut, getBaseFlowRate())
57
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillOnce(Return(4.8f)); // 400cc/min
58
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(dut, getNonlinearMode())
59
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillRepeatedly(Return(INJ_None));
60
61
1/1
✓ Branch 1 taken 1 time.
1 dut.prepare();
62
63
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(dut.getInjectionDuration(0.01f), 10 / (4.8f * 1.1f) + 2.0f, EPS4D);
64
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(dut.getInjectionDuration(0.02f), 20 / (4.8f * 1.1f) + 2.0f, EPS4D);
65 2 }
66
67 4 TEST(InjectorModel, getInjectionDurationWithHPFPManualCompensation) {
68 #if (VBAT_INJECTOR_CURVE_PRESSURE_SIZE == 2) && (VBAT_INJECTOR_CURVE_SIZE == 8)
69
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
70
1/1
✓ Branch 2 taken 1 time.
1 InjectorModelPrimary dut;
71 static const auto HPFPMockedMassCompensation = 2;
72
73 1 setTable(config->hpfpFuelMassCompensation, HPFPMockedMassCompensation);
74 1 engineConfiguration->injectorCompensationMode = ICM_HPFP_Manual_Compensation;
75
76
1/1
✓ Branch 1 taken 1 time.
1 dut.prepare();
77
78
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(dut.getInjectionDuration(0.01f), (10 * HPFPMockedMassCompensation) / (4.8f * 1.1 ) + 2.0f, EPS0D);
79
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(dut.getInjectionDuration(0.02f), (20 * HPFPMockedMassCompensation) / (4.8f * 1.1 ) + 2.0f, EPS0D);
80 #endif // (VBAT_INJECTOR_CURVE_PRESSURE_SIZE == 2) && (VBAT_INJECTOR_CURVE_SIZE == 8)
81 2 }
82
83 4 TEST(InjectorModel, nonLinearFordMode) {
84
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockInjectorModel> dut;
85
86
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(dut, getDeadtime())
87
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillOnce(Return(0));
88
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(dut, getInjectorFlowRatio())
89
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillOnce(Return(1.0f));
90
91 // 2005 F150 injectors
92
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(dut, getBaseFlowRate())
93
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillRepeatedly(Return(2.979f));
94
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(dut, getSmallPulseFlowRate())
95
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillRepeatedly(Return(3.562f));
96
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(dut, getSmallPulseBreakPoint())
97
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillRepeatedly(Return(0.00627f));
98
3/3
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 8 taken 1 time.
3 EXPECT_CALL(dut, getNonlinearMode())
99
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillRepeatedly(Return(INJ_FordModel));
100
101
1/1
✓ Branch 1 taken 1 time.
1 dut.prepare();
102
103
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(dut.getBaseDurationImpl(0.000f), 0.344f, 1e-3);
104
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(dut.getBaseDurationImpl(0.001f), 0.625f, 1e-3);
105
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(dut.getBaseDurationImpl(0.002f), 0.906f, 1e-3);
106
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(dut.getBaseDurationImpl(0.003f), 1.187f, 1e-3);
107
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(dut.getBaseDurationImpl(0.004f), 1.467f, 1e-3);
108
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(dut.getBaseDurationImpl(0.005f), 1.748f, 1e-3);
109
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(dut.getBaseDurationImpl(0.006f), 2.029f, 1e-3);
110
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(dut.getBaseDurationImpl(0.007f), 2.350f, 1e-3);
111
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(dut.getBaseDurationImpl(0.008f), 2.685f, 1e-3);
112
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(dut.getBaseDurationImpl(0.009f), 3.021f, 1e-3);
113
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(dut.getBaseDurationImpl(0.010f), 3.357f, 1e-3);
114
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(dut.getBaseDurationImpl(0.011f), 3.693f, 1e-3);
115
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(dut.getBaseDurationImpl(0.012f), 4.028f, 1e-3);
116
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(dut.getBaseDurationImpl(0.013f), 4.364f, 1e-3);
117
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(dut.getBaseDurationImpl(0.014f), 4.700f, 1e-3);
118
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(dut.getBaseDurationImpl(0.015f), 5.035f, 1e-3);
119
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(dut.getBaseDurationImpl(0.016f), 5.371f, 1e-3);
120
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(dut.getBaseDurationImpl(0.017f), 5.707f, 1e-3);
121
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(dut.getBaseDurationImpl(0.018f), 6.042f, 1e-3);
122
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(dut.getBaseDurationImpl(0.019f), 6.378f, 1e-3);
123
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(dut.getBaseDurationImpl(0.020f), 6.714f, 1e-3);
124 2 }
125
126 4 TEST(InjectorModel, nonlinearPolynomial) {
127
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
128
1/1
✓ Branch 2 taken 1 time.
1 InjectorModelPrimary dut;
129
130 1 engineConfiguration->applyNonlinearBelowPulse = 10;
131
132
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 (int i = 0; i < 8; i++) {
133 8 engineConfiguration->injectorCorrectionPolynomial[i] = i + 1;
134 }
135
136 // expect return of the original value, plus polynomial f(x)
137
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(dut.correctInjectionPolynomial(-3), -3 + -13532, EPS4D);
138
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(dut.correctInjectionPolynomial(-2), -2 + -711, EPS4D);
139
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(dut.correctInjectionPolynomial(-1), -1 + -4, EPS4D);
140
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(dut.correctInjectionPolynomial(0), 0 + 1, EPS4D);
141
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(dut.correctInjectionPolynomial(1), 1 + 36, EPS4D);
142
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(dut.correctInjectionPolynomial(2), 2 + 1793, EPS4D);
143
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(dut.correctInjectionPolynomial(3), 3 + 24604, EPS4D);
144
145 // Check that the disable threshold works
146
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(dut.correctInjectionPolynomial(9.9f), 9.9f);
147
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.correctInjectionPolynomial(10.1f), 10.1f);
148 2 }
149
150
151 #if (VBAT_INJECTOR_CURVE_PRESSURE_SIZE == 2) && (VBAT_INJECTOR_CURVE_SIZE == 8)
152 4 TEST(InjectorModel, Deadtime) {
153
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
154
155 // Some test data in the injector correction table
156 static const float injectorLagPressureBins[VBAT_INJECTOR_CURVE_PRESSURE_SIZE] = { 300, 600 };
157 static const float injectorLagVbattBins[VBAT_INJECTOR_CURVE_SIZE] = { 6.0, 8.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0 };
158 static const float injectorLagCorrection[VBAT_INJECTOR_CURVE_PRESSURE_SIZE][VBAT_INJECTOR_CURVE_SIZE] = {
159 { 3.371, 1.974, 1.383, 1.194, 1.040, 0.914, 0.767, 0.726 },
160 { 3.371, 1.974, 1.383, 1.194, 1.040, 0.914, 0.767, 0.726 },
161 };
162
163 1 copyArray(engineConfiguration->injector.battLagCorrBattBins, injectorLagVbattBins);
164
1/1
✓ Branch 1 taken 1 time.
1 copyArray(engineConfiguration->injector.battLagCorrPressBins, injectorLagPressureBins);
165 1 copyTable(engineConfiguration->injector.battLagCorrTable, injectorLagCorrection);
166
167
1/1
✓ Branch 2 taken 1 time.
1 InjectorModelPrimary dut;
168 1 dut.pressureCorrectionReference = 300;
169
170
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::BatteryVoltage, 11);
171
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(dut.getDeadtime(), 1.18, EPS2D);
172
173
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::BatteryVoltage, 15);
174
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(dut.getDeadtime(), 0.72, EPS2D);
175 2 }
176 #endif //(VBAT_INJECTOR_CURVE_PRESSURE_SIZE == 2) && (VBAT_INJECTOR_CURVE_SIZE == 8)
177
178 struct TesterGetFlowRate : public InjectorModelPrimary {
179 MOCK_METHOD(float, getInjectorFlowRatio, (), (override));
180 };
181
182 struct TesterGetRailPressure : public InjectorModelPrimary {
183 12 MOCK_METHOD(expected<float>, getFuelDifferentialPressure, (), (const, override));
184 };
185
186 class FlowRateFixture : public ::testing::TestWithParam<float> {
187 };
188
189
3/6
gtest_InjectorModelFlowRateFixture_EvalGenerateName_(testing::TestParamInfo<float> const&):
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
gtest_InjectorModelFlowRateFixture_EvalGenerator_():
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
7 INSTANTIATE_TEST_SUITE_P(
190 InjectorModel,
191 FlowRateFixture,
192 ::testing::Values(0.1f, 0.5f, 1.0f, 2.0f, 10.0f)
193 );
194
195
6/8
✓ Branch 6 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 21 taken 1 time.
✓ Branch 25 taken 1 time.
✓ Branch 29 taken 1 time.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
17 TEST_P(FlowRateFixture, PressureRatio) {
196
1/1
✓ Branch 2 taken 5 times.
5 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
197
198
1/1
✓ Branch 1 taken 5 times.
5 float pressureRatio = GetParam();
199 // Flow ratio should be the sqrt of pressure ratio
200 5 float expectedFlowRatio = sqrtf(pressureRatio);
201
202
1/1
✓ Branch 2 taken 5 times.
5 StrictMock<TesterGetRailPressure> dut;
203
6/6
✓ Branch 2 taken 5 times.
✓ Branch 6 taken 5 times.
✓ Branch 10 taken 5 times.
✓ Branch 15 taken 5 times.
✓ Branch 18 taken 5 times.
✓ Branch 21 taken 5 times.
5 EXPECT_CALL(dut, getFuelDifferentialPressure()).WillOnce(Return(400 * pressureRatio));
204
205 // Use injector compensation
206 5 engineConfiguration->injectorCompensationMode = ICM_SensedRailPressure;
207
208 // Reference pressure is 400kPa
209 5 engineConfiguration->fuelReferencePressure = 400.0f;
210
211 // Should return the expected ratio
212
3/7
✓ Branch 2 taken 5 times.
✓ Branch 5 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 5 times.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
5 EXPECT_FLOAT_EQ(expectedFlowRatio, dut.getInjectorFlowRatio());
213 10 }
214
215 4 TEST(InjectorModel, NegativePressureDelta) {
216
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
217
218
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<TesterGetRailPressure> dut;
219
220 // Use injector compensation
221 1 engineConfiguration->injectorCompensationMode = ICM_SensedRailPressure;
222
223 // Reference pressure is 400kPa
224 1 engineConfiguration->fuelReferencePressure = 400.0f;
225
226
6/6
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
✓ Branch 15 taken 1 time.
✓ Branch 18 taken 1 time.
✓ Branch 21 taken 1 time.
1 EXPECT_CALL(dut, getFuelDifferentialPressure()).WillOnce(Return(-50));
227
228 // Flow ratio defaults to 1.0 in this case
229
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(1.0f, dut.getInjectorFlowRatio());
230 2 }
231
232 4 TEST(InjectorModel, VariableInjectorFlowModeNone) {
233
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
234
235
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<TesterGetRailPressure> dut;
236
237 1 engineConfiguration->injectorCompensationMode = ICM_None;
238
239 // This shoudn't call getFuelDifferentialPressure, it should just return 1.0
240
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(1, dut.getInjectorFlowRatio());
241 2 }
242
243 4 TEST(InjectorModel, HPFPManualCompensation) {
244
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
245
246
1/1
✓ Branch 2 taken 1 time.
1 InjectorModelPrimary dut;
247
248 // Use injector compensation
249 1 engineConfiguration->injectorCompensationMode = ICM_HPFP_Manual_Compensation;
250
251 // Reference pressure is 400kPa
252 1 engineConfiguration->fuelReferencePressure = 400.0f;
253
254 // Flow ratio defaults to 1.0 in this case
255
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(1.0f, dut.getInjectorFlowRatio());
256 2 }
257
258 4 TEST(InjectorModel, RailPressureFixed) {
259
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
260
261
1/1
✓ Branch 2 taken 1 time.
1 InjectorModelPrimary dut;
262
263 // Reference pressure is 350kpa
264 1 engineConfiguration->fuelReferencePressure = 350;
265 1 engineConfiguration->injectorCompensationMode = ICM_FixedRailPressure;
266
267 // MAP is 75kPa
268
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Map, 75);
269
270 // Baro is 100kpa
271
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::BarometricPressure, 100);
272
273 // Should be reference pressure + 1 atm - 75kpa -> 375kPa
274
3/7
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_FLOAT_EQ(375.0f, dut.getFuelDifferentialPressure().value_or(0));
275 2 }
276
277 4 TEST(InjectorModel, RailPressureSensedAbsolute) {
278
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
279
280
1/1
✓ Branch 2 taken 1 time.
1 InjectorModelPrimary dut;
281
282 // Reference pressure is 350kpa
283 1 engineConfiguration->injectorCompensationMode = ICM_SensedRailPressure;
284 1 engineConfiguration->fuelPressureSensorMode = FPM_Absolute;
285
286
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Map, 50);
287
288 // Should just return rail sensor value - MAP
289
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::FuelPressureInjector, 100);
290
3/7
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_FLOAT_EQ(100 - 50, dut.getFuelDifferentialPressure().value_or(-1));
291
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::FuelPressureInjector, 200);
292
3/7
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_FLOAT_EQ(200 - 50, dut.getFuelDifferentialPressure().value_or(-1));
293
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::FuelPressureInjector, 300);
294
3/7
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_FLOAT_EQ(300 - 50, dut.getFuelDifferentialPressure().value_or(-1));
295 2 }
296
297 4 TEST(InjectorModel, RailPressureSensedGauge) {
298
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
299
300
1/1
✓ Branch 2 taken 1 time.
1 InjectorModelPrimary dut;
301
302 // Reference pressure is 350kpa
303 1 engineConfiguration->injectorCompensationMode = ICM_SensedRailPressure;
304 1 engineConfiguration->fuelPressureSensorMode = FPM_Gauge;
305
306
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::BarometricPressure, 110);
307
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Map, 50);
308
309 // Should just return rail sensor value + baro - MAP
310
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::FuelPressureInjector, 100);
311
3/7
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_FLOAT_EQ(100 + 110 - 50, dut.getFuelDifferentialPressure().value_or(-1));
312
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::FuelPressureInjector, 200);
313
3/7
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_FLOAT_EQ(200 + 110 - 50, dut.getFuelDifferentialPressure().value_or(-1));
314
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::FuelPressureInjector, 300);
315
3/7
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_FLOAT_EQ(300 + 110 - 50, dut.getFuelDifferentialPressure().value_or(-1));
316 2 }
317
318 4 TEST(InjectorModel, RailPressureSensedDifferential) {
319
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
320
321
1/1
✓ Branch 2 taken 1 time.
1 InjectorModelPrimary dut;
322
323 // Reference pressure is 350kpa
324 1 engineConfiguration->injectorCompensationMode = ICM_SensedRailPressure;
325 1 engineConfiguration->fuelPressureSensorMode = FPM_Differential;
326
327 // Should just return rail sensor value
328
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::FuelPressureInjector, 100);
329
3/7
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_FLOAT_EQ(100, dut.getFuelDifferentialPressure().value_or(-1));
330
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::FuelPressureInjector, 200);
331
3/7
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_FLOAT_EQ(200, dut.getFuelDifferentialPressure().value_or(-1));
332
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::FuelPressureInjector, 300);
333
3/7
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_FLOAT_EQ(300, dut.getFuelDifferentialPressure().value_or(-1));
334 2 }
335
336 4 TEST(InjectorModel, FailedPressureSensor) {
337
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
338
339
1/1
✓ Branch 2 taken 1 time.
1 InjectorModelPrimary dut;
340
341 // Reference pressure is 350kpa
342 1 engineConfiguration->injectorCompensationMode = ICM_SensedRailPressure;
343
344 // Sensor is broken!
345 // We have to register a broken sensor because the fuel pressure comp system
346 // has different logic for missing sensor
347
1/1
✓ Branch 2 taken 1 time.
1 MockSensor ms(SensorType::FuelPressureInjector);
348
1/1
✓ Branch 1 taken 1 time.
1 ms.invalidate();
349
1/1
✓ Branch 1 taken 1 time.
1 ms.Register();
350
351
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(1.0f, dut.getInjectorFlowRatio());
352 2 }
353
354 4 TEST(InjectorModel, MissingPressureSensor) {
355
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
356
357
1/1
✓ Branch 2 taken 1 time.
1 InjectorModelPrimary dut;
358
359 // Reference pressure is 350kpa
360 1 engineConfiguration->injectorCompensationMode = ICM_SensedRailPressure;
361
362 // Sensor is missing!
363
1/1
✓ Branch 1 taken 1 time.
1 Sensor::resetMockValue(SensorType::FuelPressureInjector);
364
365
1/1
✓ Branch 1 taken 1 time.
1 int warningsBefore = eth.recentWarnings()->getCount();
366
1/1
✓ Branch 1 taken 1 time.
1 dut.getInjectorFlowRatio();
367
1/1
✓ Branch 1 taken 1 time.
1 int warningsAfter = eth.recentWarnings()->getCount();
368
3/8
✓ Branch 4 taken 1 time.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 13 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✓ Branch 28 taken 1 time.
✗ Branch 29 not taken.
1 ASSERT_EQ(1, warningsAfter - warningsBefore);
369
3/7
✓ Branch 2 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_EQ(ObdCode::OBD_Fuel_Pressure_Sensor_Missing, getRecentWarnings()->get(0).Code);
370
371 // Missing sensor should trigger a fatal as it's a misconfiguration
372 //EXPECT_FATAL_ERROR(dut.getInjectorFlowRatio());
373 1 }
374
375