GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/test_pwm_generator.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 85 0 85
Functions: 100.0% 6 0 6
Branches: 47.2% 120 0 254
Decisions: -% 0 - 0

Line Branch Decision Exec Source
1 /*
2 * test_pwm_generator.cpp
3 *
4 * @date Dec 8, 2018
5 * @author Andrey Belomutskiy, (c) 2012-2020
6 */
7
8 #include "pch.h"
9
10 #define LOW_VALUE 0
11 #define HIGH_VALUE 1
12 static int expectedTimeOfNextEvent;
13
14 14 static void assertNextEvent(const char *msg, int expectedPinState, TestExecutor *executor, OutputPin& pin) {
15 14 printf("PWM_test: Asserting event [%s]\r\n", msg);
16 // only one action expected in queue
17
4/10
✓ Branch 3 taken 14 times.
✓ Branch 7 taken 14 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 14 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 14 times.
✗ Branch 35 not taken.
14 ASSERT_EQ( 1, executor->size()) << "PWM_test: schedulingQueue size";
18
19 // move time to next event timestamp
20 14 setTimeNowUs(expectedTimeOfNextEvent);
21
22 // execute pending actions and assert that only one action was executed
23
5/12
✓ Branch 3 taken 14 times.
✓ Branch 6 taken 14 times.
✓ Branch 10 taken 14 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 14 times.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✓ Branch 40 taken 14 times.
✗ Branch 41 not taken.
14 ASSERT_EQ(1, executor->executeAll(getTimeNowUs())) << msg << " executed";
24
3/10
✓ Branch 2 taken 14 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 14 times.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 30 taken 14 times.
✗ Branch 31 not taken.
14 ASSERT_EQ(expectedPinState, pin.currentLogicValue) << msg << " pin state";
25
26 // assert that we have one new action in queue
27
4/10
✓ Branch 3 taken 14 times.
✓ Branch 7 taken 14 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 14 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 14 times.
✗ Branch 35 not taken.
14 ASSERT_EQ(1, executor->size()) << "PWM_test: queue.size";
28 }
29
30 1 static void test100dutyCycle() {
31
1/1
✓ Branch 1 taken 1 time.
1 printf("*************************************** test100dutyCycle\r\n");
32
33 1 expectedTimeOfNextEvent = 0;
34
1/1
✓ Branch 1 taken 1 time.
1 setTimeNowUs(0);
35
36 1 OutputPin pin;
37
1/1
✓ Branch 2 taken 1 time.
1 SimplePwm pwm("test PWM1");
38
1/1
✓ Branch 2 taken 1 time.
1 TestExecutor executor;
39
40
1/1
✓ Branch 1 taken 1 time.
1 startSimplePwm(&pwm, "unit_test",
41 &executor,
42 &pin,
43 1000 /* frequency */,
44 1.0 /* duty cycle */);
45
46 1 expectedTimeOfNextEvent += 1000;
47
4/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "1@1000/100";
48
49
1/1
✓ Branch 1 taken 1 time.
1 assertNextEvent("exec@100", HIGH_VALUE, &executor, pin);
50
51 1 expectedTimeOfNextEvent += 1000;
52
1/1
✓ Branch 1 taken 1 time.
1 assertNextEvent("exec2@100", HIGH_VALUE, &executor, pin);
53
54 1 expectedTimeOfNextEvent += 1000;
55
1/1
✓ Branch 1 taken 1 time.
1 assertNextEvent("exec3@100", HIGH_VALUE, &executor, pin);
56 1 }
57
58 1 static void testSwitchToNanPeriod() {
59
1/1
✓ Branch 1 taken 1 time.
1 printf("*************************************** testSwitchToNanPeriod\r\n");
60
61 1 expectedTimeOfNextEvent = 0;
62
1/1
✓ Branch 1 taken 1 time.
1 setTimeNowUs(0);
63
64 1 OutputPin pin;
65
1/1
✓ Branch 2 taken 1 time.
1 SimplePwm pwm("test PWM1");
66
1/1
✓ Branch 2 taken 1 time.
1 TestExecutor executor;
67
68
1/1
✓ Branch 1 taken 1 time.
1 startSimplePwm(&pwm, "unit_test",
69 &executor,
70 &pin,
71 1000 /* frequency */,
72 0.60 /* duty cycle */);
73
74 1 expectedTimeOfNextEvent += 600;
75
4/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "1@1000/70";
76
77
1/1
✓ Branch 1 taken 1 time.
1 assertNextEvent("exec@70", LOW_VALUE, &executor, pin);
78
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(600, getTimeNowUs()) << "time1";
79
80 1 expectedTimeOfNextEvent += 400;
81
1/1
✓ Branch 1 taken 1 time.
1 assertNextEvent("exec2@70", HIGH_VALUE, &executor, pin);
82
83
1/1
✓ Branch 1 taken 1 time.
1 pwm.setFrequency(NAN);
84
85 1 expectedTimeOfNextEvent += 600;
86
4/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "1@1000/NAN";
87
1/1
✓ Branch 1 taken 1 time.
1 assertNextEvent("exec2@NAN", LOW_VALUE, &executor, pin);
88
89 1 expectedTimeOfNextEvent += MS2US(NAN_FREQUENCY_SLEEP_PERIOD_MS);
90
4/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "2@1000/NAN";
91
1/1
✓ Branch 1 taken 1 time.
1 assertNextEvent("exec3@NAN", LOW_VALUE, &executor, pin);
92 1 }
93
94 4 TEST(PWM, testPwmGenerator) {
95
1/1
✓ Branch 1 taken 1 time.
1 test100dutyCycle();
96
1/1
✓ Branch 1 taken 1 time.
1 testSwitchToNanPeriod();
97
98 1 expectedTimeOfNextEvent = 0;
99
1/1
✓ Branch 1 taken 1 time.
1 setTimeNowUs(0);
100
101 1 OutputPin pin;
102
1/1
✓ Branch 2 taken 1 time.
1 SimplePwm pwm("test PWM3");
103
1/1
✓ Branch 2 taken 1 time.
1 TestExecutor executor;
104
105
1/1
✓ Branch 1 taken 1 time.
1 startSimplePwm(&pwm,
106 "unit_test",
107 &executor,
108 &pin,
109 1000 /* frequency */,
110 0.80 /* duty cycle */);
111
112 1 expectedTimeOfNextEvent += 800;
113
4/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "1@1000/80";
114
115
1/1
✓ Branch 1 taken 1 time.
1 assertNextEvent("exec@0", LOW_VALUE, &executor, pin);
116
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(800, getTimeNowUs()) << "time1";
117
118 1 expectedTimeOfNextEvent += 200;
119
4/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "2@1000/80";
120
121 // above we had vanilla duty cycle, now let's handle a special case
122
1/1
✓ Branch 1 taken 1 time.
1 pwm.setSimplePwmDutyCycle(0);
123
4/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "2@1000/0";
124
125
1/1
✓ Branch 1 taken 1 time.
1 assertNextEvent("exec@1", LOW_VALUE, &executor, pin);
126
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(1000, getTimeNowUs()) << "time2";
127
128 1 expectedTimeOfNextEvent += 1000;
129
4/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "3@1000/0";
130
131
1/1
✓ Branch 1 taken 1 time.
1 assertNextEvent("exec@2", LOW_VALUE /* pin value */, &executor, pin);
132
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(2000, getTimeNowUs()) << "time3";
133 1 expectedTimeOfNextEvent += 1000;
134
4/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "4@1000/0";
135
136
1/1
✓ Branch 1 taken 1 time.
1 assertNextEvent("exec@3", LOW_VALUE /* pin value */, &executor, pin);
137
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(3000, getTimeNowUs()) << "time4";
138 1 expectedTimeOfNextEvent += 1000;
139
4/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "5@1000/0";
140
141
1/1
✓ Branch 1 taken 1 time.
1 assertNextEvent("exec@4", LOW_VALUE /* pin value */, &executor, pin);
142 1 expectedTimeOfNextEvent += 1000;
143
4/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "6@1000/0";
144
145
1/1
✓ Branch 1 taken 1 time.
1 assertNextEvent("exec@5", LOW_VALUE /* pin value */, &executor, pin);
146 1 expectedTimeOfNextEvent += 1000;
147
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(5000, getTimeNowUs()) << "time4";
148
4/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "7@1000/0";
149
150
1/1
✓ Branch 1 taken 1 time.
1 assertNextEvent("exec@6", LOW_VALUE /* pin value */, &executor, pin);
151 1 }
152