GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/test_accel_enrichment.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 94 0 94
Functions: 100.0% 13 0 13
Branches: 59.1% 133 0 225
Decisions: 100.0% 8 - 8

Line Branch Decision Exec Source
1 /**
2 * @file test_accel_enrichment.cpp
3 *
4 * See also test_fuel_wall_wetting.cpp
5 *
6 * @date Apr 29, 2014
7 * Author: Dmitry Sidin
8 * @author Andrey Belomutskiy, (c) 2012-2020
9 */
10
11 #include "pch.h"
12
13 #include "accel_enrichment.h"
14
15 4 TEST(fuel, testTpsAccelEnrichmentMath) {
16
1/1
✓ Branch 1 taken 1 time.
1 printf("====================================================================================== testAccelEnrichment\r\n");
17
18
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
19
20
1/1
✓ Branch 1 taken 1 time.
1 engine->rpmCalculator.setRpmValue(600);
21
1/1
✓ Branch 1 taken 1 time.
1 engine->periodicFastCallback();
22
23
2/2
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
1 engine->module<TpsAccelEnrichment>()->setLength(4);
24
25
2/2
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
1 engine->module<TpsAccelEnrichment>()->onNewValue(0);
26
5/11
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✓ Branch 38 taken 1 time.
✗ Branch 39 not taken.
1 ASSERT_EQ( 0, engine->module<TpsAccelEnrichment>()->getMaxDelta()) << "maxDelta";
27
2/2
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
1 engine->module<TpsAccelEnrichment>()->onNewValue(10);
28
5/11
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✓ Branch 38 taken 1 time.
✗ Branch 39 not taken.
1 ASSERT_EQ( 10, engine->module<TpsAccelEnrichment>()->getMaxDelta()) << "maxDelta#1";
29
2/2
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
1 engine->module<TpsAccelEnrichment>()->onNewValue(30);
30
5/11
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✓ Branch 38 taken 1 time.
✗ Branch 39 not taken.
1 ASSERT_EQ( 20, engine->module<TpsAccelEnrichment>()->getMaxDelta()) << "maxDelta#2";
31
32
2/2
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
1 engine->module<TpsAccelEnrichment>()->onNewValue(0);
33
5/11
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✓ Branch 38 taken 1 time.
✗ Branch 39 not taken.
1 ASSERT_EQ( 20, engine->module<TpsAccelEnrichment>()->getMaxDelta()) << "maxDelta#3";
34
2/2
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
1 engine->module<TpsAccelEnrichment>()->onNewValue(0);
35
5/11
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✓ Branch 38 taken 1 time.
✗ Branch 39 not taken.
1 ASSERT_EQ( 20, engine->module<TpsAccelEnrichment>()->getMaxDelta()) << "maxDelta#4";
36
2/2
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
1 engine->module<TpsAccelEnrichment>()->onNewValue(0);
37
5/11
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✓ Branch 38 taken 1 time.
✗ Branch 39 not taken.
1 ASSERT_EQ( 0, engine->module<TpsAccelEnrichment>()->getMaxDelta()) << "maxDelta#5";
38
2/2
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
1 engine->module<TpsAccelEnrichment>()->onNewValue(0);
39
5/11
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✓ Branch 38 taken 1 time.
✗ Branch 39 not taken.
1 ASSERT_EQ( 0, engine->module<TpsAccelEnrichment>()->getMaxDelta()) << "maxDelta";
40 1 }
41
42 4 TEST(fuel, testTpsAccelEnrichmentScheduling) {
43
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
44
45
1/1
✓ Branch 1 taken 1 time.
1 setCrankOperationMode();
46
47 1 engineConfiguration->tpsAccelEnrichmentThreshold = 5;
48 1 engineConfiguration->tpsAccelLookback = 2;
49
50
1/1
✓ Branch 1 taken 1 time.
1 eth.setTriggerType(trigger_type_e::TT_HALF_MOON);
51
52
53
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 0);
54
1/1
✓ Branch 1 taken 1 time.
1 engine->periodicSlowCallback();
55
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 7);
56
1/1
✓ Branch 1 taken 1 time.
1 engine->periodicSlowCallback();
57
58
1/1
✓ Branch 1 taken 1 time.
1 eth.fireTriggerEvents2(/* count */ 4, 25 /* ms */);
59
4/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 1 time.
✗ Branch 35 not taken.
1 ASSERT_EQ( 1200, Sensor::getOrZero(SensorType::Rpm)) << "RPM";
60 1 int expectedInvocationCounter = 1;
61
4/9
✓ Branch 2 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.
✓ Branch 28 taken 1 time.
✗ Branch 29 not taken.
1 ASSERT_EQ(expectedInvocationCounter, engine->module<TpsAccelEnrichment>()->onUpdateInvocationCounter);
62
63
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 70);
64
1/1
✓ Branch 1 taken 1 time.
1 eth.fireTriggerEvents2(/* count */ 1, 25 /* ms */);
65
66 1 float expectedAEValue = 7;
67 // it does not matter how many times we invoke 'getTpsEnrichment' - state does not change
68
2/2
✓ Branch 0 taken 20 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 20 times.
✓ Decision 'false' taken 1 time.
21 for (int i = 0; i < 20; i++) {
69
5/10
✓ Branch 2 taken 20 times.
✓ Branch 6 taken 20 times.
✓ Branch 9 taken 20 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 20 times.
✗ Branch 32 not taken.
20 ASSERT_NEAR(expectedAEValue, engine->module<TpsAccelEnrichment>()->getTpsEnrichment(), EPS4D);
70 }
71
72 1 expectedInvocationCounter++;
73
4/9
✓ Branch 2 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.
✓ Branch 28 taken 1 time.
✗ Branch 29 not taken.
1 ASSERT_EQ(expectedInvocationCounter, engine->module<TpsAccelEnrichment>()->onUpdateInvocationCounter);
74
75
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
76
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
77
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
78
79
4/9
✓ Branch 2 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.
✓ Branch 28 taken 1 time.
✗ Branch 29 not taken.
1 ASSERT_EQ(expectedInvocationCounter, engine->module<TpsAccelEnrichment>()->onUpdateInvocationCounter);
80 1 }
81
82 4 static void doFractionalTpsIteration(int period, int divisor, int numCycles, std::vector<floatms_t> &tpsEnrich) {
83 // every cycle
84 4 engineConfiguration->tpsAccelFractionPeriod = period;
85 // split into 2 portions
86 4 engineConfiguration->tpsAccelFractionDivisor = divisor;
87
88 4 engine->module<TpsAccelEnrichment>()->resetAE();
89 4 engine->module<TpsAccelEnrichment>()->onNewValue(0);
90
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 4 times.
2/2
✓ Decision 'true' taken 16 times.
✓ Decision 'false' taken 4 times.
20 for (int i = 0; i < numCycles; i++) {
91 16 engine->module<TpsAccelEnrichment>()->onNewValue(10);
92 16 engine->module<TpsAccelEnrichment>()->onEngineCycleTps();
93 16 tpsEnrich[i] = engine->module<TpsAccelEnrichment>()->getTpsEnrichment();
94 }
95 4 }
96
97 4 TEST(fuel, testAccelEnrichmentFractionalTps) {
98
1/1
✓ Branch 1 taken 1 time.
1 printf("====================================================================================== testAccelEnrichmentFractionalTps\r\n");
99
100
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
101
102 // setup
103 1 engineConfiguration->tpsAccelEnrichmentThreshold = 5;
104 1 engineConfiguration->tpsAccelLookback = 2;
105
106 // fill tps2tps map (todo: there should be a better way?)
107 static const float tpsTpsConst = 1.0f;
108
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 loadIndex = 0; loadIndex < TPS_TPS_ACCEL_TABLE; loadIndex++) {
109
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 8 times.
2/2
✓ Decision 'true' taken 64 times.
✓ Decision 'false' taken 8 times.
72 for (int rpmIndex = 0; rpmIndex < TPS_TPS_ACCEL_TABLE; rpmIndex++) {
110 64 config->tpsTpsAccelTable[loadIndex][rpmIndex] = tpsTpsConst;
111 }
112 }
113
114
1/1
✓ Branch 1 taken 1 time.
1 initAccelEnrichment();
115
116
1/1
✓ Branch 1 taken 1 time.
1 engine->rpmCalculator.setRpmValue(600);
117
1/1
✓ Branch 1 taken 1 time.
1 engine->periodicFastCallback();
118
119
2/2
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
1 engine->module<TpsAccelEnrichment>()->setLength(2);
120
121
122 1 const int numCycles = 4;
123
1/1
✓ Branch 3 taken 1 time.
3 std::vector<floatms_t> tpsEnrich(numCycles);
124
125 // first, test the default behavior without fractional division
126
1/1
✓ Branch 1 taken 1 time.
1 doFractionalTpsIteration(1, 1, numCycles, tpsEnrich);
127 // the portion for the first cycle is full-enriched and there's no enrichment for next cycles
128
4/9
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 14 taken 1 time.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 time.
✗ Branch 27 not taken.
✗ Branch 30 not taken.
✗ Branch 35 not taken.
✗ Branch 38 not taken.
1 EXPECT_THAT(tpsEnrich, testing::ElementsAre(1.0f, 0.0f, 0.0f, 0.0f)) << "fractionalTps#1";
129
130 // divide into 2 each cycle
131
1/1
✓ Branch 1 taken 1 time.
1 doFractionalTpsIteration(1, 2, numCycles, tpsEnrich);
132 // we have half-portion for the first cycle, then 1/4-th and 1/8th and so on...
133
4/9
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 14 taken 1 time.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 time.
✗ Branch 27 not taken.
✗ Branch 30 not taken.
✗ Branch 35 not taken.
✗ Branch 38 not taken.
1 EXPECT_THAT(tpsEnrich, testing::ElementsAre(0.5f, 0.25f, 0.125f, 0.0625f)) << "fractionalTps#2";
134
135 // split every portion into 3 sub-portions (so the whole enrichment takes longer)
136
1/1
✓ Branch 1 taken 1 time.
1 doFractionalTpsIteration(3, 1, numCycles, tpsEnrich);
137 // we have 1/3rd-portion for the first three cycles
138 1 const float th = (1.0f / 3.0f);
139
7/12
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 17 taken 1 time.
✓ Branch 20 taken 1 time.
✓ Branch 23 taken 1 time.
✗ Branch 32 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 36 not taken.
✗ Branch 39 not taken.
✗ Branch 44 not taken.
✗ Branch 47 not taken.
1 EXPECT_THAT(tpsEnrich, testing::ElementsAre(testing::FloatEq(th), testing::FloatEq(th), testing::FloatEq(th), 0.0f)) << "fractionalTps#3";
140
141 // split every divided portion into 2 sub-portions (so the whole enrichment takes longer)
142
1/1
✓ Branch 1 taken 1 time.
1 doFractionalTpsIteration(2, 2, numCycles, tpsEnrich);
143 // we have half-portion for the first two cycles, and 1/4-th portion for the next 2 cycles, and so on...
144
4/9
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 14 taken 1 time.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 time.
✗ Branch 27 not taken.
✗ Branch 30 not taken.
✗ Branch 35 not taken.
✗ Branch 38 not taken.
1 EXPECT_THAT(tpsEnrich, testing::ElementsAre(0.25f, 0.25f, 0.125f, 0.125f)) << "fractionalTps#4";
145
146 2 }
147
148 4 TEST(fuel, testTpsAccelEnrichment) {
149
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
150 1 engineConfiguration->accelEnrichmentMode = AE_MODE_PREDICTIVE_MAP;
151 // should return 0 if we are using predictive map
152
4/8
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
1 EXPECT_EQ(0, engine->module<TpsAccelEnrichment>()->getTpsEnrichment());
153 2 }
154