blob: 5ab7c988c7efa1c952a40d08e3bef0df60b7533f [file] [log] [blame]
#include "motors/peripheral/uart_buffer.h"
#include "gtest/gtest.h"
namespace frc971 {
namespace teensy {
namespace 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());
}
} // namespace testing
} // namespace teensy
} // namespace frc971