blob: 0ee5a49042b8b6c782b15e11a858f446f68def73 [file] [log] [blame]
Brian Silverman55c62022018-09-03 19:13:44 -07001#include "motors/peripheral/uart_buffer.h"
2
3#include "gtest/gtest.h"
4
Stephan Pleinesf63bde82024-01-13 15:59:33 -08005namespace frc971::teensy::testing {
Brian Silverman55c62022018-09-03 19:13:44 -07006
7// Tests that using PushSpan with single characters works correctly.
8TEST(UartBufferTest, PushSpanSingle) {
9 UartBuffer<1024> buffer;
10 ASSERT_TRUE(buffer.empty());
11
12 {
13 ::std::array<char, 1> data{{1}};
14 ASSERT_EQ(1, buffer.PushSpan(data));
15 }
16 ASSERT_FALSE(buffer.empty());
17 ASSERT_EQ(1, buffer.PopSingle());
18 ASSERT_TRUE(buffer.empty());
19
20 {
21 ::std::array<char, 1> data{{2}};
22 ASSERT_EQ(1, buffer.PushSpan(data));
23 }
24 ASSERT_FALSE(buffer.empty());
25 ASSERT_EQ(2, buffer.PopSingle());
26 ASSERT_TRUE(buffer.empty());
27}
28
29// Tests that using PushSpan with multiple characters works correctly.
30TEST(UartBufferTest, PushSpanMultiple) {
31 UartBuffer<1024> buffer;
32 ASSERT_TRUE(buffer.empty());
33
34 {
35 ::std::array<char, 4> data{{1, 2, 4, 8}};
36 ASSERT_EQ(4, buffer.PushSpan(data));
37 }
38 ASSERT_FALSE(buffer.empty());
39 ASSERT_EQ(1, buffer.PopSingle());
40 ASSERT_FALSE(buffer.empty());
41 ASSERT_EQ(2, buffer.PopSingle());
42 ASSERT_FALSE(buffer.empty());
43 ASSERT_EQ(4, buffer.PopSingle());
44 ASSERT_FALSE(buffer.empty());
45 ASSERT_EQ(8, buffer.PopSingle());
46 ASSERT_TRUE(buffer.empty());
47}
48
49// Tests that using PushSpan works correctly when wrapping with a
50// multiple-character push.
51TEST(UartBufferTest, PushSpanWrapMultiple) {
52 UartBuffer<4> buffer;
53 ASSERT_TRUE(buffer.empty());
54
55 {
56 ::std::array<char, 2> data{{10, 20}};
57 ASSERT_EQ(2, buffer.PushSpan(data));
58 }
59 ASSERT_FALSE(buffer.empty());
60 ASSERT_EQ(10, buffer.PopSingle());
61 ASSERT_FALSE(buffer.empty());
62 ASSERT_EQ(20, buffer.PopSingle());
63 ASSERT_TRUE(buffer.empty());
64
65 {
66 ::std::array<char, 4> data{{1, 2, 4, 8}};
67 ASSERT_EQ(4, buffer.PushSpan(data));
68 }
69 ASSERT_FALSE(buffer.empty());
70 ASSERT_EQ(1, buffer.PopSingle());
71 ASSERT_FALSE(buffer.empty());
72 ASSERT_EQ(2, buffer.PopSingle());
73 ASSERT_FALSE(buffer.empty());
74 ASSERT_EQ(4, buffer.PopSingle());
75 ASSERT_FALSE(buffer.empty());
76 ASSERT_EQ(8, buffer.PopSingle());
77 ASSERT_TRUE(buffer.empty());
78}
79
80// Tests that using PushSpan works correctly when wrapping with a
81// single-character push.
82TEST(UartBufferTest, PushSpanWrapSingle) {
83 UartBuffer<3> buffer;
84 ASSERT_TRUE(buffer.empty());
85
86 {
87 ::std::array<char, 3> data{{10, 20, 30}};
88 ASSERT_EQ(3, buffer.PushSpan(data));
89 }
90 ASSERT_FALSE(buffer.empty());
91 ASSERT_EQ(10, buffer.PopSingle());
92 ASSERT_FALSE(buffer.empty());
93
94 {
95 ::std::array<char, 1> data{{1}};
96 ASSERT_EQ(1, buffer.PushSpan(data));
97 }
98
99 ASSERT_EQ(20, buffer.PopSingle());
100 ASSERT_FALSE(buffer.empty());
101 ASSERT_EQ(30, buffer.PopSingle());
102 ASSERT_FALSE(buffer.empty());
103 ASSERT_EQ(1, buffer.PopSingle());
104 ASSERT_TRUE(buffer.empty());
105}
106
107// Tests that using PushSpan works correctly when overflowing with a
108// multiple-character push, where none of it fits.
109TEST(UartBufferTest, PushSpanOverflowAllMultiple) {
110 UartBuffer<2> buffer;
111 ASSERT_TRUE(buffer.empty());
112
113 {
114 ::std::array<char, 2> data{{10, 20}};
115 ASSERT_EQ(2, buffer.PushSpan(data));
116 }
117
118 {
119 ::std::array<char, 4> data{{1, 2, 4, 8}};
120 ASSERT_EQ(0, buffer.PushSpan(data));
121 }
122
123 ASSERT_FALSE(buffer.empty());
124 ASSERT_EQ(10, buffer.PopSingle());
125 ASSERT_FALSE(buffer.empty());
126 ASSERT_EQ(20, buffer.PopSingle());
127 ASSERT_TRUE(buffer.empty());
128}
129
130// Tests that using PushSpan works correctly when overflowing with a
131// multiple-character push, where some of it fits.
132TEST(UartBufferTest, PushSpanOverflowSomeMultiple) {
133 UartBuffer<4> buffer;
134 ASSERT_TRUE(buffer.empty());
135
136 {
137 ::std::array<char, 2> data{{10, 20}};
138 ASSERT_EQ(2, buffer.PushSpan(data));
139 }
140 ASSERT_FALSE(buffer.empty());
141
142 {
143 ::std::array<char, 4> data{{1, 2, 4, 8}};
144 ASSERT_EQ(2, buffer.PushSpan(data));
145 }
146
147 ASSERT_EQ(10, buffer.PopSingle());
148 ASSERT_FALSE(buffer.empty());
149 ASSERT_EQ(20, buffer.PopSingle());
150 ASSERT_FALSE(buffer.empty());
151 ASSERT_EQ(1, buffer.PopSingle());
152 ASSERT_FALSE(buffer.empty());
153 ASSERT_EQ(2, buffer.PopSingle());
154 ASSERT_TRUE(buffer.empty());
155}
156
157// Tests that using PushSpan works correctly when overflowing with a
158// single-character push.
159TEST(UartBufferTest, PushSpanOverflowSingle) {
160 UartBuffer<3> buffer;
161 ASSERT_TRUE(buffer.empty());
162
163 {
164 ::std::array<char, 3> data{{10, 20, 30}};
165 ASSERT_EQ(3, buffer.PushSpan(data));
166 }
167 ASSERT_FALSE(buffer.empty());
168
169 {
170 ::std::array<char, 1> data{{1}};
171 ASSERT_EQ(0, buffer.PushSpan(data));
172 }
173
174 ASSERT_EQ(10, buffer.PopSingle());
175 ASSERT_FALSE(buffer.empty());
176 ASSERT_EQ(20, buffer.PopSingle());
177 ASSERT_FALSE(buffer.empty());
178 ASSERT_EQ(30, buffer.PopSingle());
179 ASSERT_TRUE(buffer.empty());
180}
181
Brian Silverman4f958792019-02-16 18:20:04 -0800182// Tests that using PopSpan with single characters works correctly.
183TEST(UartBufferTest, PopSpanSingle) {
184 UartBuffer<3> buffer;
185 ASSERT_FALSE(buffer.full());
186 buffer.PushSingle(1);
187 ASSERT_FALSE(buffer.full());
188 buffer.PushSingle(2);
189 ASSERT_FALSE(buffer.full());
190
191 {
192 const auto result = buffer.PopSpan(1);
193 ASSERT_EQ(1u, result.size());
194 EXPECT_EQ(1u, result[0]);
195 }
196
197 ASSERT_FALSE(buffer.full());
198 buffer.PushSingle(3);
199 ASSERT_FALSE(buffer.full());
200 buffer.PushSingle(4);
201 ASSERT_TRUE(buffer.full());
202
203 {
204 const auto result = buffer.PopSpan(1);
205 ASSERT_EQ(1u, result.size());
206 EXPECT_EQ(2u, result[0]);
207 }
208
209 {
210 const auto result = buffer.PopSpan(1);
211 ASSERT_EQ(1u, result.size());
212 EXPECT_EQ(3u, result[0]);
213 }
214
215 {
216 const auto result = buffer.PopSpan(1);
217 ASSERT_EQ(1u, result.size());
218 EXPECT_EQ(4u, result[0]);
219 }
220}
221
222// Tests that using PopSpan with multiple characters works correctly.
223TEST(UartBufferTest, PopSpanMultiple) {
224 UartBuffer<1024> buffer;
225 for (int i = 0; i < 10; ++i) {
226 buffer.PushSingle(i);
227 }
228 ASSERT_TRUE(buffer.PopSpan(0).empty());
229 {
230 const auto result = buffer.PopSpan(5);
231 ASSERT_EQ(5u, result.size());
232 for (int i = 0; i < 5; ++i) {
Philipp Schrader790cb542023-07-05 21:06:52 -0700233 EXPECT_EQ(static_cast<char>(i), result[i]);
Brian Silverman4f958792019-02-16 18:20:04 -0800234 }
235 }
236 {
237 const auto result = buffer.PopSpan(10);
238 ASSERT_EQ(5u, result.size());
239 for (int i = 0; i < 5; ++i) {
Philipp Schrader790cb542023-07-05 21:06:52 -0700240 EXPECT_EQ(static_cast<char>(i + 5), result[i]);
Brian Silverman4f958792019-02-16 18:20:04 -0800241 }
242 }
243 ASSERT_TRUE(buffer.PopSpan(5).empty());
244 ASSERT_TRUE(buffer.PopSpan(3000).empty());
245 ASSERT_TRUE(buffer.PopSpan(0).empty());
246}
247
248// Tests that using PopSpan with multiple characters works correctly when
249// wrapping.
250TEST(UartBufferTest, PopSpanWrapMultiple) {
251 UartBuffer<10> buffer;
252 for (int i = 0; i < 10; ++i) {
253 buffer.PushSingle(i);
254 }
255 ASSERT_TRUE(buffer.PopSpan(0).empty());
256 {
257 const auto result = buffer.PopSpan(5);
258 ASSERT_EQ(5u, result.size());
259 for (int i = 0; i < 5; ++i) {
Philipp Schrader790cb542023-07-05 21:06:52 -0700260 EXPECT_EQ(static_cast<char>(i), result[i]);
Brian Silverman4f958792019-02-16 18:20:04 -0800261 }
262 }
263 for (int i = 0; i < 5; ++i) {
264 buffer.PushSingle(20 + i);
265 }
266 {
267 const auto result = buffer.PopSpan(10);
268 ASSERT_EQ(5u, result.size());
269 for (int i = 0; i < 5; ++i) {
Philipp Schrader790cb542023-07-05 21:06:52 -0700270 EXPECT_EQ(static_cast<char>(i + 5), result[i]);
Brian Silverman4f958792019-02-16 18:20:04 -0800271 }
272 }
273 {
274 const auto result = buffer.PopSpan(10);
275 ASSERT_EQ(5u, result.size());
276 for (int i = 0; i < 5; ++i) {
Philipp Schrader790cb542023-07-05 21:06:52 -0700277 EXPECT_EQ(static_cast<char>(i + 20), result[i]);
Brian Silverman4f958792019-02-16 18:20:04 -0800278 }
279 }
280}
281
Stephan Pleinesf63bde82024-01-13 15:59:33 -0800282} // namespace frc971::teensy::testing