diff --git a/tests/test_ASTNodeDataType.cpp b/tests/test_ASTNodeDataType.cpp index ab91abd6309244dc15ca28b0a13e4b2cc9814a64..7771e3be391cd09e55a42d0dab4ea76749085c89 100644 --- a/tests/test_ASTNodeDataType.cpp +++ b/tests/test_ASTNodeDataType.cpp @@ -2,6 +2,9 @@ #include <ASTNodeDataType.hpp> +#include <ASTNode.hpp> +#include <PEGGrammar.hpp> + TEST_CASE("ASTNodeDataType", "[language]") { SECTION("dataTypeName") @@ -16,6 +19,10 @@ TEST_CASE("ASTNodeDataType", "[language]") REQUIRE(dataTypeName(ASTNodeDataType::void_t) == "void"); REQUIRE(dataTypeName(ASTNodeDataType::function_t) == "function"); REQUIRE(dataTypeName(ASTNodeDataType::c_function_t) == "c_function"); + REQUIRE(dataTypeName(ASTNodeDataType::list_t) == "list"); + REQUIRE(dataTypeName(ASTNodeDataType{ASTNodeDataType::vector_t, 1}) == "R^1"); + REQUIRE(dataTypeName(ASTNodeDataType{ASTNodeDataType::vector_t, 2}) == "R^2"); + REQUIRE(dataTypeName(ASTNodeDataType{ASTNodeDataType::vector_t, 3}) == "R^3"); } SECTION("promotion") @@ -43,5 +50,55 @@ TEST_CASE("ASTNodeDataType", "[language]") REQUIRE(dataTypePromotion(ASTNodeDataType::unsigned_int_t, ASTNodeDataType::string_t) == ASTNodeDataType::undefined_t); REQUIRE(dataTypePromotion(ASTNodeDataType::double_t, ASTNodeDataType::string_t) == ASTNodeDataType::undefined_t); + REQUIRE(dataTypePromotion(ASTNodeDataType::bool_t, ASTNodeDataType::vector_t) == ASTNodeDataType::vector_t); + REQUIRE(dataTypePromotion(ASTNodeDataType::double_t, ASTNodeDataType::vector_t) == ASTNodeDataType::vector_t); + } + + SECTION("getVectorDataType") + { + std::unique_ptr type_node = std::make_unique<ASTNode>(); + type_node->set_type<language::vector_type>(); + + type_node->emplace_back(std::make_unique<ASTNode>()); + + { + std::unique_ptr dimension_node = std::make_unique<ASTNode>(); + dimension_node->set_type<language::integer>(); + dimension_node->source = "17"; + auto& source = dimension_node->source; + dimension_node->m_begin = TAO_PEGTL_NAMESPACE::internal::iterator{&source[0]}; + dimension_node->m_end = TAO_PEGTL_NAMESPACE::internal::iterator{&source[source.size()]}; + type_node->emplace_back(std::move(dimension_node)); + } + + SECTION("good node") + { + REQUIRE(getVectorDataType(*type_node) == ASTNodeDataType::vector_t); + REQUIRE(getVectorDataType(*type_node).dimension() == 17); + } + + SECTION("bad node type") + { + type_node->set_type<language::integer>(); + REQUIRE_THROWS_WITH(getVectorDataType(*type_node), "unexpected node type"); + } + + SECTION("bad children size 1") + { + type_node->children.clear(); + REQUIRE_THROWS_WITH(getVectorDataType(*type_node), "unexpected node type"); + } + + SECTION("bad children size 1") + { + type_node->children.emplace_back(std::unique_ptr<ASTNode>()); + REQUIRE_THROWS_WITH(getVectorDataType(*type_node), "unexpected node type"); + } + + SECTION("bad dimension type") + { + type_node->children[1]->set_type<language::real>(); + REQUIRE_THROWS_WITH(getVectorDataType(*type_node), "unexpected non integer constant dimension"); + } } }