diff --git a/CMakeLists.txt b/CMakeLists.txt index f32a570..ea599f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,60 +69,5 @@ set(gcc_like $ #include -namespace utf = boost::unit_test; -namespace tt = boost::test_tools; +#include using MP2 = mvPolynomial::MVPolynomial; using MP3 = mvPolynomial::MVPolynomial; -BOOST_AUTO_TEST_CASE(mvPolynomial_init, *utf::tolerance(tt::fpc::percent_tolerance(1e-10))) { - auto ans = std::vector>(); - ans = { - {{0, 0}, 1}, - {{1, 0}, 2}, - {{0, 1}, 3}, - {{1, 1}, 4}, - {{2, 0}, 5}, - {{0, 2}, 6}, - }; +TEST_CASE("constructor", "[mvPolynomial]") { + SECTION("default") { + auto ans = std::vector>({ + {{0, 0}, 0}, + }); + auto m = MP2(); - auto m = MP2(ans.begin(), ans.end()); - for (auto i = 0; i < ans.size(); ++i) { - BOOST_TEST(m.at(ans[i].first) == ans[i].second); + REQUIRE(m.size() == ans.size()); + for (auto i = 0; i < ans.size(); ++i) { + REQUIRE(m[ans[i].first] == ans[i].second); + } + } + + SECTION("range") { + auto ans = std::vector>({ + {{0, 0}, 1}, + {{1, 0}, 2}, + {{0, 1}, 3}, + {{1, 1}, 4}, + {{2, 0}, 5}, + {{0, 2}, 6}, + }); + + auto m = MP2(ans.begin(), ans.end()); + + REQUIRE(m.size() == ans.size()); + for (size_t i = 0; i < ans.size(); ++i) { + REQUIRE(m.at(ans[i].first) == ans[i].second); + } + } + + SECTION("initializer_list") { + auto ans = std::vector>({ + {{0, 0}, 1}, + {{1, 0}, 2}, + {{0, 1}, 3}, + {{1, 1}, 4}, + {{2, 0}, 5}, + {{0, 2}, 6}, + }); + + auto m = MP2({ + {{0, 0}, 1}, + {{1, 0}, 2}, + {{0, 1}, 3}, + {{1, 1}, 4}, + {{2, 0}, 5}, + {{0, 2}, 6}, + }); + + REQUIRE(m.size() == ans.size()); + for (size_t i = 0; i < ans.size(); ++i) { + REQUIRE(m.at(ans[i].first) == ans[i].second); + } } } -BOOST_AUTO_TEST_CASE(mvPolynomial_Of, *utf::tolerance(tt::fpc::percent_tolerance(1e-10))) { - auto ans = std::vector>(); - ans = { +TEST_CASE("operator()", "[mvPolynomial]") { + auto m = MP2({ {{0, 0}, 1}, {{1, 0}, 2}, {{0, 1}, 3}, {{1, 1}, 4}, {{2, 0}, 5}, {{0, 2}, 6}, - }; + }); - auto m = MP2(ans.begin(), ans.end()); - BOOST_TEST(m(Eigen::Vector2d::Zero()) == 1); - BOOST_TEST(m(Eigen::Vector2d({2, 3})) == 112); + REQUIRE(m(Eigen::Vector2d::Zero()) == 1); + REQUIRE(m(Eigen::Vector2d({2, 3})) == 112); } -BOOST_AUTO_TEST_CASE(mvPolynomial_derivative, *utf::tolerance(tt::fpc::percent_tolerance(1e-10))) { - auto ans = std::vector>(); - ans = { +TEST_CASE("D", "[mvPolynomial]") { + auto m = MP2({ {{0, 0}, 1}, {{1, 0}, 2}, {{0, 1}, 3}, {{1, 1}, 4}, {{2, 0}, 5}, {{0, 2}, 6}, - }; - auto m = MP2(ans.begin(), ans.end()); - ans = { - {{0, 0}, 2}, - {{0, 1}, 4}, - {{1, 0}, 10} - }; - auto dm0 = mvPolynomial::D(m, 0); - for (auto i = 0; i < ans.size(); ++i) { - BOOST_TEST(dm0[ans[i].first] == ans[i].second); + }); + + SECTION("D_x") { + auto ans = std::vector>({ + {{0, 0}, 2}, + {{0, 1}, 4}, + {{1, 0}, 10} + }); + auto dm0 = mvPolynomial::D(m, 0); + + REQUIRE(dm0.size() == ans.size()); + for (size_t i = 0; i < ans.size(); ++i) { + REQUIRE(dm0[ans[i].first] == ans[i].second); + } } - ans = { - {{0, 0}, 3}, - {{1, 0}, 4}, - {{0, 1}, 12} - }; - auto dm1 = mvPolynomial::D(m, 1); - for (auto i = 0; i < ans.size(); ++i) { - BOOST_TEST(dm1[ans[i].first] == ans[i].second); + + SECTION("D_y") { + auto ans = std::vector>({ + {{0, 0}, 3}, + {{1, 0}, 4}, + {{0, 1}, 12} + }); + auto dm1 = mvPolynomial::D(m, 1); + + REQUIRE(dm1.size() == ans.size()); + for (size_t i = 0; i < ans.size(); ++i) { + REQUIRE(dm1[ans[i].first] == ans[i].second); + } } } -BOOST_AUTO_TEST_CASE(mvPolynomial_integral, *utf::tolerance(tt::fpc::percent_tolerance(1e-10))) { - auto ans = std::vector>(); - ans = { +TEST_CASE("integral", "[mvPolynomial]") { + auto m = MP2({ {{0, 0}, 1}, {{1, 0}, 2}, {{0, 1}, 3}, {{1, 1}, 4}, {{2, 0}, 5}, {{0, 2}, 6}, - }; - auto m = MP2(ans.begin(), ans.end()); - ans = { - {{0, 1}, 1}, - {{1, 1}, 2}, - {{0, 2}, 1.5}, - {{1, 2}, 2}, - {{2, 1}, 5}, - {{0, 3}, 2} - }; - auto sm = mvPolynomial::Integrate(m, 1); - for (auto i = 0; i < ans.size(); ++i) { - BOOST_TEST(sm[ans[i].first] == ans[i].second); + }); + + SECTION("S m dx") { + auto ans = std::vector>({ + {{1, 0}, 1}, + {{2, 0}, 1}, + {{1, 1}, 3}, + {{2, 1}, 2}, + {{3, 0}, 5.0 / 3}, + {{1, 2}, 6} + }); + auto sm = mvPolynomial::Integrate(m, 0); + + REQUIRE(sm.size() == ans.size()); + for (size_t i = 0; i < ans.size(); ++i) { + REQUIRE(sm[ans[i].first] == ans[i].second); + } + } + + SECTION("S m dy") { + auto ans = std::vector>({ + {{0, 1}, 1}, + {{1, 1}, 2}, + {{0, 2}, 1.5}, + {{1, 2}, 2}, + {{2, 1}, 5}, + {{0, 3}, 2} + }); + auto sm = mvPolynomial::Integrate(m, 1); + + REQUIRE(sm.size() == ans.size()); + for (size_t i = 0; i < ans.size(); ++i) { + REQUIRE(sm[ans[i].first] == ans[i].second); + } } } -BOOST_AUTO_TEST_CASE(mvPolynomial_multiply, *utf::tolerance(tt::fpc::percent_tolerance(1e-10))) { - auto ans = std::vector>(); - ans = { +TEST_CASE("multiply", "[mvPolynomial]") { + // left hand + auto l = MP2({ {{0, 0}, 1}, {{1, 0}, 2}, {{0, 1}, 3}, - }; - auto l = MP2(ans.begin(), ans.end()); - ans = { - {{2, 0}, 5}, - {{0, 2}, 7}, - }; - auto m = MP2(ans.begin(), ans.end()); - ans = { + }); + + // right hand + auto r = MP2({ + {{2, 0}, 5}, + {{0, 2}, 7}, + {{1, 1}, 11}, + }); + + auto ans = std::vector>({ {{2, 0}, 5}, {{3, 0}, 10}, - {{2, 1}, 15}, + {{2, 1}, 37}, // {{2, 1}, 15} + {{2, 1}, 22} {{0, 2}, 7}, - {{1, 2}, 14}, + {{1, 2}, 47}, // {{1, 2}, 14} + {{1, 2}, 33} {{0, 3}, 21}, - }; - auto prod = l * m; - for (auto i = 0; i < ans.size(); ++i) { - BOOST_TEST(prod[ans[i].first] == ans[i].second); - } -} + {{1, 1}, 11}, + }); -BOOST_AUTO_TEST_CASE(mvPolynomial_sum, *utf::tolerance(tt::fpc::percent_tolerance(1e-10))) { - auto ans = std::vector>(); - ans = { - {{0, 0}, 1}, - {{1, 0}, 2}, - {{0, 1}, 3}, - }; - auto l = MP2(ans.begin(), ans.end()); - ans = { - {{2, 0}, 5}, - {{0, 2}, 7}, - }; - auto m = MP2(ans.begin(), ans.end()); - ans = { - {{0, 0}, 1}, - {{1, 0}, 2}, - {{0, 1}, 3}, - {{2, 0}, 5}, - {{0, 2}, 7}, - }; - auto sum = l + m; - for (auto i = 0; i < ans.size(); ++i) { - BOOST_TEST(sum[ans[i].first] == ans[i].second); + auto prod = l * r; + + REQUIRE(prod.size() == ans.size()); + for (size_t i = 0; i < ans.size(); ++i) { + REQUIRE(prod[ans[i].first] == ans[i].second); } } -BOOST_AUTO_TEST_CASE(mvPolynomial_sub, *utf::tolerance(tt::fpc::percent_tolerance(1e-10))) { - auto ans = std::vector>(); - ans = { +TEST_CASE("sum", "[mvPolynomial]") { + auto l = MP2({ {{0, 0}, 1}, {{1, 0}, 2}, {{0, 1}, 3}, - }; - auto l = MP2(ans.begin(), ans.end()); - ans = { - {{2, 0}, 5}, - {{0, 2}, 7}, - }; - auto m = MP2(ans.begin(), ans.end()); - ans = { + }); + + auto r = MP2({ + {{2, 0}, 5}, + {{0, 2}, 7}, + {{1, 1}, 11}, + }); + + auto ans = std::vector>({ {{0, 0}, 1}, {{1, 0}, 2}, {{0, 1}, 3}, - {{2, 0}, -5}, - {{0, 2}, -7}, - }; - auto sub = l - m; - for (auto i = 0; i < ans.size(); ++i) { - BOOST_TEST(sub[ans[i].first] == ans[i].second); + {{2, 0}, 5}, + {{0, 2}, 7}, + {{1, 1}, 11}, + }); + auto sum = l + r; + + REQUIRE(sum.size() == ans.size()); + for (size_t i = 0; i < ans.size(); ++i) { + REQUIRE(sum[ans[i].first] == ans[i].second); } } -BOOST_AUTO_TEST_CASE( - mvPolynomial_default_value_check, *utf::tolerance(tt::fpc::percent_tolerance(1e-10)) -) { - auto ans = std::vector>(); - ans = { - {{0, 0}, 0}, - }; - auto m = MP2(); +TEST_CASE("sub", "[mvPolynomial]") { + auto l = MP2({ + {{0, 0}, 1}, + {{1, 0}, 2}, + {{0, 1}, 3}, + }); + auto r = MP2({ + {{2, 0}, 5}, + {{0, 2}, 7}, + {{1, 1}, 11}, + }); + auto ans = std::vector>({ + {{0, 0}, 1}, + {{1, 0}, 2}, + {{0, 1}, 3}, + {{2, 0}, -5}, + {{0, 2}, -7}, + {{1, 1}, -11}, + }); + auto sub = l - r; + + REQUIRE(sub.size() == ans.size()); for (auto i = 0; i < ans.size(); ++i) { - BOOST_TEST(m[ans[i].first] == ans[i].second); + REQUIRE(sub[ans[i].first] == ans[i].second); } }