diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 8f4aa22..b74a0c0 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -21,6 +21,8 @@ add_test_executable(test_poly poly/test_poly.cpp) add_test_executable(test_barycentric misc/test_barycentric.cpp) +add_test_executable(test_polyeqv spline/test_polyeqv.cpp) + add_test_executable(test_step spline/test_step.cpp) add_test_executable(test_linear spline/test_linear.cpp) add_test_executable(test_quadratic spline/test_quadratic.cpp) diff --git a/tests/spline/test_polyeqv.cpp b/tests/spline/test_polyeqv.cpp new file mode 100644 index 0000000..62d48f9 --- /dev/null +++ b/tests/spline/test_polyeqv.cpp @@ -0,0 +1,55 @@ +#include + +#include "../test_utils.h" + +const auto test_data_path = TEST_DATA_DIR "/poly/poly.toml"; + +const auto test_data = toml::parse_file(test_data_path); + +void test_polyeqv_spline(double epsilon) { + const auto& test_cases = test_data["test_cases"].ref(); + + test_cases.for_each([&](const toml::table& test_case) { + const auto& X = to_vector(test_case["X"].ref()); + const auto& Y = to_vector(test_case["Y"].ref()); + const auto& xx = to_vector(test_case["xx"].ref()); + const auto& yy = to_vector(test_case["yy"].ref()); + + expect_eq(alfi::spline::PolyEqvSpline<>(X, Y).eval(xx), yy, epsilon); + }); +} + +TEST(PolyEqvSplineTest, PolynomialData) { + test_polyeqv_spline(1e-10); +} + +TEST(PolyEqvSplineTest, General) { + const std::vector X = {0, 1, 2, 3}; + const std::vector Y = {5, 2, 10, 4}; + const auto spline = alfi::spline::PolyEqvSpline<>(X, Y); + for (size_t i = 0; i < X.size() - 1; ++i) { + EXPECT_EQ(spline(X[i]), Y[i]); + } + EXPECT_NEAR(spline(X[X.size()-1]), Y[Y.size()-1], 1e-14); +} + +TEST(PolyEqvSplineTest, Moving) { + std::vector X = {0, 1, 2, 3}; + const std::vector Y = {5, 2, 10, 4}; + auto spline = alfi::spline::PolyEqvSpline<>(std::move(X), Y); + EXPECT_TRUE(X.empty()); + EXPECT_FALSE(spline.X().empty()); + EXPECT_FALSE(spline.coeffs().empty()); + X = spline.X(); + auto coeffs = spline.coeffs(); + EXPECT_FALSE(X.empty()); + EXPECT_FALSE(coeffs.empty()); + EXPECT_FALSE(spline.X().empty()); + EXPECT_FALSE(spline.coeffs().empty()); + X = std::move(spline).X(); + coeffs = std::move(spline).coeffs(); + EXPECT_FALSE(X.empty()); + EXPECT_FALSE(coeffs.empty()); + EXPECT_TRUE(spline.X().empty()); + EXPECT_TRUE(spline.coeffs().empty()); +} \ No newline at end of file