GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/controllers/modules/map_averaging/test_map_averaging.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 102 0 102
Functions: 100.0% 18 0 18
Branches: 48.9% 88 0 180
Decisions: 100.0% 6 - 6

Line Branch Decision Exec Source
1 /*
2 * @file test_map_averaging.cpp
3 *
4 * @date: may 12, 2025
5 * @author FDSoftware
6 */
7
8 #include "pch.h"
9 #include "map_averaging.h"
10 #include "harley.h"
11
12 namespace {
13 auto const startAveragingAction{ action_s::make<startAveraging>((mapSampler*){}) };
14 }
15
16 4 TEST(EngineModules, MapAveragingModule_onEnginePhase) {
17
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_CRANK_ENGINE);
18 1 engineConfiguration->isMapAveragingEnabled = true;
19 1 engineConfiguration->measureMapOnlyInOneCylinder = true;
20 1 engine->engineState.mapAveragingDuration = 100;
21
1/1
✓ Branch 1 taken 1 time.
1 engine->rpmCalculator.setRpmValue(200);
22
23
3/3
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
1 engine->module<MapAveragingModule>()->onEnginePhase(200, getTimeNowNt(), 50.f, 180.f);
24
25 // check for startMapAveraging schedule at 50° on the future (since onEnginePhase was called 50° late [start angle is 100°])
26
1/1
✓ Branch 2 taken 1 time.
1 bool averageDone = eth.assertEventExistsAtEnginePhase("startMapAveraging callback", startAveragingAction, static_cast<angle_t>(50));
27
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(averageDone);
28
29 // move forward, we expect that the startAveraging is called and we are currently running the averaging code
30
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardMs(50);
31
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
32
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->outputChannels.isMapAveraging);
33
34 // move forward, here we expect the averaging is done and endAveraging was called
35
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardMs(50);
36
1/1
✓ Branch 1 taken 1 time.
1 eth.executeActions();
37
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->outputChannels.isMapAveraging);
38 2 }
39
40 4 TEST(EngineModules, MapAveragingModule_onFastCallback) {
41
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_CRANK_ENGINE);
42 1 engineConfiguration->isMapAveragingEnabled = true;
43
44 1 MapAveragingModule mapModule;
45
46 // trigger events at crank speed
47
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 9 times.
✓ Decision 'false' taken 1 time.
10 for (size_t i = 0; i < 9; i++) {
48
1/1
✓ Branch 1 taken 9 times.
9 eth.fireTriggerEventsWithDuration(200);
49
1/1
✓ Branch 1 taken 9 times.
9 eth.executeActions();
50 }
51
4/9
✓ 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.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
1 ASSERT_EQ(150, Sensor::getOrZero(SensorType::Rpm));
52
53
1/1
✓ Branch 1 taken 1 time.
1 mapModule.onFastCallback();
54
55 // we expect here than the map start angles correspond to the phase of the cylinder + 100 of samplingAngle
56
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->engineState.mapAveragingStart[0], 100);
57
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->engineState.mapAveragingStart[1], 640);
58
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->engineState.mapAveragingStart[2], 280);
59
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->engineState.mapAveragingStart[3], 460);
60
61
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->engineState.mapAveragingDuration, 50);
62 1 }
63
64 4 TEST(EngineModules, MapAveragingModule_onFastCallbackCustomSampleWindow) {
65
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_CRANK_ENGINE);
66 1 engineConfiguration->isMapAveragingEnabled = true;
67 1 setArrayValues(engineConfiguration->map.samplingAngle, 75);
68
69 1 MapAveragingModule mapModule;
70
71 // trigger events at crank speed
72
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 9 times.
✓ Decision 'false' taken 1 time.
10 for (size_t i = 0; i < 9; i++) {
73
1/1
✓ Branch 1 taken 9 times.
9 eth.fireTriggerEventsWithDuration(200);
74
1/1
✓ Branch 1 taken 9 times.
9 eth.executeActions();
75 }
76
4/9
✓ 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.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
1 ASSERT_EQ(150, Sensor::getOrZero(SensorType::Rpm));
77
78
1/1
✓ Branch 1 taken 1 time.
1 mapModule.onFastCallback();
79
80 // we expect here than the map start angles correspond to the phase of the cylinder + 75 of samplingAngle
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(engine->engineState.mapAveragingStart[0], 75); // 0 + 75
82
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->engineState.mapAveragingStart[1], 615); // 540 + 75
83
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->engineState.mapAveragingStart[2], 255); // 180 + 75
84
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->engineState.mapAveragingStart[3], 435); // 360 + 75
85
86
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->engineState.mapAveragingDuration, 50);
87 1 }
88
89 4 TEST(EngineModules, MapAveragingModule_onFastCallbackOddFire) {
90
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_CRANK_ENGINE);
91 1 engineConfiguration->isMapAveragingEnabled = true;
92 1 setArrayValues(engineConfiguration->map.samplingAngle, 75);
93
94
1/1
✓ Branch 1 taken 1 time.
1 setHarley();
95 1 engineConfiguration->timing_offset_cylinder[0] = -HARLEY_V_TWIN / 2;
96 1 engineConfiguration->timing_offset_cylinder[1] = +HARLEY_V_TWIN / 2;
97
98 1 MapAveragingModule mapModule;
99
100 // trigger events at crank speed
101
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 9 times.
✓ Decision 'false' taken 1 time.
10 for (size_t i = 0; i < 9; i++) {
102
1/1
✓ Branch 1 taken 9 times.
9 eth.fireTriggerEventsWithDuration(200);
103
1/1
✓ Branch 1 taken 9 times.
9 eth.executeActions();
104 }
105
4/9
✓ 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.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
1 ASSERT_EQ(150, Sensor::getOrZero(SensorType::Rpm));
106
107
1/1
✓ Branch 1 taken 1 time.
1 mapModule.onFastCallback();
108
109 // 0 from getAngleOffset + 75 custom sampling start - 22.5 from timing_offset_cylinder
110
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->engineState.mapAveragingStart[0], 52.5);
111 // 540 from getAngleOffset + 75 custom sampling start + 22.5 from timing_offset_cylinder
112
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->engineState.mapAveragingStart[1], 637.5);
113
114
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->engineState.mapAveragingDuration, 50);
115 1 }
116
117 4 TEST(EngineModules, MapAveragingModule_onEnginePhase60_2_one_cylinder) {
118
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_CRANK_ENGINE);
119 1 engineConfiguration->isMapAveragingEnabled = true;
120 1 testSpinEngineUntilData testSpinInfo = { 0, 0, 0 };
121 1 engineConfiguration->measureMapOnlyInOneCylinder = true;
122
1/1
✓ Branch 1 taken 1 time.
1 eth.setTriggerType(trigger_type_e::TT_TOOTHED_WHEEL_60_2);
123 1 MapAveragingModule mapModule;
124
1/1
✓ Branch 1 taken 1 time.
1 engine->rpmCalculator.setRpmValue(200);
125
126
3/3
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
1 engine->module<MapAveragingModule>()->onEnginePhase(200, getTimeNowNt(), 0.f, 180.f);
127
128 // we expect offset of enginePhase (0 since we call onEnginePhase directy) + 100° of samplingAngle (default setting)
129
1/1
✓ Branch 2 taken 1 time.
1 bool averageDone = eth.assertEventExistsAtEnginePhase("startMapAveraging callback", startAveragingAction, static_cast<angle_t>(100));
130
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(averageDone);
131 2 }
132
133 4 TEST(EngineModules, MapAveragingModule_onEnginePhase60_2_one_cylinderCustomSampleWindow) {
134
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_CRANK_ENGINE);
135 1 testSpinEngineUntilData testSpinInfo = { 0, 0, 0 };
136 1 engineConfiguration->isMapAveragingEnabled = true;
137 1 engineConfiguration->measureMapOnlyInOneCylinder = true;
138
1/1
✓ Branch 1 taken 1 time.
1 eth.setTriggerType(trigger_type_e::TT_TOOTHED_WHEEL_60_2);
139 1 MapAveragingModule mapModule;
140
1/1
✓ Branch 1 taken 1 time.
1 engine->rpmCalculator.setRpmValue(200);
141 1 setArrayValues(engineConfiguration->map.samplingAngle, 75);
142
143
2/2
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
1 engine->module<MapAveragingModule>()->onFastCallback();
144
3/3
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
1 engine->module<MapAveragingModule>()->onEnginePhase(200, getTimeNowNt(), 0.f, 180.f);
145
146 // we expect offset of enginePhase (0 since we call onEnginePhase directy) + 75° of samplingAngle
147
1/1
✓ Branch 2 taken 1 time.
1 bool averageDone = eth.assertEventExistsAtEnginePhase("startMapAveraging callback", startAveragingAction, static_cast<angle_t>(75));
148
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(averageDone);
149 2 }
150