Skip to content
Snippets Groups Projects
Commit 08ba4a92 authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Add missing tests for ASTNodeDataType

parent 2dfa351c
Branches
Tags
1 merge request!71Feature/language tiny matrices
...@@ -9,6 +9,7 @@ namespace language ...@@ -9,6 +9,7 @@ namespace language
struct integer; struct integer;
struct real; struct real;
struct vector_type; struct vector_type;
struct matrix_type;
} // namespace language } // namespace language
// clazy:excludeall=non-pod-global-static // clazy:excludeall=non-pod-global-static
...@@ -62,6 +63,14 @@ TEST_CASE("ASTNodeDataType", "[language]") ...@@ -62,6 +63,14 @@ TEST_CASE("ASTNodeDataType", "[language]")
REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::vector_t>(2)) == "R^2"); REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::vector_t>(2)) == "R^2");
REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::vector_t>(3)) == "R^3"); REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::vector_t>(3)) == "R^3");
REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::vector_t>(7)) == "R^7");
REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1)) == "R^1x1");
REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2)) == "R^2x2");
REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3)) == "R^3x3");
REQUIRE(dataTypeName(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(7, 3)) == "R^7x3");
REQUIRE(dataTypeName(std::vector<ASTNodeDataType>{}) == "void"); REQUIRE(dataTypeName(std::vector<ASTNodeDataType>{}) == "void");
REQUIRE(dataTypeName(std::vector<ASTNodeDataType>{bool_dt}) == "B"); REQUIRE(dataTypeName(std::vector<ASTNodeDataType>{bool_dt}) == "B");
REQUIRE(dataTypeName(std::vector<ASTNodeDataType>{bool_dt, unsigned_int_dt}) == "(B,N)"); REQUIRE(dataTypeName(std::vector<ASTNodeDataType>{bool_dt, unsigned_int_dt}) == "(B,N)");
...@@ -140,6 +149,99 @@ TEST_CASE("ASTNodeDataType", "[language]") ...@@ -140,6 +149,99 @@ TEST_CASE("ASTNodeDataType", "[language]")
type_node->children[1]->set_type<language::real>(); type_node->children[1]->set_type<language::real>();
REQUIRE_THROWS_WITH(getVectorDataType(*type_node), "unexpected non integer constant dimension"); REQUIRE_THROWS_WITH(getVectorDataType(*type_node), "unexpected non integer constant dimension");
} }
SECTION("bad dimension value")
{
type_node->children[1]->source = "0";
REQUIRE_THROWS_WITH(getVectorDataType(*type_node), "invalid dimension (must be 1, 2 or 3)");
type_node->children[1]->source = "4";
REQUIRE_THROWS_WITH(getVectorDataType(*type_node), "invalid dimension (must be 1, 2 or 3)");
}
}
SECTION("getMatrixDataType")
{
std::unique_ptr type_node = std::make_unique<ASTNode>();
type_node->set_type<language::matrix_type>();
type_node->emplace_back(std::make_unique<ASTNode>());
{
{
std::unique_ptr dimension0_node = std::make_unique<ASTNode>();
dimension0_node->set_type<language::integer>();
dimension0_node->source = "3";
auto& source0 = dimension0_node->source;
dimension0_node->m_begin = TAO_PEGTL_NAMESPACE::internal::iterator{&source0[0]};
dimension0_node->m_end = TAO_PEGTL_NAMESPACE::internal::iterator{&source0[source0.size()]};
type_node->emplace_back(std::move(dimension0_node));
}
{
std::unique_ptr dimension1_node = std::make_unique<ASTNode>();
dimension1_node->set_type<language::integer>();
dimension1_node->source = "3";
auto& source1 = dimension1_node->source;
dimension1_node->m_begin = TAO_PEGTL_NAMESPACE::internal::iterator{&source1[0]};
dimension1_node->m_end = TAO_PEGTL_NAMESPACE::internal::iterator{&source1[source1.size()]};
type_node->emplace_back(std::move(dimension1_node));
}
}
SECTION("good node")
{
REQUIRE(getMatrixDataType(*type_node) == ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3));
REQUIRE(getMatrixDataType(*type_node).nbRows() == 3);
REQUIRE(getMatrixDataType(*type_node).nbColumns() == 3);
}
SECTION("bad node type")
{
type_node->set_type<language::integer>();
REQUIRE_THROWS_WITH(getMatrixDataType(*type_node), "unexpected node type");
}
SECTION("bad children size 1")
{
type_node->children.clear();
REQUIRE_THROWS_WITH(getMatrixDataType(*type_node), "unexpected node type");
}
SECTION("bad children size 1")
{
type_node->children.emplace_back(std::unique_ptr<ASTNode>());
REQUIRE_THROWS_WITH(getMatrixDataType(*type_node), "unexpected node type");
}
SECTION("bad dimension 0 type")
{
type_node->children[1]->set_type<language::real>();
REQUIRE_THROWS_WITH(getMatrixDataType(*type_node), "unexpected non integer constant dimension");
}
SECTION("bad dimension 1 type")
{
type_node->children[2]->set_type<language::real>();
REQUIRE_THROWS_WITH(getMatrixDataType(*type_node), "unexpected non integer constant dimension");
}
SECTION("bad nb rows value")
{
type_node->children[1]->source = "0";
type_node->children[2]->source = "0";
REQUIRE_THROWS_WITH(getMatrixDataType(*type_node), "invalid dimension (must be 1, 2 or 3)");
type_node->children[1]->source = "4";
type_node->children[2]->source = "4";
REQUIRE_THROWS_WITH(getMatrixDataType(*type_node), "invalid dimension (must be 1, 2 or 3)");
}
SECTION("none square matrices")
{
type_node->children[1]->source = "1";
type_node->children[2]->source = "2";
REQUIRE_THROWS_WITH(getMatrixDataType(*type_node), "only square matrices are supported");
}
} }
SECTION("isNaturalConversion") SECTION("isNaturalConversion")
...@@ -153,6 +255,7 @@ TEST_CASE("ASTNodeDataType", "[language]") ...@@ -153,6 +255,7 @@ TEST_CASE("ASTNodeDataType", "[language]")
REQUIRE(not isNaturalConversion(string_dt, bool_dt)); REQUIRE(not isNaturalConversion(string_dt, bool_dt));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(bool_dt), bool_dt)); REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(bool_dt), bool_dt));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(1), bool_dt)); REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(1), bool_dt));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1), bool_dt));
} }
SECTION("-> N") SECTION("-> N")
...@@ -165,6 +268,7 @@ TEST_CASE("ASTNodeDataType", "[language]") ...@@ -165,6 +268,7 @@ TEST_CASE("ASTNodeDataType", "[language]")
REQUIRE( REQUIRE(
not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(unsigned_int_dt), unsigned_int_dt)); not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(unsigned_int_dt), unsigned_int_dt));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(1), unsigned_int_dt)); REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(1), unsigned_int_dt));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1), unsigned_int_dt));
} }
SECTION("-> Z") SECTION("-> Z")
...@@ -176,6 +280,7 @@ TEST_CASE("ASTNodeDataType", "[language]") ...@@ -176,6 +280,7 @@ TEST_CASE("ASTNodeDataType", "[language]")
REQUIRE(not isNaturalConversion(string_dt, int_dt)); REQUIRE(not isNaturalConversion(string_dt, int_dt));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(int_dt), int_dt)); REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(int_dt), int_dt));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(1), int_dt)); REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(1), int_dt));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1), int_dt));
} }
SECTION("-> R") SECTION("-> R")
...@@ -187,6 +292,7 @@ TEST_CASE("ASTNodeDataType", "[language]") ...@@ -187,6 +292,7 @@ TEST_CASE("ASTNodeDataType", "[language]")
REQUIRE(not isNaturalConversion(string_dt, double_dt)); REQUIRE(not isNaturalConversion(string_dt, double_dt));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(double_dt), double_dt)); REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(double_dt), double_dt));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(1), double_dt)); REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(1), double_dt));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1), double_dt));
} }
SECTION("-> string") SECTION("-> string")
...@@ -198,6 +304,7 @@ TEST_CASE("ASTNodeDataType", "[language]") ...@@ -198,6 +304,7 @@ TEST_CASE("ASTNodeDataType", "[language]")
REQUIRE(isNaturalConversion(string_dt, string_dt)); REQUIRE(isNaturalConversion(string_dt, string_dt));
REQUIRE(isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_dt), string_dt)); REQUIRE(isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_dt), string_dt));
REQUIRE(isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(1), string_dt)); REQUIRE(isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(1), string_dt));
REQUIRE(isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1), string_dt));
} }
SECTION("-> tuple") SECTION("-> tuple")
...@@ -227,6 +334,21 @@ TEST_CASE("ASTNodeDataType", "[language]") ...@@ -227,6 +334,21 @@ TEST_CASE("ASTNodeDataType", "[language]")
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(double_dt), REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(double_dt),
ASTNodeDataType::build<ASTNodeDataType::vector_t>(1))); ASTNodeDataType::build<ASTNodeDataType::vector_t>(1)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1),
ASTNodeDataType::build<ASTNodeDataType::vector_t>(1)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1),
ASTNodeDataType::build<ASTNodeDataType::vector_t>(2)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2),
ASTNodeDataType::build<ASTNodeDataType::vector_t>(2)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2),
ASTNodeDataType::build<ASTNodeDataType::vector_t>(4)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3),
ASTNodeDataType::build<ASTNodeDataType::vector_t>(3)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3),
ASTNodeDataType::build<ASTNodeDataType::vector_t>(9)));
REQUIRE(isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(1), REQUIRE(isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(1),
ASTNodeDataType::build<ASTNodeDataType::vector_t>(1))); ASTNodeDataType::build<ASTNodeDataType::vector_t>(1)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(2), REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(2),
...@@ -249,6 +371,53 @@ TEST_CASE("ASTNodeDataType", "[language]") ...@@ -249,6 +371,53 @@ TEST_CASE("ASTNodeDataType", "[language]")
ASTNodeDataType::build<ASTNodeDataType::vector_t>(3))); ASTNodeDataType::build<ASTNodeDataType::vector_t>(3)));
} }
SECTION("-> matrix")
{
REQUIRE(not isNaturalConversion(bool_dt, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1)));
REQUIRE(not isNaturalConversion(unsigned_int_dt, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3)));
REQUIRE(not isNaturalConversion(int_dt, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2)));
REQUIRE(not isNaturalConversion(double_dt, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2)));
REQUIRE(not isNaturalConversion(string_dt, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(double_dt),
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(1),
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(2),
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(2),
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(4),
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(3),
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::vector_t>(9),
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3)));
REQUIRE(isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1),
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2),
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3),
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1),
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2)));
REQUIRE(isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2),
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3),
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1),
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3)));
REQUIRE(not isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2),
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 2)));
REQUIRE(isNaturalConversion(ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3),
ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3)));
}
SECTION("-> type_id") SECTION("-> type_id")
{ {
REQUIRE(not isNaturalConversion(bool_dt, ASTNodeDataType::build<ASTNodeDataType::type_id_t>("foo"))); REQUIRE(not isNaturalConversion(bool_dt, ASTNodeDataType::build<ASTNodeDataType::type_id_t>("foo")));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment