From 58359a2c44790ce4d07a8e599c40f25da7739073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com> Date: Wed, 25 Nov 2020 16:42:39 +0100 Subject: [PATCH] Add missing tests regarding R^dxd --- tests/test_ASTNodeDataTypeBuilder.cpp | 185 ++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) diff --git a/tests/test_ASTNodeDataTypeBuilder.cpp b/tests/test_ASTNodeDataTypeBuilder.cpp index f12e31ab4..369374986 100644 --- a/tests/test_ASTNodeDataTypeBuilder.cpp +++ b/tests/test_ASTNodeDataTypeBuilder.cpp @@ -308,6 +308,45 @@ let x : R; x[2]; REQUIRE_THROWS_WITH(ASTNodeDataTypeBuilder{*ast}, "invalid subscript expression: R cannot be indexed"); } + SECTION("invalid R^d subscript index list") + { + std::string_view data = R"( +let x : R^2; x[2,2]; +)"; + + string_input input{data, "test.pgs"}; + auto ast = ASTBuilder::build(input); + ASTSymbolTableBuilder{*ast}; + + REQUIRE_THROWS_WITH(ASTNodeDataTypeBuilder{*ast}, "invalid index type: R^2 requires a single integer"); + } + + SECTION("invalid R^dxd subscript index list 1") + { + std::string_view data = R"( +let x : R^2x2; x[2]; +)"; + + string_input input{data, "test.pgs"}; + auto ast = ASTBuilder::build(input); + ASTSymbolTableBuilder{*ast}; + + REQUIRE_THROWS_WITH(ASTNodeDataTypeBuilder{*ast}, "invalid index type: R^2x2 requires two integers"); + } + + SECTION("invalid R^dxd subscript index list 2") + { + std::string_view data = R"( +let x : R^2x2; x[2,3,1]; +)"; + + string_input input{data, "test.pgs"}; + auto ast = ASTBuilder::build(input); + ASTSymbolTableBuilder{*ast}; + + REQUIRE_THROWS_WITH(ASTNodeDataTypeBuilder{*ast}, "invalid index type: R^2x2 requires two integers"); + } + SECTION("too many variables") { std::string_view data = R"( @@ -510,6 +549,61 @@ let t2 : (R^3), t2 = (0, 0); CHECK_AST(data, result); } + SECTION("R^dxd tuples") + { + std::string_view data = R"( +let a : R^2x2, a = (2, 3.1, -1.2, 4); +let t1 : (R^2x2), t1 = (a, (1,2,1,3), 0); +let t2 : (R^3x3), t2 = (0, 0); +)"; + + std::string_view result = R"( +(root:void) + +-(language::var_declaration:void) + | +-(language::name:a:R^2x2) + | +-(language::matrix_type:typename(R^2x2)) + | | +-(language::R_set:typename(R)) + | | +-(language::integer:2:Z) + | | `-(language::integer:2:Z) + | +-(language::name:a:R^2x2) + | `-(language::expression_list:list(Z*R*R*Z)) + | +-(language::integer:2:Z) + | +-(language::real:3.1:R) + | +-(language::unary_minus:R) + | | `-(language::real:1.2:R) + | `-(language::integer:4:Z) + +-(language::var_declaration:void) + | +-(language::name:t1:tuple(R^2x2)) + | +-(language::tuple_type_specifier:typename(tuple(R^2x2))) + | | `-(language::matrix_type:typename(R^2x2)) + | | +-(language::R_set:typename(R)) + | | +-(language::integer:2:Z) + | | `-(language::integer:2:Z) + | +-(language::name:t1:tuple(R^2x2)) + | `-(language::expression_list:list(R^2x2*list(Z*Z*Z*Z)*Z)) + | +-(language::name:a:R^2x2) + | +-(language::tuple_expression:list(Z*Z*Z*Z)) + | | +-(language::integer:1:Z) + | | +-(language::integer:2:Z) + | | +-(language::integer:1:Z) + | | `-(language::integer:3:Z) + | `-(language::integer:0:Z) + `-(language::var_declaration:void) + +-(language::name:t2:tuple(R^3x3)) + +-(language::tuple_type_specifier:typename(tuple(R^3x3))) + | `-(language::matrix_type:typename(R^3x3)) + | +-(language::R_set:typename(R)) + | +-(language::integer:3:Z) + | `-(language::integer:3:Z) + +-(language::name:t2:tuple(R^3x3)) + `-(language::expression_list:list(Z*Z)) + +-(language::integer:0:Z) + `-(language::integer:0:Z) +)"; + + CHECK_AST(data, result); + } + SECTION("string tuples") { std::string_view data = R"( @@ -647,6 +741,84 @@ let square : R -> R^2, x -> (x, x*x); } } + SECTION("R^dxd-functions") + { + SECTION("matrix function") + { + std::string_view data = R"( +let double : R^2x2 -> R^2x2, x -> 2*x; +)"; + + std::string_view result = R"( +(root:void) + `-(language::fct_declaration:void) + `-(language::name:double:function) +)"; + + CHECK_AST(data, result); + } + + SECTION("matrix vector product") + { + std::string_view data = R"( +let prod : R^2x2*R^2 -> R^2, (A,x) -> A*x; +)"; + + std::string_view result = R"( +(root:void) + `-(language::fct_declaration:void) + `-(language::name:prod:function) +)"; + + CHECK_AST(data, result); + } + + SECTION("matrix function") + { + std::string_view data = R"( +let det : R^2x2 -> R, x -> x[0,0]*x[1,1]-x[1,0]*x[0,1]; +)"; + + std::string_view result = R"( +(root:void) + `-(language::fct_declaration:void) + `-(language::name:det:function) +)"; + + CHECK_AST(data, result); + } + + SECTION("R-list -> R^dxd") + { + std::string_view data = R"( +let f : R -> R^2x2, x -> (x, x*x, 2-x, 0); +)"; + + std::string_view result = R"( +(root:void) + `-(language::fct_declaration:void) + `-(language::name:f:function) +)"; + + CHECK_AST(data, result); + } + + SECTION("R^d*R^d -> R^dxd") + { + std::string_view data = R"( +let f : R^2*R^2 -> R^2x2, (x,y) -> (x[0], y[0], x[1], y[1]); +)"; + + std::string_view result = R"( +(root:void) + `-(language::fct_declaration:void) + `-(language::name:f:function) +)"; + + CHECK_AST(data, result); + } + } + SECTION("R-functions") { SECTION("multiple variable") @@ -866,6 +1038,19 @@ let f : R -> R*R, x -> x*x*x; REQUIRE_THROWS_WITH(ASTNodeDataTypeBuilder{*ast}, "number of image spaces (2) R*R differs from number of expressions (1) x*x*x"); } + + SECTION("wrong image size 3") + { + std::string_view data = R"( +let f : R -> R^2x2, x -> (x, 2*x, 2); +)"; + string_input input{data, "test.pgs"}; + auto ast = ASTBuilder::build(input); + ASTSymbolTableBuilder{*ast}; + + REQUIRE_THROWS_WITH(ASTNodeDataTypeBuilder{*ast}, + "expecting 4 scalar expressions or an R^2x2, found 3 scalar expressions"); + } } } -- GitLab