123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- #include "math_test.h"
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wfloat-equal"
- #define AP_EXPECT_IDENTITY_MATRIX(m_) {\
- EXPECT_NEAR(1.0f, m_.a.x, 1.0e-6); \
- EXPECT_NEAR(0.0f, m_.a.y, 1.0e-6); \
- EXPECT_NEAR(0.0f, m_.a.z, 1.0e-6); \
- EXPECT_NEAR(0.0f, m_.b.x, 1.0e-6); \
- EXPECT_NEAR(1.0f, m_.b.y, 1.0e-6); \
- EXPECT_NEAR(0.0f, m_.b.z, 1.0e-6); \
- EXPECT_NEAR(0.0f, m_.c.x, 1.0e-6); \
- EXPECT_NEAR(0.0f, m_.c.y, 1.0e-6); \
- EXPECT_NEAR(1.0f, m_.c.z, 1.0e-6); \
- }
- class TestParam {
- public:
-
- Matrix3f m;
-
- float det;
- };
- AP_GTEST_PRINTATBLE_PARAM_MEMBER(TestParam, m);
- class Matrix3fTest : public ::testing::TestWithParam<TestParam> {};
- static TestParam invertible[] = {
- {
- .m = {
- {1.0f, 2.0f, 3.0f},
- {4.0f, 6.0f, 2.0f},
- {9.0f, 18.0f, 27.0f}
- },
- .det = 0.0f,
- },
- };
- static TestParam non_invertible[] = {
- {
- .m = {
- { 6.0f, 2.0f, 20.0f},
- { 1.0f, -9.0f, 4.0f},
- {-4.0f, 7.0f, -27.0f}
- },
- .det = 732.0f,
- },
- {
- .m = {
- {-6.0f, -2.0f, -20.0f},
- {-1.0f, 9.0f, -4.0f},
- { 4.0f, -7.0f, 27.0f}
- },
- .det = -732.0f,
- },
- };
- TEST_P(Matrix3fTest, Determinants)
- {
- auto param = GetParam();
- EXPECT_FLOAT_EQ(param.det, param.m.det());
- }
- TEST_P(Matrix3fTest, Inverses)
- {
- auto param = GetParam();
- Matrix3f inv;
- bool success = param.m.inverse(inv);
- if (param.det == 0.0f) {
- EXPECT_FALSE(success);
- } else {
- ASSERT_TRUE(success);
- auto identity = inv * param.m;
- AP_EXPECT_IDENTITY_MATRIX(identity);
- }
- }
- INSTANTIATE_TEST_CASE_P(InvertibleMatrices,
- Matrix3fTest,
- ::testing::ValuesIn(invertible));
- INSTANTIATE_TEST_CASE_P(NonInvertibleMatrices,
- Matrix3fTest,
- ::testing::ValuesIn(non_invertible));
- AP_GTEST_MAIN()
- #pragma GCC diagnostic pop
|