From 98ae99995e33cf49af3f5be7a53aa4147c48cd85 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Tue, 27 Jul 2021 12:45:12 +0200
Subject: [PATCH] Add missing tests for ASTNodeBuiltinFunctionExpressionBuilder

Also remove the treatment of tuple of function arguments, since this
kind of argument cannot be defined in the language (by now?).
---
 ...STNodeBuiltinFunctionExpressionBuilder.cpp |  7 ++--
 ...STNodeBuiltinFunctionExpressionBuilder.cpp | 36 +++++++++++++++++++
 tests/test_BuiltinFunctionRegister.hpp        |  5 +++
 3 files changed, 44 insertions(+), 4 deletions(-)

diff --git a/src/language/ast/ASTNodeBuiltinFunctionExpressionBuilder.cpp b/src/language/ast/ASTNodeBuiltinFunctionExpressionBuilder.cpp
index 70d8e3b3a..54b0970ef 100644
--- a/src/language/ast/ASTNodeBuiltinFunctionExpressionBuilder.cpp
+++ b/src/language/ast/ASTNodeBuiltinFunctionExpressionBuilder.cpp
@@ -231,9 +231,6 @@ ASTNodeBuiltinFunctionExpressionBuilder::_getArgumentConverter(const ASTNodeData
       }
       case ASTNodeDataType::double_t: {
         return std::make_unique<FunctionTupleArgumentConverter<ParameterContentT, double>>(argument_number);
-      }
-      case ASTNodeDataType::function_t: {
-        return std::make_unique<FunctionTupleArgumentConverter<ParameterContentT, FunctionSymbolId>>(argument_number);
       }
         // LCOV_EXCL_START
       default: {
@@ -513,11 +510,13 @@ ASTNodeBuiltinFunctionExpressionBuilder::_buildArgumentProcessors(
   const size_t parameters_number = parameter_type_list.size();
 
   if (arguments_number != parameters_number) {
+    // LCOV_EXCL_START
     std::ostringstream error_message;
     error_message << "bad number of arguments: expecting " << rang::fgB::yellow << parameters_number
                   << rang::style::reset << rang::style::bold << ", provided " << rang::fgB::yellow << arguments_number
                   << rang::style::reset;
-    throw ParseError(error_message.str(), argument_nodes.begin());
+    throw UnexpectedError(error_message.str());
+    // LCOV_EXCL_STOP
   }
 
   for (size_t i = 0; i < arguments_number; ++i) {
diff --git a/tests/test_ASTNodeBuiltinFunctionExpressionBuilder.cpp b/tests/test_ASTNodeBuiltinFunctionExpressionBuilder.cpp
index d7cd62afe..7fb68cd69 100644
--- a/tests/test_ASTNodeBuiltinFunctionExpressionBuilder.cpp
+++ b/tests/test_ASTNodeBuiltinFunctionExpressionBuilder.cpp
@@ -1664,6 +1664,42 @@ fidToR(f);
 
       CHECK_AST(data, result);
     }
+
+    SECTION("tuple(FunctionSymbolId) -> R")
+    {
+      std::string_view data = R"(
+let f : R^3 -> R, x -> 0;
+fidTupleToR((f,f));
+)";
+
+      std::string_view result = R"(
+(root:ASTNodeListProcessor)
+ `-(language::function_evaluation:BuiltinFunctionProcessor)
+     +-(language::name:fidTupleToR:FakeProcessor)
+     `-(language::tuple_expression:TupleToVectorProcessor<ASTNodeExpressionListProcessor>)
+         +-(language::name:f:NameProcessor)
+         `-(language::name:f:NameProcessor)
+)";
+
+      CHECK_AST(data, result);
+    }
+
+    SECTION("tuple(FunctionSymbolId) -> R  [with single value tuple]")
+    {
+      std::string_view data = R"(
+let f : R^3 -> R, x -> 0;
+fidTupleToR(f);
+)";
+
+      std::string_view result = R"(
+(root:ASTNodeListProcessor)
+ `-(language::function_evaluation:BuiltinFunctionProcessor)
+     +-(language::name:fidTupleToR:FakeProcessor)
+     `-(language::name:f:NameProcessor)
+)";
+
+      CHECK_AST(data, result);
+    }
   }
 
   SECTION("errors")
diff --git a/tests/test_BuiltinFunctionRegister.hpp b/tests/test_BuiltinFunctionRegister.hpp
index 7c361c9df..0ac5226fc 100644
--- a/tests/test_BuiltinFunctionRegister.hpp
+++ b/tests/test_BuiltinFunctionRegister.hpp
@@ -100,6 +100,11 @@ class test_BuiltinFunctionRegister
       std::make_pair("fidToR:function", std::make_shared<BuiltinFunctionEmbedder<double(const FunctionSymbolId&)>>(
                                           [](const FunctionSymbolId&) -> double { return 0; })));
 
+    m_name_builtin_function_map.insert(
+      std::make_pair("fidTupleToR:(function...)",
+                     std::make_shared<BuiltinFunctionEmbedder<double(const std::vector<FunctionSymbolId>)>>(
+                       [](const std::vector<FunctionSymbolId>&) -> double { return 0; })));
+
     m_name_builtin_function_map.insert(
       std::make_pair("builtinToBuiltin:builtin_t",
                      std::make_shared<
-- 
GitLab