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); + } } }