diff --git a/src/language/ASTNodeArraySubscriptExpressionBuilder.cpp b/src/language/ASTNodeArraySubscriptExpressionBuilder.cpp index fd214c54de37c58724d57b743357f57a989d3d11..1cdfb8354faa9c476e94fde4fb8228e3689a21a5 100644 --- a/src/language/ASTNodeArraySubscriptExpressionBuilder.cpp +++ b/src/language/ASTNodeArraySubscriptExpressionBuilder.cpp @@ -23,6 +23,7 @@ ASTNodeArraySubscriptExpressionBuilder::ASTNodeArraySubscriptExpressionBuilder(A break; } default: { + throw parse_error("unexpected error: invalid array dimension", array_expression.begin()); break; } } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index df7a0acfb120df2fb049e8312fb82680b1865b65..e973c87166171d1cabb6b45ebb30b2324ac4787f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -12,6 +12,7 @@ add_executable (unit_tests test_ASTModulesImporter.cpp test_ASTNode.cpp test_ASTNodeAffectationExpressionBuilder.cpp + test_ASTNodeArraySubscriptExpressionBuilder.cpp test_ASTNodeBinaryOperatorExpressionBuilder.cpp test_ASTNodeCFunctionExpressionBuilder.cpp test_ASTNodeDataType.cpp diff --git a/tests/test_ASTNodeArraySubscriptExpressionBuilder.cpp b/tests/test_ASTNodeArraySubscriptExpressionBuilder.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a3a27ad6728f22a9633ebfdbc0cd144373cac0ac --- /dev/null +++ b/tests/test_ASTNodeArraySubscriptExpressionBuilder.cpp @@ -0,0 +1,86 @@ +#include <catch2/catch.hpp> + +#include <ASTNodeArraySubscriptExpressionBuilder.hpp> + +#include <node_processor/ArraySubscriptProcessor.hpp> + +#include <ASTNode.hpp> +#include <PEGGrammar.hpp> + +TEST_CASE("ASTNodeArraySubscriptExpressionBuilder", "[language]") +{ + SECTION("R^d component access") + { + std::unique_ptr node = std::make_unique<ASTNode>(); + + SECTION("R^1") + { + { + std::unique_ptr array_node = std::make_unique<ASTNode>(); + array_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 1}; + node->emplace_back(std::move(array_node)); + } + REQUIRE_NOTHROW(ASTNodeArraySubscriptExpressionBuilder{*node}); + REQUIRE(bool{node->m_node_processor}); + REQUIRE(typeid(*node->m_node_processor).name() == typeid(ArraySubscriptProcessor<TinyVector<1>>).name()); + } + + SECTION("R^2") + { + { + std::unique_ptr array_node = std::make_unique<ASTNode>(); + array_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 2}; + node->emplace_back(std::move(array_node)); + } + REQUIRE_NOTHROW(ASTNodeArraySubscriptExpressionBuilder{*node}); + REQUIRE(bool{node->m_node_processor}); + REQUIRE(typeid(*node->m_node_processor).name() == typeid(ArraySubscriptProcessor<TinyVector<2>>).name()); + } + + SECTION("R^3") + { + { + std::unique_ptr array_node = std::make_unique<ASTNode>(); + array_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 3}; + node->emplace_back(std::move(array_node)); + } + REQUIRE_NOTHROW(ASTNodeArraySubscriptExpressionBuilder{*node}); + REQUIRE(bool{node->m_node_processor}); + REQUIRE(typeid(*node->m_node_processor).name() == typeid(ArraySubscriptProcessor<TinyVector<3>>).name()); + } + } + + SECTION("R^d component bad access") + { + std::unique_ptr node = std::make_unique<ASTNode>(); + + SECTION("R^d (d < 1)") + { + { + std::unique_ptr array_node = std::make_unique<ASTNode>(); + array_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 0}; + node->emplace_back(std::move(array_node)); + } + REQUIRE_THROWS_WITH(ASTNodeArraySubscriptExpressionBuilder{*node}, "unexpected error: invalid array dimension"); + } + SECTION("R^d (d > 3)") + { + { + std::unique_ptr array_node = std::make_unique<ASTNode>(); + array_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 4}; + node->emplace_back(std::move(array_node)); + } + REQUIRE_THROWS_WITH(ASTNodeArraySubscriptExpressionBuilder{*node}, "unexpected error: invalid array dimension"); + } + } + + SECTION("invalid array expression") + { + std::unique_ptr node = std::make_unique<ASTNode>(); + { + std::unique_ptr array_node = std::make_unique<ASTNode>(); + node->emplace_back(std::move(array_node)); + } + REQUIRE_THROWS_WITH(ASTNodeArraySubscriptExpressionBuilder{*node}, "unexpected error: invalid array type"); + } +}