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