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