23#include "absl/types/span.h"
24#include "gmock/gmock.h"
25#include "gtest/gtest.h"
32using ::Eigen::ColMajor;
33using ::Eigen::Dynamic;
34using ::Eigen::RowMajor;
35using ::testing::Matcher;
38TEST(FloatArrayNearTest, TypicalUse) {
39 std::vector<double> test_vector({0.998, -1.414, 3.142});
40 std::vector<double> reference_vector({1.0, -M_SQRT2, M_PI});
45template <
typename ContainerType>
46class FloatArrayNearContainerTypeTest :
public testing::Test {};
48using TestContainerTypes = testing::Types<std::vector<float>, std::deque<float>,
49 std::list<float>, Span<const float>>;
50TYPED_TEST_SUITE(FloatArrayNearContainerTypeTest, TestContainerTypes);
52TYPED_TEST(FloatArrayNearContainerTypeTest, MatchesApproximately) {
53 using ContainerType = TypeParam;
54 auto test_values = {0.505f, 1.0f, -0.992f, 1.995f};
55 ContainerType test_container(test_values);
56 auto reference_values = {0.5f, 1.0f, -1.0f, 2.0f};
57 ContainerType reference_container(reference_values);
59 const Matcher<ContainerType> m1 =
FloatArrayNear(reference_container, 1e-2);
60 EXPECT_TRUE(m1.Matches(test_container));
61 const Matcher<ContainerType> m2 =
FloatArrayNear(reference_container, 1e-3);
62 EXPECT_FALSE(m2.Matches(test_container));
65TYPED_TEST(FloatArrayNearContainerTypeTest, DoesNotMatchWrongSize) {
66 using ContainerType = TypeParam;
67 EXPECT_THAT(ContainerType({1.0f, 2.0f}),
71TYPED_TEST(FloatArrayNearContainerTypeTest, DoesNotMatchWrongOrder) {
72 using ContainerType = TypeParam;
73 EXPECT_THAT(ContainerType({1.0f, 3.0f, 2.0f}),
77TYPED_TEST(FloatArrayNearContainerTypeTest, DoesNotMatchNaNs) {
78 using ContainerType = TypeParam;
79 auto test_values = {1.0f, std::numeric_limits<float>::quiet_NaN()};
80 ContainerType test_container(test_values);
82 EXPECT_THAT(test_container,
87TEST(FloatArrayNearTest, WithIntegerElements) {
88 std::vector<int> test_vector({505, 1000, -992, 1990});
89 std::vector<int> reference_vector({500, 1000, -1000, 2000});
91 const Matcher<std::vector<int>> m1 =
FloatArrayNear(reference_vector, 10);
92 EXPECT_TRUE(m1.Matches(test_vector));
93 const Matcher<std::vector<int>> m2 =
FloatArrayNear(reference_vector, 1);
94 EXPECT_FALSE(m2.Matches(test_vector));
97TEST(FloatArrayEqTest, TypicalUse) {
98 std::vector<float> reference_vector({1e6, -M_SQRT2, M_PI});
100 std::vector<float> test_vector({1e6 + 0.25, -1.41421323, 3.14159262});
101 EXPECT_THAT(test_vector,
FloatArrayEq(reference_vector));
103 test_vector[0] = 1e6 + 0.3125;
107template <
typename ContainerType>
108class FloatArrayEqContainerTypeTest :
public testing::Test {};
110TYPED_TEST_SUITE(FloatArrayEqContainerTypeTest, TestContainerTypes);
112TYPED_TEST(FloatArrayEqContainerTypeTest, MatchesApproximately) {
113 using ContainerType = TypeParam;
114 auto reference_values = {-1e6f, 0.0f, 1.0f};
115 ContainerType reference_container(reference_values);
116 const Matcher<ContainerType> m =
FloatArrayEq(reference_container);
117 EXPECT_TRUE(m.Matches(reference_container));
118 EXPECT_TRUE(m.Matches(ContainerType({-1e6 + 0.25, 5e-45, 1.0000002})));
119 EXPECT_TRUE(m.Matches(ContainerType({-1e6 - 0.25, -5e-45, 0.9999998})));
120 EXPECT_FALSE(m.Matches(ContainerType({-1e6 + 0.3125, 0.0, 1.0})));
121 EXPECT_FALSE(m.Matches(ContainerType({-1e6, 1e-44, 1.0})));
122 EXPECT_FALSE(m.Matches(ContainerType({-1e6, 0.0, 1.0000006})));
125TYPED_TEST(FloatArrayEqContainerTypeTest, DoesNotMatchWrongSize) {
126 using ContainerType = TypeParam;
127 EXPECT_THAT(ContainerType({1.0f, 2.0f}),
131TYPED_TEST(FloatArrayEqContainerTypeTest, DoesNotMatchWrongOrder) {
132 using ContainerType = TypeParam;
133 EXPECT_THAT(ContainerType({1.0f, 3.0f, 2.0f}),
137TYPED_TEST(FloatArrayEqContainerTypeTest, DoesNotMatchNaNs) {
138 using ContainerType = TypeParam;
139 auto reference_values = {1.0f, std::numeric_limits<float>::quiet_NaN()};
140 ContainerType reference_container(reference_values);
141 const Matcher<ContainerType> m =
FloatArrayEq(reference_container);
142 EXPECT_FALSE(m.Matches(reference_container));
143 EXPECT_FALSE(m.Matches(ContainerType({1.0f, 2.0f})));
146TYPED_TEST(FloatArrayEqContainerTypeTest, HandlesInfinities) {
147 using ContainerType = TypeParam;
148 auto reference_values = {1.0f, std::numeric_limits<float>::infinity(),
149 -std::numeric_limits<float>::infinity()};
150 ContainerType reference_container(reference_values);
151 const Matcher<ContainerType> m =
FloatArrayEq(reference_container);
152 EXPECT_TRUE(m.Matches(reference_container));
153 EXPECT_FALSE(m.Matches(ContainerType({1.0f, 2.0f, 3.0f})));
156static const double kEps = 1e-6;
158TEST(EigenArrayNearTest, ArrayXd) {
159 const Eigen::ArrayXd expected = Eigen::ArrayXd::Random(4);
160 Eigen::ArrayXd actual = expected;
171TEST(EigenArrayNearTest, ArrayXdInlinedValues) {
172 Eigen::ArrayXd actual(3);
173 actual << 1.0, 2.0, 3.0;
174 EXPECT_THAT(actual, EigenArrayNear<double>({1.0, 2.0, 3.0}, kEps));
176 EigenArrayNear<double>({1.0, 2.0 + 0.5 * kEps, 3.0}, kEps));
178 EXPECT_THAT(actual,
Not(EigenArrayNear<double>({1.0, 2.0, 5.0}, kEps)));
180 EXPECT_THAT(actual,
Not(EigenArrayNear<double>({1.0, 2.0}, kEps)));
183TEST(EigenArrayNearTest, EmptyArrayX) {
184 const Eigen::ArrayXi empty;
189 EXPECT_THAT(empty,
Not(EigenArrayNear<int>({1, 2}, kEps)));
193TEST(EigenArrayNearTest, ArrayXXf) {
194 const Eigen::ArrayXXf expected = Eigen::ArrayXXf::Random(4, 5);
195 Eigen::ArrayXXf actual = expected;
199 actual.row(2) += 100;
208 actual.col(0) << 1.0, 2.0, 3.0;
209 actual.col(1) << 4.0, 5.0, 6.0;
210 std::vector<float> expected_vector({1.0, 2.0, 3.0, 4.0, 5.0, 6.0});
212 &expected_vector[0], 3,
217 &expected_vector[0], 3,
222TEST(EigenArrayNearTest, DifferentMajor) {
223 Eigen::Array<float, Dynamic, Dynamic, ColMajor> col_major(2, 3);
224 col_major << 1.0, 2.0, 3.0, 4.0, 5.0, 6.0;
225 Eigen::Array<float, Dynamic, Dynamic, RowMajor> row_major(2, 3);
226 row_major << 1.0, 2.0, 3.0, 4.0, 5.0, 6.0;
227 CHECK_EQ(col_major(1, 0), row_major(1, 0));
230 EXPECT_THAT(row_major, EigenArrayNear<float>({{1.0, 2.0, 3.0},
234 EXPECT_THAT(col_major, EigenArrayNear<float>({{1.0, 2.0, 3.0},
239TEST(EigenArrayNearTest, ArrayXXfInlinedValues) {
240 Eigen::ArrayXXf actual(2, 3);
241 actual.row(0) << 1.0, 2.0, 3.0;
242 actual.row(1) << 4.0, -5.0, -6.0;
244 EXPECT_THAT(actual, EigenArrayNear<float>({{1.0, 2.0, 3.0},
247 EXPECT_THAT(actual, EigenArrayNear<float>(
249 {4.0, -5.0,
static_cast<float>(-6.0 - 0.9 * kEps)}},
251 EXPECT_THAT(actual,
Not(EigenArrayNear<float>({{1.0, 2.0, 3.0},
255 EXPECT_THAT(actual,
Not(EigenArrayNear<float>({{1.0, 2.0, 3.0}}, kEps)));
258TEST(EigenArrayEqTest, ArrayXd) {
259 const Eigen::ArrayXd expected = Eigen::ArrayXd::Random(4);
260 Eigen::ArrayXd actual = expected;
270TEST(EigenArrayEqTest, ArrayXdInlinedValues) {
271 Eigen::ArrayXd actual(3);
272 actual << 1.0, 2.0, 3.0;
273 EXPECT_THAT(actual, EigenArrayEq<double>({1.0, 2.0, 3.0}));
274 EXPECT_THAT(actual, EigenArrayEq<double>({1.0, 2.0 + 5e-7, 3.0}));
276 EXPECT_THAT(actual,
Not(EigenArrayEq<double>({1.0, 2.0, 5.0})));
278 EXPECT_THAT(actual,
Not(EigenArrayEq<double>({1.0, 2.0})));
281TEST(EigenArrayEqTest, EmptyArrayX) {
282 const Eigen::ArrayXi empty;
287 EXPECT_THAT(empty,
Not(EigenArrayEq<int>({1, 2})));
291TEST(EigenArrayEqTest, ArrayXXf) {
292 const Eigen::ArrayXXf expected = Eigen::ArrayXXf::Random(4, 5);
293 Eigen::ArrayXXf actual = expected;
296 actual.row(2) += 100;
305 actual.col(0) << 1.0, 2.0, 3.0;
306 actual.col(1) << 4.0, 5.0, 6.0;
307 std::vector<float> expected_vector({1.0, 2.0, 3.0, 4.0, 5.0, 6.0});
308 EXPECT_THAT(actual,
EigenArrayEq(Eigen::Map<Eigen::ArrayXXf>(
309 &expected_vector[0], 3, 2)));
312 &expected_vector[0], 3, 1))));
315TEST(EigenArrayEqTest, ArrayXXfInlinedValues) {
316 Eigen::ArrayXXf actual(2, 3);
317 actual.row(0) << 1.0, 2.0, 3.0;
318 actual.row(1) << 4.0, -5.0, -6.0;
320 EXPECT_THAT(actual, EigenArrayEq<float>({{1.0, 2.0, 3.0},
321 {4.0, -5.0, -6.0}}));
322 EXPECT_THAT(actual, EigenArrayEq<float>({{1.0, 2.0, 3.0},
323 {4.0, -5.0, -6.0 - 1e-6}}));
324 EXPECT_THAT(actual,
Not(EigenArrayEq<float>({{1.0, 2.0, 3.0},
325 {4.0, -5.0, -8.0}})));
327 EXPECT_THAT(actual,
Not(EigenArrayEq<float>({{1.0, 2.0, 3.0}})));
#define CHECK_EQ(val1, val2)
EigenArrayNearMatcherP2< Eigen::Array< T, Eigen::Dynamic, 1 >, double > EigenArrayNear(absl::Span< const T > data, double tolerance)
decltype(testing::Pointwise(internal::TupleFloatEq(), ContainerType())) FloatArrayEq(const ContainerType &container)
EigenArrayEqMatcherP< Eigen::Array< T, Eigen::Dynamic, 1 > > EigenArrayEq(absl::Span< const T > data)
decltype(testing::Pointwise(internal::TupleIsNear(0.0), ContainerType())) FloatArrayNear(const ContainerType &container, double tolerance)
BoolVar Not(BoolVar x)
A convenient wrapper so we can write Not(x) instead of x.Not() which is sometimes clearer.
TEST(LinearAssignmentTest, NullMatrix)