blob: 0ee5a49042b8b6c782b15e11a858f446f68def73 [file] [log] [blame]
#include "motors/peripheral/uart_buffer.h"
#include "gtest/gtest.h"
namespace frc971::teensy::testing {
// Tests that using PushSpan with single characters works correctly.
TEST(UartBufferTest, PushSpanSingle) {
UartBuffer<1024> buffer;
ASSERT_TRUE(buffer.empty());
{
::std::array<char, 1> data{{1}};
ASSERT_EQ(1, buffer.PushSpan(data));
}
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(1, buffer.PopSingle());
ASSERT_TRUE(buffer.empty());
{
::std::array<char, 1> data{{2}};
ASSERT_EQ(1, buffer.PushSpan(data));
}
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(2, buffer.PopSingle());
ASSERT_TRUE(buffer.empty());
}
// Tests that using PushSpan with multiple characters works correctly.
TEST(UartBufferTest, PushSpanMultiple) {
UartBuffer<1024> buffer;
ASSERT_TRUE(buffer.empty());
{
::std::array<char, 4> data{{1, 2, 4, 8}};
ASSERT_EQ(4, buffer.PushSpan(data));
}
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(1, buffer.PopSingle());
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(2, buffer.PopSingle());
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(4, buffer.PopSingle());
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(8, buffer.PopSingle());
ASSERT_TRUE(buffer.empty());
}
// Tests that using PushSpan works correctly when wrapping with a
// multiple-character push.
TEST(UartBufferTest, PushSpanWrapMultiple) {
UartBuffer<4> buffer;
ASSERT_TRUE(buffer.empty());
{
::std::array<char, 2> data{{10, 20}};
ASSERT_EQ(2, buffer.PushSpan(data));
}
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(10, buffer.PopSingle());
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(20, buffer.PopSingle());
ASSERT_TRUE(buffer.empty());
{
::std::array<char, 4> data{{1, 2, 4, 8}};
ASSERT_EQ(4, buffer.PushSpan(data));
}
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(1, buffer.PopSingle());
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(2, buffer.PopSingle());
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(4, buffer.PopSingle());
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(8, buffer.PopSingle());
ASSERT_TRUE(buffer.empty());
}
// Tests that using PushSpan works correctly when wrapping with a
// single-character push.
TEST(UartBufferTest, PushSpanWrapSingle) {
UartBuffer<3> buffer;
ASSERT_TRUE(buffer.empty());
{
::std::array<char, 3> data{{10, 20, 30}};
ASSERT_EQ(3, buffer.PushSpan(data));
}
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(10, buffer.PopSingle());
ASSERT_FALSE(buffer.empty());
{
::std::array<char, 1> data{{1}};
ASSERT_EQ(1, buffer.PushSpan(data));
}
ASSERT_EQ(20, buffer.PopSingle());
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(30, buffer.PopSingle());
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(1, buffer.PopSingle());
ASSERT_TRUE(buffer.empty());
}
// Tests that using PushSpan works correctly when overflowing with a
// multiple-character push, where none of it fits.
TEST(UartBufferTest, PushSpanOverflowAllMultiple) {
UartBuffer<2> buffer;
ASSERT_TRUE(buffer.empty());
{
::std::array<char, 2> data{{10, 20}};
ASSERT_EQ(2, buffer.PushSpan(data));
}
{
::std::array<char, 4> data{{1, 2, 4, 8}};
ASSERT_EQ(0, buffer.PushSpan(data));
}
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(10, buffer.PopSingle());
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(20, buffer.PopSingle());
ASSERT_TRUE(buffer.empty());
}
// Tests that using PushSpan works correctly when overflowing with a
// multiple-character push, where some of it fits.
TEST(UartBufferTest, PushSpanOverflowSomeMultiple) {
UartBuffer<4> buffer;
ASSERT_TRUE(buffer.empty());
{
::std::array<char, 2> data{{10, 20}};
ASSERT_EQ(2, buffer.PushSpan(data));
}
ASSERT_FALSE(buffer.empty());
{
::std::array<char, 4> data{{1, 2, 4, 8}};
ASSERT_EQ(2, buffer.PushSpan(data));
}
ASSERT_EQ(10, buffer.PopSingle());
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(20, buffer.PopSingle());
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(1, buffer.PopSingle());
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(2, buffer.PopSingle());
ASSERT_TRUE(buffer.empty());
}
// Tests that using PushSpan works correctly when overflowing with a
// single-character push.
TEST(UartBufferTest, PushSpanOverflowSingle) {
UartBuffer<3> buffer;
ASSERT_TRUE(buffer.empty());
{
::std::array<char, 3> data{{10, 20, 30}};
ASSERT_EQ(3, buffer.PushSpan(data));
}
ASSERT_FALSE(buffer.empty());
{
::std::array<char, 1> data{{1}};
ASSERT_EQ(0, buffer.PushSpan(data));
}
ASSERT_EQ(10, buffer.PopSingle());
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(20, buffer.PopSingle());
ASSERT_FALSE(buffer.empty());
ASSERT_EQ(30, buffer.PopSingle());
ASSERT_TRUE(buffer.empty());
}
// Tests that using PopSpan with single characters works correctly.
TEST(UartBufferTest, PopSpanSingle) {
UartBuffer<3> buffer;
ASSERT_FALSE(buffer.full());
buffer.PushSingle(1);
ASSERT_FALSE(buffer.full());
buffer.PushSingle(2);
ASSERT_FALSE(buffer.full());
{
const auto result = buffer.PopSpan(1);
ASSERT_EQ(1u, result.size());
EXPECT_EQ(1u, result[0]);
}
ASSERT_FALSE(buffer.full());
buffer.PushSingle(3);
ASSERT_FALSE(buffer.full());
buffer.PushSingle(4);
ASSERT_TRUE(buffer.full());
{
const auto result = buffer.PopSpan(1);
ASSERT_EQ(1u, result.size());
EXPECT_EQ(2u, result[0]);
}
{
const auto result = buffer.PopSpan(1);
ASSERT_EQ(1u, result.size());
EXPECT_EQ(3u, result[0]);
}
{
const auto result = buffer.PopSpan(1);
ASSERT_EQ(1u, result.size());
EXPECT_EQ(4u, result[0]);
}
}
// Tests that using PopSpan with multiple characters works correctly.
TEST(UartBufferTest, PopSpanMultiple) {
UartBuffer<1024> buffer;
for (int i = 0; i < 10; ++i) {
buffer.PushSingle(i);
}
ASSERT_TRUE(buffer.PopSpan(0).empty());
{
const auto result = buffer.PopSpan(5);
ASSERT_EQ(5u, result.size());
for (int i = 0; i < 5; ++i) {
EXPECT_EQ(static_cast<char>(i), result[i]);
}
}
{
const auto result = buffer.PopSpan(10);
ASSERT_EQ(5u, result.size());
for (int i = 0; i < 5; ++i) {
EXPECT_EQ(static_cast<char>(i + 5), result[i]);
}
}
ASSERT_TRUE(buffer.PopSpan(5).empty());
ASSERT_TRUE(buffer.PopSpan(3000).empty());
ASSERT_TRUE(buffer.PopSpan(0).empty());
}
// Tests that using PopSpan with multiple characters works correctly when
// wrapping.
TEST(UartBufferTest, PopSpanWrapMultiple) {
UartBuffer<10> buffer;
for (int i = 0; i < 10; ++i) {
buffer.PushSingle(i);
}
ASSERT_TRUE(buffer.PopSpan(0).empty());
{
const auto result = buffer.PopSpan(5);
ASSERT_EQ(5u, result.size());
for (int i = 0; i < 5; ++i) {
EXPECT_EQ(static_cast<char>(i), result[i]);
}
}
for (int i = 0; i < 5; ++i) {
buffer.PushSingle(20 + i);
}
{
const auto result = buffer.PopSpan(10);
ASSERT_EQ(5u, result.size());
for (int i = 0; i < 5; ++i) {
EXPECT_EQ(static_cast<char>(i + 5), result[i]);
}
}
{
const auto result = buffer.PopSpan(10);
ASSERT_EQ(5u, result.size());
for (int i = 0; i < 5; ++i) {
EXPECT_EQ(static_cast<char>(i + 20), result[i]);
}
}
}
} // namespace frc971::teensy::testing