From fbf7f3f85b86f065d4c171f8781beee5d9fffb44 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Mon, 21 Oct 2019 18:52:53 +0200
Subject: [PATCH] Add few tests w.r.t. data type builder of function
 declarations

---
 tests/test_ASTNodeDataTypeBuilder.cpp | 152 +++++++++++++++++++++++---
 1 file changed, 139 insertions(+), 13 deletions(-)

diff --git a/tests/test_ASTNodeDataTypeBuilder.cpp b/tests/test_ASTNodeDataTypeBuilder.cpp
index 4729bdecf..b0c23f29e 100644
--- a/tests/test_ASTNodeDataTypeBuilder.cpp
+++ b/tests/test_ASTNodeDataTypeBuilder.cpp
@@ -117,37 +117,163 @@ false;
 
   SECTION("let declaration")
   {
-    SECTION("scalar functions")
+    SECTION("R-functions")
     {
-      std::string_view data = R"(
+      SECTION("multiple variable")
+      {
+        std::string_view data = R"(
+let substract : R*R -> R, (x,y) -> x-y;
+)";
+
+        std::string_view result = R"(
+(root:void)
+ `-(language::let_declaration:void)
+     `-(language::name:substract:function)
+)";
+
+        CHECK_AST(data, result);
+      }
+
+      SECTION("name -> expression")
+      {
+        std::string_view data = R"(
 let f : R -> R, x -> x;
-let g : R*R -> R, (x,y) -> x+y;
 )";
 
-      std::string_view result = R"(
+        std::string_view result = R"(
 (root:void)
- +-(language::let_declaration:void)
- |   `-(language::name:f:function)
  `-(language::let_declaration:void)
-     `-(language::name:g:function)
+     `-(language::name:f:function)
 )";
 
-      CHECK_AST(data, result);
+        CHECK_AST(data, result);
+      }
+
+      SECTION("name list -> expression")
+      {
+        std::string_view data = R"(
+let f : R -> R, (x) -> (x+2)/2;
+)";
+
+        std::string_view result = R"(
+(root:void)
+ `-(language::let_declaration:void)
+     `-(language::name:f:function)
+)";
+
+        CHECK_AST(data, result);
+      }
+
+      SECTION("name -> expression list")
+      {
+        std::string_view data = R"(
+let f : R -> R, x -> (x*x);
+)";
+
+        std::string_view result = R"(
+(root:void)
+ `-(language::let_declaration:void)
+     `-(language::name:f:function)
+)";
+
+        CHECK_AST(data, result);
+      }
+
+      SECTION("name list -> expression list")
+      {
+        std::string_view data = R"(
+let f : R -> R, (x) -> (x+1);
+)";
+
+        std::string_view result = R"(
+(root:void)
+ `-(language::let_declaration:void)
+     `-(language::name:f:function)
+)";
+
+        CHECK_AST(data, result);
+      }
     }
 
-    SECTION("scalar functions")
+    SECTION("Z-functions")
     {
-      std::string_view data = R"(
-let f : R -> R, (x) -> x;
+      SECTION("name -> expression")
+      {
+        std::string_view data = R"(
+let f : Z -> Z, z -> z-1;
 )";
 
-      std::string_view result = R"(
+        std::string_view result = R"(
 (root:void)
  `-(language::let_declaration:void)
      `-(language::name:f:function)
 )";
 
-      CHECK_AST(data, result);
+        CHECK_AST(data, result);
+      }
+    }
+
+    SECTION("N-functions")
+    {
+      SECTION("name -> expression")
+      {
+        std::string_view data = R"(
+let f : N -> N, x -> (x+1)/2;
+)";
+
+        std::string_view result = R"(
+(root:void)
+ `-(language::let_declaration:void)
+     `-(language::name:f:function)
+)";
+
+        CHECK_AST(data, result);
+      }
+    }
+
+    SECTION("B-functions")
+    {
+      SECTION("name -> expression")
+      {
+        std::string_view data = R"(
+let f : N*B -> B, (n,b) -> (n>3) and b;
+)";
+
+        std::string_view result = R"(
+(root:void)
+ `-(language::let_declaration:void)
+     `-(language::name:f:function)
+)";
+
+        CHECK_AST(data, result);
+      }
+    }
+
+    SECTION("errors")
+    {
+      SECTION("wring parameter number")
+      {
+        std::string_view data = R"(
+let f : R*Z -> B, x -> 3;
+)";
+        string_input input{data, "test.pgs"};
+        auto ast = ASTBuilder::build(input);
+        ASTSymbolTableBuilder{*ast};
+
+        REQUIRE_THROWS_AS(ASTNodeDataTypeBuilder{*ast}, parse_error);
+      }
+
+      SECTION("wring parameter number 2")
+      {
+        std::string_view data = R"(
+let f : R -> B, (x,y) -> 3;
+)";
+        string_input input{data, "test.pgs"};
+        auto ast = ASTBuilder::build(input);
+        ASTSymbolTableBuilder{*ast};
+
+        REQUIRE_THROWS_AS(ASTNodeDataTypeBuilder{*ast}, parse_error);
+      }
     }
   }
 
-- 
GitLab