diff --git a/src/language/ASTNodeFunctionEvaluationExpressionBuilder.cpp b/src/language/ASTNodeFunctionEvaluationExpressionBuilder.cpp index fa4798b3d3715f09eb3d0d050e09c820748cdb9d..6c3edadfb7d3c31fbb1a4cfe8bebd34a00ea9ce5 100644 --- a/src/language/ASTNodeFunctionEvaluationExpressionBuilder.cpp +++ b/src/language/ASTNodeFunctionEvaluationExpressionBuilder.cpp @@ -19,8 +19,10 @@ ASTNodeFunctionEvaluationExpressionBuilder::ASTNodeFunctionEvaluationExpressionB ASTNodeCFunctionExpressionBuilder{node}; break; } + // LCOV_EXCL_START default: { throw parse_error("unexpected function type", node.begin()); } + // LCOV_EXCL_STOP } } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 34d0ec7692e5e7ad71dbcb0b0774563018a75f3b..21f7c62236482c6cb033dbfe717f86b486df5f45 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -18,6 +18,7 @@ add_executable (unit_tests test_ASTNodeDataTypeChecker.cpp test_ASTNodeDeclarationToAffectationConverter.cpp test_ASTNodeExpressionBuilder.cpp + test_ASTNodeFunctionEvaluationExpressionBuilder.cpp test_ASTNodeIncDecExpressionBuilder.cpp test_ASTNodeJumpPlacementChecker.cpp test_ASTNodeListProcessor.cpp diff --git a/tests/test_ASTNodeFunctionEvaluationExpressionBuilder.cpp b/tests/test_ASTNodeFunctionEvaluationExpressionBuilder.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cd9583f7a4ba912f3633de7dd874bbdd6f33f9d5 --- /dev/null +++ b/tests/test_ASTNodeFunctionEvaluationExpressionBuilder.cpp @@ -0,0 +1,84 @@ +#include <catch2/catch.hpp> + +#include <ASTNodeValueBuilder.hpp> + +#include <ASTBuilder.hpp> +#include <ASTNodeDataTypeBuilder.hpp> + +#include <ASTModulesImporter.hpp> + +#include <ASTNodeExpressionBuilder.hpp> +#include <ASTNodeFunctionEvaluationExpressionBuilder.hpp> +#include <ASTNodeTypeCleaner.hpp> + +#include <ASTSymbolTableBuilder.hpp> + +#include <ASTPrinter.hpp> + +#include <PEGGrammar.hpp> + +#include <Demangle.hpp> + +#define CHECK_AST(data, expected_output) \ + { \ + static_assert(std::is_same_v<std::decay_t<decltype(data)>, std::string_view>); \ + static_assert((std::is_same_v<std::decay_t<decltype(expected_output)>, std::string_view>) or \ + (std::is_same_v<std::decay_t<decltype(expected_output)>, std::string>)); \ + \ + string_input input{data, "test.pgs"}; \ + auto ast = ASTBuilder::build(input); \ + \ + ASTModulesImporter{*ast}; \ + ASTNodeTypeCleaner<language::import_instruction>{*ast}; \ + \ + ASTSymbolTableBuilder{*ast}; \ + ASTNodeDataTypeBuilder{*ast}; \ + ASTNodeValueBuilder{*ast}; \ + \ + ASTNodeTypeCleaner<language::let_declaration>{*ast}; \ + \ + ASTNodeExpressionBuilder{*ast}; \ + std::stringstream ast_output; \ + ast_output << '\n' << ASTPrinter{*ast, ASTPrinter::Format::raw, {ASTPrinter::Info::exec_type}}; \ + \ + REQUIRE(ast_output.str() == expected_output); \ + } + +TEST_CASE("ASTNodeFunctionEvaluationExpressionBuilder", "[language]") +{ + SECTION("C function evaluation") + { + std::string_view data = R"( +import math; +sin(3); +)"; + + std::string_view result = R"( +(root:ASTNodeListProcessor) + `-(language::function_evaluation:CFunctionProcessor) + +-(language::name:sin:NameProcessor) + `-(language::integer:3:FakeProcessor) +)"; + + CHECK_AST(data, result); + } + + SECTION("function evaluation") + { + std::string_view data = R"( +let sum : R*R -> R, (x,y) -> x+y; +sum(1,2); +)"; + + std::string_view result = R"( +(root:ASTNodeListProcessor) + `-(language::function_evaluation:FunctionProcessor) + +-(language::name:sum:NameProcessor) + `-(language::function_argument_list:FakeProcessor) + +-(language::integer:1:FakeProcessor) + `-(language::integer:2:FakeProcessor) +)"; + + CHECK_AST(data, result); + } +}