GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/test_tcu.cpp
Date: 2025-11-16 14:52:24
Coverage Exec Excl Total
Lines: 100.0% 63 0 63
Functions: 100.0% 7 0 7
Branches: 56.5% 78 0 138
Decisions: 100.0% 2 - 2

Line Branch Decision Exec Source
1 /*
2 * @file test_tcu.cpp
3 *
4 * @date Oct 24, 2025
5 * @author David Holdeman, (c) 2025
6 */
7
8 #include "gear_controller.h"
9 #include "pch.h"
10
11 7 void blipGearControllerPin(EngineTestHelper* eth, brain_pin_e pin, int time) {
12 7 engine->gearController->update();
13 // Close switch/button
14 7 setMockState(pin, false);
15 7 engine->gearController->update();
16
17 // update gearController every ms
18
2/2
✓ Branch 0 taken 4802 times.
✓ Branch 1 taken 7 times.
2/2
✓ Decision 'true' taken 4802 times.
✓ Decision 'false' taken 7 times.
4809 for (int i = 0; i < time; i = i+1000) {
19 4802 eth->moveTimeForwardAndInvokeEventsUs(minI(time - i, 1000));
20 4802 engine->gearController->update();
21 }
22 // And release
23 7 setMockState(pin, true);
24 7 engine->gearController->update();
25 7 }
26
27 4 TEST(tcu, testButtonshift) {
28
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TCU_4R70W);
29 1 engineConfiguration->gearControllerMode = GearControllerMode::ButtonShift;
30
1/1
✓ Branch 1 taken 1 time.
1 initGearController();
31
32 // pinMode is PI_PULLUP, so true = off
33
1/1
✓ Branch 1 taken 1 time.
1 setMockState(engineConfiguration->tcuUpshiftButtonPin, true);
34
1/1
✓ Branch 1 taken 1 time.
1 setMockState(engineConfiguration->tcuDownshiftButtonPin, true);
35
36
3/8
✓ 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.
✓ Branch 26 taken 1 time.
✗ Branch 27 not taken.
1 ASSERT_NE(nullptr, engine->gearController);
37
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(NEUTRAL, engine->gearController->getDesiredGear());
38
39 // Press upshift button for 200ms
40
1/1
✓ Branch 1 taken 1 time.
1 blipGearControllerPin(&eth, engineConfiguration->tcuUpshiftButtonPin, 200000);
41
42 // and now a bounce
43
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardAndInvokeEventsUs(20);
44
1/1
✓ Branch 1 taken 1 time.
1 blipGearControllerPin(&eth, engineConfiguration->tcuUpshiftButtonPin, 20);
45
46
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(GEAR_1, engine->gearController->getDesiredGear());
47
48 // Wait 500ms
49
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardAndInvokeEventsUs(500000);
50 // Press upshift button for 200ms
51
1/1
✓ Branch 1 taken 1 time.
1 blipGearControllerPin(&eth, engineConfiguration->tcuUpshiftButtonPin, 200000);
52
53
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(GEAR_2, engine->gearController->getDesiredGear());
54
55 // Wait 500ms
56
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardAndInvokeEventsUs(500000);
57 // Press upshift button for 1ms
58
1/1
✓ Branch 1 taken 1 time.
1 blipGearControllerPin(&eth, engineConfiguration->tcuUpshiftButtonPin, 1000);
59
60
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(GEAR_3, engine->gearController->getDesiredGear());
61
62 // Wait 500ms
63
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardAndInvokeEventsUs(500000);
64 // Press upshift button for 3s
65
1/1
✓ Branch 1 taken 1 time.
1 blipGearControllerPin(&eth, engineConfiguration->tcuUpshiftButtonPin, 3000000);
66
67
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(GEAR_4, engine->gearController->getDesiredGear());
68
69 // Wait 10ms
70 // Because this is a different pin, the 500ms debounce timeout is not in play.
71
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardAndInvokeEventsUs(10000);
72 // Press downshift button for 200ms
73
1/1
✓ Branch 1 taken 1 time.
1 blipGearControllerPin(&eth, engineConfiguration->tcuDownshiftButtonPin, 200000);
74
75
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(GEAR_3, engine->gearController->getDesiredGear());
76
77 // Wait 10ms
78 // This shouldn't be long enough for the debounce to have reset,
79 // so the downshift won't trigger until ~490ms after pressing the button.
80
1/1
✓ Branch 1 taken 1 time.
1 eth.moveTimeForwardAndInvokeEventsUs(10000);
81 // Press downshift button for 1.2s
82
1/1
✓ Branch 1 taken 1 time.
1 blipGearControllerPin(&eth, engineConfiguration->tcuDownshiftButtonPin, 1200000);
83
84
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(GEAR_1, engine->gearController->getDesiredGear());
85 1 }
86
87 4 TEST(tcu, testGenericGC) {
88
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TCU_4R70W);
89 1 engineConfiguration->gearControllerMode = GearControllerMode::Generic;
90
1/1
✓ Branch 1 taken 1 time.
1 initGearController();
91
92 // Need to set some engine settings for airmass calc
93 1 engineConfiguration->cylindersCount = 8.0;
94
95 // pinMode is PI_PULLUP, so true = off
96
1/1
✓ Branch 1 taken 1 time.
1 setMockState(engineConfiguration->tcuUpshiftButtonPin, true);
97
1/1
✓ Branch 1 taken 1 time.
1 setMockState(engineConfiguration->tcuDownshiftButtonPin, true);
98
1/1
✓ Branch 1 taken 1 time.
1 setMockState(engineConfiguration->tcu_rangeInput[1], true);
99
1/1
✓ Branch 1 taken 1 time.
1 setMockState(engineConfiguration->tcu_rangeInput[2], true);
100
101
3/8
✓ 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.
✓ Branch 26 taken 1 time.
✗ Branch 27 not taken.
1 ASSERT_NE(nullptr, engine->gearController);
102
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(NEUTRAL, engine->gearController->getDesiredGear());
103
104
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::VehicleSpeed, 55);
105
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 2500);
106
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::DriverThrottleIntent, 15);
107
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Maf, 0.1f);
108
109
1/1
✓ Branch 1 taken 1 time.
1 engine->gearController->update();
110 // Make sure we stay in neutral with undefined range selector pins
111
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(NEUTRAL, engine->gearController->getDesiredGear());
112
113
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::RangeInput1, 2000);
114
1/1
✓ Branch 1 taken 1 time.
1 engine->gearController->update();
115
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(GEAR_2, engine->gearController->getDesiredGear());
116 1 }
117