#include <catch2/catch.hpp>

#include <Kokkos_Core.hpp>

#include <utils/PugsAssert.hpp>
#include <utils/Types.hpp>

#include <algebra/TinyMatrix.hpp>
#include <analysis/Polynomial.hpp>
#include <analysis/PolynomialBasis.hpp>

// Instantiate to ensure full coverage is performed
template class Polynomial<0>;
template class Polynomial<1>;
template class Polynomial<2>;
template class PolynomialBasis<2>;

// clazy:excludeall=non-pod-global-static

TEST_CASE("PolynomialBasis", "[analysis]")
{
  SECTION("construction")
  {
    REQUIRE_NOTHROW(PolynomialBasis<2>{});
  }
  SECTION("size")
  {
    PolynomialBasis<2> B;
    REQUIRE(B.size() == 3);
    REQUIRE(B.degree() == 2);
  }
  SECTION("build")
  {
    PolynomialBasis<2> B;
    REQUIRE(B.displayType() == "undefined");
    B.build(BasisType::canonical);
    REQUIRE(B.elements()[1] == Polynomial<2>{{0, 1, 0}});
    REQUIRE(B.elements()[2] == Polynomial<2>{{0, 0, 1}});
    PolynomialBasis<2> C;
    C.build(BasisType::taylor);
    REQUIRE(B.elements()[1] == C.elements()[1]);
    C.build(BasisType::taylor, 1);
    REQUIRE(C.elements()[2] == Polynomial<2>{{1, -2, 1}});
  }
}