blob: 280730988aa1e092be0cfaccb513d03bc6fd0e13 [file] [log] [blame]
James Kuszmaul590e33e2024-01-14 17:54:00 -08001#include "frc971/math/flatbuffers_matrix.h"
2
3#include "gtest/gtest.h"
4
5#include "aos/json_to_flatbuffer.h"
6
7namespace frc971::testing {
8
9class FlatbuffersMatrixTest : public ::testing::Test {
10 protected:
11 template <int Rows, int Cols,
12 fbs::StorageOrder StorageOrder = fbs::StorageOrder::ColMajor>
13 tl::expected<typename EigenMatrix<Rows, Cols, StorageOrder>::type,
14 ConversionFailure>
15 ToEigen(std::string_view json) {
16 return frc971::ToEigen<Rows, Cols, StorageOrder>(
17 aos::FlatbufferDetachedBuffer<fbs::Matrix>(
18 aos::JsonToFlatbuffer<fbs::Matrix>(json))
19 .message());
20 }
21};
22
23TEST_F(FlatbuffersMatrixTest, ReadWriteMatrix) {
24 const Eigen::Matrix<double, 3, 4> expected{
25 {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
26 aos::fbs::Builder<fbs::MatrixStatic> builder;
27 ASSERT_TRUE(FromEigen(expected, builder.get()));
28 EXPECT_EQ(
29 "{ \"rows\": 3, \"cols\": 4, \"storage_order\": \"ColMajor\", \"data\": "
30 "[ 0.0, 4.0, 8.0, 1.0, 5.0, 9.0, 2.0, 6.0, 10.0, 3.0, 7.0, 11.0 ] }",
31 aos::FlatbufferToJson(builder.AsFlatbufferSpan()));
32
33 const Eigen::Matrix<double, 3, 4> result =
34 ToEigenOrDie<3, 4>(builder->AsFlatbuffer());
35 EXPECT_EQ(expected, result);
36}
37
38TEST_F(FlatbuffersMatrixTest, ReadWriteMatrixRowMajor) {
39 const Eigen::Matrix<double, 3, 4, Eigen::StorageOptions::RowMajor> expected{
40 {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
41 aos::fbs::Builder<fbs::MatrixStatic> builder;
42 ASSERT_TRUE(FromEigen(expected, builder.get()));
43 EXPECT_EQ(
44 "{ \"rows\": 3, \"cols\": 4, \"storage_order\": \"RowMajor\", \"data\": "
45 "[ 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0 ] }",
46 aos::FlatbufferToJson(builder.AsFlatbufferSpan()));
47
48 const Eigen::Matrix<double, 3, 4, Eigen::StorageOptions::RowMajor> result =
49 ToEigenOrDie<3, 4, fbs::StorageOrder::RowMajor>(builder->AsFlatbuffer());
50 EXPECT_EQ(expected, result);
51}
52
53class FlatbuffersMatrixParamTest
54 : public FlatbuffersMatrixTest,
55 public ::testing::WithParamInterface<
56 std::tuple<std::string, ConversionFailure>> {};
57TEST_P(FlatbuffersMatrixParamTest, ConversionFailures) {
58 auto result = this->ToEigen<3, 4>(std::get<0>(GetParam()));
59 EXPECT_FALSE(result.has_value());
60 EXPECT_EQ(std::get<1>(GetParam()), result.error());
61}
62
63INSTANTIATE_TEST_SUITE_P(
64 ConversionFailureTests, FlatbuffersMatrixParamTest,
65 ::testing::Values(
66 std::make_tuple("{}", ConversionFailure{fbs::MatrixField::kRows,
67 fbs::FieldError::kMissing}),
68 std::make_tuple(R"json({"rows": 3})json",
69 ConversionFailure{fbs::MatrixField::kCols,
70 fbs::FieldError::kMissing}),
71 std::make_tuple(R"json({"rows": 3, "cols": 4})json",
72 ConversionFailure{fbs::MatrixField::kData,
73 fbs::FieldError::kMissing}),
74 std::make_tuple(
75 R"json({"rows": 1, "cols": 4, "data": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]})json",
76 ConversionFailure{fbs::MatrixField::kRows,
77 fbs::FieldError::kInconsistentWithTemplate}),
78 std::make_tuple(
79 R"json({"rows": 3, "cols": 7, "data": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]})json",
80 ConversionFailure{fbs::MatrixField::kCols,
81 fbs::FieldError::kInconsistentWithTemplate}),
82 std::make_tuple(R"json({"rows": 3, "cols": 4, "data": []})json",
83 ConversionFailure{
84 fbs::MatrixField::kData,
85 fbs::FieldError::kInconsistentWithTemplate}),
86 std::make_tuple(
87 R"json({"rows": 3, "cols": 4, "storage_order": "RowMajor", "data": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]})json",
88 ConversionFailure{fbs::MatrixField::kStorageOrder,
89 fbs::FieldError::kInconsistentWithTemplate})));
90} // namespace frc971::testing