blob: de5158f59a7460b3c5e338d961de6cee2b44b40d [file] [log] [blame]
#include "y2019/jevois/spi.h"
#include <stdint.h>
#include "gtest/gtest.h"
namespace frc971 {
namespace jevois {
namespace testing {
// Tests packing and then unpacking an empty message.
TEST(SpiToRoborioPackTest, Empty) {
TeensyToRoborio input_message;
const SpiTransfer transfer = SpiPackToRoborio(input_message);
const auto output_message = SpiUnpackToRoborio(transfer);
ASSERT_TRUE(output_message);
EXPECT_EQ(input_message, output_message.value());
}
// Tests that unpacking after the message has been modified results in a
// checksum failure.
TEST(SpiToRoborioPackTest, CorruptChecksum) {
TeensyToRoborio input_message;
{
SpiTransfer transfer = SpiPackToRoborio(input_message);
transfer[0]++;
ASSERT_FALSE(SpiUnpackToRoborio(transfer));
}
{
SpiTransfer transfer = SpiPackToRoborio(input_message);
transfer[0] ^= 0xFF;
ASSERT_FALSE(SpiUnpackToRoborio(transfer));
}
{
SpiTransfer transfer = SpiPackToRoborio(input_message);
transfer[transfer.size() - 1]++;
ASSERT_FALSE(SpiUnpackToRoborio(transfer));
}
input_message.frames.push_back({});
{
SpiTransfer transfer = SpiPackToRoborio(input_message);
transfer[0]++;
ASSERT_FALSE(SpiUnpackToRoborio(transfer));
}
{
SpiTransfer transfer = SpiPackToRoborio(input_message);
transfer[3]++;
ASSERT_FALSE(SpiUnpackToRoborio(transfer));
}
input_message.frames.back().targets.push_back({});
{
SpiTransfer transfer = SpiPackToRoborio(input_message);
transfer[3]++;
ASSERT_FALSE(SpiUnpackToRoborio(transfer));
}
}
// Tests packing and then unpacking a full message.
TEST(SpiToRoborioPackTest, Full) {
TeensyToRoborio input_message;
input_message.frames.push_back({});
input_message.frames.back().age = camera_duration(9);
input_message.frames.push_back({});
input_message.frames.back().age = camera_duration(7);
input_message.frames.push_back({});
input_message.frames.back().age = camera_duration(1);
const SpiTransfer transfer = SpiPackToRoborio(input_message);
const auto output_message = SpiUnpackToRoborio(transfer);
ASSERT_TRUE(output_message);
EXPECT_EQ(input_message, output_message.value());
}
// Tests that packing and unpacking a target results in values close to before.
TEST(SpiToRoborioPackTest, Target) {
TeensyToRoborio input_message;
input_message.frames.push_back({});
input_message.frames.back().targets.push_back({});
input_message.frames.back().targets.back().distance = 9;
input_message.frames.back().targets.back().height = 1;
input_message.frames.back().targets.back().heading = 0.5;
input_message.frames.back().targets.back().skew = -0.5;
input_message.frames.push_back({});
input_message.frames.back().targets.push_back({});
input_message.frames.back().targets.push_back({});
input_message.frames.push_back({});
input_message.frames.back().targets.push_back({});
input_message.frames.back().targets.push_back({});
input_message.frames.back().targets.push_back({});
const SpiTransfer transfer = SpiPackToRoborio(input_message);
const auto output_message = SpiUnpackToRoborio(transfer);
ASSERT_TRUE(output_message);
ASSERT_EQ(3u, output_message->frames.size());
ASSERT_EQ(1u, output_message->frames[0].targets.size());
ASSERT_EQ(2u, output_message->frames[1].targets.size());
ASSERT_EQ(3u, output_message->frames[2].targets.size());
EXPECT_NEAR(input_message.frames.back().targets.back().distance,
output_message->frames.back().targets.back().distance, 0.1);
EXPECT_NEAR(input_message.frames.back().targets.back().height,
output_message->frames.back().targets.back().height, 0.1);
EXPECT_NEAR(input_message.frames.back().targets.back().heading,
output_message->frames.back().targets.back().heading, 0.1);
EXPECT_NEAR(input_message.frames.back().targets.back().skew,
output_message->frames.back().targets.back().skew, 0.1);
}
} // namespace testing
} // namespace jevois
} // namespace frc971