Skip to content
Snippets Groups Projects
Commit 58359a2c authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Add missing tests regarding R^dxd

parent 708facd9
No related branches found
No related tags found
1 merge request!71Feature/language tiny matrices
......@@ -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");
}
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment