GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/actuators/test_vvt.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 65 0 65
Functions: 100.0% 15 0 15
Branches: 58.6% 58 0 99
Decisions: -% 0 - 0

Line Branch Decision Exec Source
1 #include "pch.h"
2
3 #include "vvt.h"
4
5 using ::testing::StrictMock;
6 using ::testing::Return;
7
8 4 TEST(Vvt, TestSetPoint) {
9
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
10
11 // Set up a mock target map & pwm output
12
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockVp3d> targetMap;
13
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockPwm> pwm;
14
15
5/5
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 12 taken 1 time.
✓ Branch 16 taken 1 time.
3 EXPECT_CALL(targetMap, getValue(1500, 55))
16
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillRepeatedly(Return(20)); // one from onFastCallback() then getSetpoint()
17
4/4
✓ Branch 3 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
✓ Branch 14 taken 1 time.
1 EXPECT_CALL(pwm, setSimplePwmDutyCycle(0.730005));
18
19 // set up VVT config
20 1 engineConfiguration->vvtActivationDelayMs = 5;
21 1 engineConfiguration->vvtControlMinRpm = 500;
22
23 // mock RPM
24
1/1
✓ Branch 1 taken 1 time.
1 engine->rpmCalculator.setRpmValue(1500);
25
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(1500, Sensor::getOrZero(SensorType::Rpm));
26
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(engine->rpmCalculator.isRunning());
27
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(0.5e6);
28
29
1/1
✓ Branch 2 taken 1 time.
1 VvtController dut(0);
30
1/1
✓ Branch 1 taken 1 time.
1 dut.init(&targetMap, &pwm);
31
32 // Mock necessary inputs
33 1 engine->engineState.fuelingLoad = 55;
34
35 // update m_engineRunningLongEnough / m_isRpmHighEnough flags
36
1/1
✓ Branch 1 taken 1 time.
1 dut.onFastCallback();
37 // Test dut
38
3/7
✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_EQ(20, dut.getSetpoint().value_or(0));
39 1 }
40
41 4 TEST(Vvt, observePlant) {
42
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
43
44 1 engine->triggerCentral.vvtPosition[0][0] = 23;
45
46
1/1
✓ Branch 2 taken 1 time.
1 VvtController dut(0);
47
1/1
✓ Branch 1 taken 1 time.
1 dut.init(nullptr, nullptr);
48
49
3/7
✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_EQ(23, dut.observePlant().value_or(0));
50 2 }
51
52 4 TEST(Vvt, openLoop) {
53
1/1
✓ Branch 2 taken 1 time.
1 VvtController dut(0);
54
55 // No open loop for now
56
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.getOpenLoop(10), 0);
57 1 }
58
59 4 TEST(Vvt, ClosedLoopNotInverted) {
60
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
61
62
1/1
✓ Branch 2 taken 1 time.
1 VvtController dut(/* second cam on second bank*/3);
63 1 int camIndex = 1;
64
3/8
✓ Branch 4 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
1 ASSERT_EQ(dut.getCamIndex(), camIndex);
65
1/1
✓ Branch 1 taken 1 time.
1 dut.init(nullptr, nullptr);
66
67 1 engineConfiguration->auxPid[camIndex].pFactor = 1.5f;
68 1 engineConfiguration->auxPid[camIndex].iFactor = 0;
69 1 engineConfiguration->auxPid[camIndex].dFactor = 0;
70 1 engineConfiguration->auxPid[camIndex].offset = 0;
71
72 // Target of 30 with position 20 should yield positive duty, P=1.5 means 15% duty for 10% error
73
3/7
✓ Branch 5 taken 1 time.
✓ Branch 9 taken 1 time.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_EQ(dut.getClosedLoop(30, 20).value_or(0), 15);
74 1 }
75
76 4 TEST(Vvt, ClosedLoopInverted) {
77
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
78
79
1/1
✓ Branch 2 taken 1 time.
1 VvtController dut(/*first cam on second bank*/2);
80 1 int camIndex = 0;
81
3/8
✓ Branch 4 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
1 ASSERT_EQ(dut.getCamIndex(), camIndex);
82
1/1
✓ Branch 1 taken 1 time.
1 dut.init(nullptr, nullptr);
83
84 1 engineConfiguration->invertVvtControlIntake = true;
85 1 engineConfiguration->auxPid[camIndex].pFactor = 1.5f;
86 1 engineConfiguration->auxPid[camIndex].iFactor = 0;
87 1 engineConfiguration->auxPid[camIndex].dFactor = 0;
88 1 engineConfiguration->auxPid[camIndex].offset = 0;
89
90 // Target of -30 with position -20 should yield positive duty, P=1.5 means 15% duty for 10% error
91
3/7
✓ Branch 5 taken 1 time.
✓ Branch 9 taken 1 time.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_EQ(dut.getClosedLoop(-30, -20).value_or(0), 15);
92 1 }
93