diff --git a/tests/test_ASTNodeDataTypeBuilder.cpp b/tests/test_ASTNodeDataTypeBuilder.cpp
index 4729bdecfe1ca55863cdaf3ff9d026d5247d2e53..b0c23f29e3093f6a7e832b571d4401ef663c2f84 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);
+      }
     }
   }