From 258dafc05f465b70a388bfada68456114f83e18d Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Mon, 28 Oct 2019 18:50:17 +0100
Subject: [PATCH] Add tests for ASTNodeFunctionEvaluationExpressionBuilder

---
 ...odeFunctionEvaluationExpressionBuilder.cpp |  2 +
 tests/CMakeLists.txt                          |  1 +
 ...odeFunctionEvaluationExpressionBuilder.cpp | 84 +++++++++++++++++++
 3 files changed, 87 insertions(+)
 create mode 100644 tests/test_ASTNodeFunctionEvaluationExpressionBuilder.cpp

diff --git a/src/language/ASTNodeFunctionEvaluationExpressionBuilder.cpp b/src/language/ASTNodeFunctionEvaluationExpressionBuilder.cpp
index fa4798b3d..6c3edadfb 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 34d0ec769..21f7c6223 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 000000000..cd9583f7a
--- /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);
+  }
+}
-- 
GitLab