3-phase PV router
Loading...
Searching...
No Matches
test_main.cpp
Go to the documentation of this file.
1
8
9#include <Arduino.h>
10#include <unity.h>
11
12#include "FastDivision.h"
13#include "FastDivision.cpp" // Include implementation for linking
14
15void setUp(void)
16{
17}
18
19void tearDown(void)
20{
21}
22
23// ============================================================================
24// Tests for divu10 (AVR assembly implementation)
25// ============================================================================
26
28{
29 TEST_ASSERT_EQUAL(0, divu10(0)); // 0 / 10 = 0
30 TEST_ASSERT_EQUAL(1, divu10(10)); // 10 / 10 = 1
31 TEST_ASSERT_EQUAL(2, divu10(20)); // 20 / 10 = 2
32 TEST_ASSERT_EQUAL(10, divu10(100)); // 100 / 10 = 10
33}
34
36{
37 TEST_ASSERT_EQUAL(0, divu10(1)); // 1 / 10 = 0
38 TEST_ASSERT_EQUAL(0, divu10(9)); // 9 / 10 = 0
39 TEST_ASSERT_EQUAL(1, divu10(11)); // 11 / 10 = 1
40 TEST_ASSERT_EQUAL(1, divu10(19)); // 19 / 10 = 1
41}
42
44{
45 TEST_ASSERT_EQUAL(100, divu10(1000)); // 1000 / 10 = 100
46 TEST_ASSERT_EQUAL(1000, divu10(10000)); // 10000 / 10 = 1000
47 TEST_ASSERT_EQUAL(6553, divu10(65535)); // max uint16_t / 10 = 6553
48}
49
51{
52 TEST_ASSERT_EQUAL(25, divu10(250)); // 250 / 10 = 25
53 TEST_ASSERT_EQUAL(123, divu10(1234)); // 1234 / 10 = 123
54 TEST_ASSERT_EQUAL(42, divu10(425)); // 425 / 10 = 42
55 TEST_ASSERT_EQUAL(99, divu10(999)); // 999 / 10 = 99
56}
57
58// ============================================================================
59// Tests for divmod10 (AVR assembly implementation)
60// ============================================================================
61
63{
64 uint32_t div;
65 uint8_t mod;
66
67 divmod10(0, div, mod);
68 TEST_ASSERT_EQUAL(0, div);
69 TEST_ASSERT_EQUAL(0, mod);
70
71 divmod10(10, div, mod);
72 TEST_ASSERT_EQUAL(1, div);
73 TEST_ASSERT_EQUAL(0, mod);
74
75 divmod10(100, div, mod);
76 TEST_ASSERT_EQUAL(10, div);
77 TEST_ASSERT_EQUAL(0, mod);
78}
79
81{
82 uint32_t div;
83 uint8_t mod;
84
85 divmod10(1, div, mod);
86 TEST_ASSERT_EQUAL(0, div);
87 TEST_ASSERT_EQUAL(1, mod);
88
89 divmod10(9, div, mod);
90 TEST_ASSERT_EQUAL(0, div);
91 TEST_ASSERT_EQUAL(9, mod);
92
93 divmod10(15, div, mod);
94 TEST_ASSERT_EQUAL(1, div);
95 TEST_ASSERT_EQUAL(5, mod);
96
97 divmod10(99, div, mod);
98 TEST_ASSERT_EQUAL(9, div);
99 TEST_ASSERT_EQUAL(9, mod);
100}
101
103{
104 uint32_t div;
105 uint8_t mod;
106
107 divmod10(12345, div, mod);
108 TEST_ASSERT_EQUAL(1234, div);
109 TEST_ASSERT_EQUAL(5, mod);
110
111 divmod10(1000000, div, mod);
112 TEST_ASSERT_EQUAL(100000, div);
113 TEST_ASSERT_EQUAL(0, mod);
114}
115
116// ============================================================================
117// Tests for constexpr shift-based divisions
118// ============================================================================
119
120void test_divu8(void)
121{
122 TEST_ASSERT_EQUAL(0, divu8(0)); // 0 / 8 = 0
123 TEST_ASSERT_EQUAL(0, divu8(7)); // 7 / 8 = 0
124 TEST_ASSERT_EQUAL(1, divu8(8)); // 8 / 8 = 1
125 TEST_ASSERT_EQUAL(1, divu8(15)); // 15 / 8 = 1
126 TEST_ASSERT_EQUAL(2, divu8(16)); // 16 / 8 = 2
127 TEST_ASSERT_EQUAL(125, divu8(1000)); // 1000 / 8 = 125
128 TEST_ASSERT_EQUAL(8191, divu8(65535)); // 65535 / 8 = 8191
129}
130
131void test_divu4(void)
132{
133 TEST_ASSERT_EQUAL(0, divu4(0)); // 0 / 4 = 0
134 TEST_ASSERT_EQUAL(0, divu4(3)); // 3 / 4 = 0
135 TEST_ASSERT_EQUAL(1, divu4(4)); // 4 / 4 = 1
136 TEST_ASSERT_EQUAL(1, divu4(7)); // 7 / 4 = 1
137 TEST_ASSERT_EQUAL(2, divu4(8)); // 8 / 4 = 2
138 TEST_ASSERT_EQUAL(250, divu4(1000)); // 1000 / 4 = 250
139 TEST_ASSERT_EQUAL(16383, divu4(65535)); // 65535 / 4 = 16383
140}
141
142void test_divu2(void)
143{
144 TEST_ASSERT_EQUAL(0, divu2(0)); // 0 / 2 = 0
145 TEST_ASSERT_EQUAL(0, divu2(1)); // 1 / 2 = 0
146 TEST_ASSERT_EQUAL(1, divu2(2)); // 2 / 2 = 1
147 TEST_ASSERT_EQUAL(1, divu2(3)); // 3 / 2 = 1
148 TEST_ASSERT_EQUAL(500, divu2(1000)); // 1000 / 2 = 500
149 TEST_ASSERT_EQUAL(32767, divu2(65535)); // 65535 / 2 = 32767
150}
151
152void test_divu1(void)
153{
154 TEST_ASSERT_EQUAL(0, divu1(0));
155 TEST_ASSERT_EQUAL(1, divu1(1));
156 TEST_ASSERT_EQUAL(1000, divu1(1000));
157 TEST_ASSERT_EQUAL(65535, divu1(65535));
158}
159
160// ============================================================================
161// Main
162// ============================================================================
163
164void setup()
165{
166 delay(1000);
167 UNITY_BEGIN();
168}
169
170void loop()
171{
172 // divu10 tests
173 RUN_TEST(test_divu10_basic);
174 RUN_TEST(test_divu10_edge_cases);
175 RUN_TEST(test_divu10_large_values);
177
178 // divmod10 tests
179 RUN_TEST(test_divmod10_basic);
182
183 // Shift-based division tests
184 RUN_TEST(test_divu8);
185 RUN_TEST(test_divu4);
186 RUN_TEST(test_divu2);
187 RUN_TEST(test_divu1);
188
189 UNITY_END();
190}
void divmod10(uint32_t in, uint32_t &div, uint8_t &mod)
uint16_t divu10(uint16_t n)
constexpr auto divu1(uint16_t n)
constexpr auto divu8(uint16_t n)
Definition FastDivision.h:9
constexpr auto divu2(uint16_t n)
constexpr auto divu4(uint16_t n)
void test_divmod10_with_remainder(void)
Definition test_main.cpp:80
void test_divu10_basic(void)
Definition test_main.cpp:27
void test_divu1(void)
void test_divu4(void)
void setup()
void test_divmod10_basic(void)
Definition test_main.cpp:62
void test_divmod10_large_values(void)
void test_divu8(void)
void setUp(void)
Definition test_main.cpp:15
void tearDown(void)
Definition test_main.cpp:19
void test_divu10_large_values(void)
Definition test_main.cpp:43
void test_divu10_random_values(void)
Definition test_main.cpp:50
void test_divu10_edge_cases(void)
Definition test_main.cpp:35
void test_divu2(void)
void loop()