blob: c6eb50f35913964d0afed35e320bb96ad50d7179 [file] [log] [blame]
#include "frc971/math/flatbuffers_matrix.h"
#include "gtest/gtest.h"
#include "aos/json_to_flatbuffer.h"
namespace frc971::testing {
class FlatbuffersMatrixTest : public ::testing::Test {
protected:
template <int Rows, int Cols,
fbs::StorageOrder StorageOrder = fbs::StorageOrder::ColMajor>
tl::expected<typename EigenMatrix<Rows, Cols, StorageOrder>::type,
ConversionFailure>
ToEigen(std::string_view json) {
return frc971::ToEigen<Rows, Cols, StorageOrder>(
aos::FlatbufferDetachedBuffer<fbs::Matrix>(
aos::JsonToFlatbuffer<fbs::Matrix>(json))
.message());
}
};
TEST_F(FlatbuffersMatrixTest, ReadWriteMatrix) {
const Eigen::Matrix<double, 3, 4> expected{
{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
aos::fbs::Builder<fbs::MatrixStatic> builder;
flatbuffers::FlatBufferBuilder fbb;
ASSERT_TRUE(FromEigen(expected, builder.get()));
fbb.Finish(FromEigen<3, 4>(expected, &fbb));
EXPECT_EQ(
"{ \"rows\": 3, \"cols\": 4, \"storage_order\": \"ColMajor\", \"data\": "
"[ 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11 ] }",
aos::FlatbufferToJson(builder.AsFlatbufferSpan()));
EXPECT_EQ(
"{ \"rows\": 3, \"cols\": 4, \"storage_order\": \"ColMajor\", \"data\": "
"[ 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11 ] }",
aos::FlatbufferToJson(
aos::FlatbufferDetachedBuffer<fbs::Matrix>(fbb.Release())));
const Eigen::Matrix<double, 3, 4> result =
ToEigenOrDie<3, 4>(builder->AsFlatbuffer());
EXPECT_EQ(expected, result);
}
TEST_F(FlatbuffersMatrixTest, ReadWriteMatrixRowMajor) {
const Eigen::Matrix<double, 3, 4, Eigen::StorageOptions::RowMajor> expected{
{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
aos::fbs::Builder<fbs::MatrixStatic> builder;
ASSERT_TRUE(FromEigen(expected, builder.get()));
EXPECT_EQ(
"{ \"rows\": 3, \"cols\": 4, \"storage_order\": \"RowMajor\", \"data\": "
"[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ] }",
aos::FlatbufferToJson(builder.AsFlatbufferSpan()));
const Eigen::Matrix<double, 3, 4, Eigen::StorageOptions::RowMajor> result =
ToEigenOrDie<3, 4, fbs::StorageOrder::RowMajor>(builder->AsFlatbuffer());
EXPECT_EQ(expected, result);
}
class FlatbuffersMatrixParamTest
: public FlatbuffersMatrixTest,
public ::testing::WithParamInterface<
std::tuple<std::string, ConversionFailure>> {};
TEST_P(FlatbuffersMatrixParamTest, ConversionFailures) {
auto result = this->ToEigen<3, 4>(std::get<0>(GetParam()));
EXPECT_FALSE(result.has_value());
EXPECT_EQ(std::get<1>(GetParam()), result.error());
}
INSTANTIATE_TEST_SUITE_P(
ConversionFailureTests, FlatbuffersMatrixParamTest,
::testing::Values(
std::make_tuple("{}", ConversionFailure{fbs::MatrixField::kRows,
fbs::FieldError::kMissing}),
std::make_tuple(R"json({"rows": 3})json",
ConversionFailure{fbs::MatrixField::kCols,
fbs::FieldError::kMissing}),
std::make_tuple(R"json({"rows": 3, "cols": 4})json",
ConversionFailure{fbs::MatrixField::kData,
fbs::FieldError::kMissing}),
std::make_tuple(
R"json({"rows": 1, "cols": 4, "data": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]})json",
ConversionFailure{fbs::MatrixField::kRows,
fbs::FieldError::kInconsistentWithTemplate}),
std::make_tuple(
R"json({"rows": 3, "cols": 7, "data": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]})json",
ConversionFailure{fbs::MatrixField::kCols,
fbs::FieldError::kInconsistentWithTemplate}),
std::make_tuple(R"json({"rows": 3, "cols": 4, "data": []})json",
ConversionFailure{
fbs::MatrixField::kData,
fbs::FieldError::kInconsistentWithTemplate}),
std::make_tuple(
R"json({"rows": 3, "cols": 4, "storage_order": "RowMajor", "data": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]})json",
ConversionFailure{fbs::MatrixField::kStorageOrder,
fbs::FieldError::kInconsistentWithTemplate})));
} // namespace frc971::testing