From 39c4ed0b4aa61056b7043db410ec9b8498261b09 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Fri, 10 Jan 2020 14:58:54 +0100
Subject: [PATCH] Add missing tests for ASTSymbolInitializationChecker

---
 tests/test_ASTSymbolInitializationChecker.cpp | 99 ++++++++++++++++++-
 1 file changed, 96 insertions(+), 3 deletions(-)

diff --git a/tests/test_ASTSymbolInitializationChecker.cpp b/tests/test_ASTSymbolInitializationChecker.cpp
index 8f05d87b8..46c9add1f 100644
--- a/tests/test_ASTSymbolInitializationChecker.cpp
+++ b/tests/test_ASTSymbolInitializationChecker.cpp
@@ -69,7 +69,7 @@ m = n;
     REQUIRE(not symbol_z->attributes().isInitialized());
   }
 
-  SECTION("Declarative initialization")
+  SECTION("Declarative function initialization")
   {
     std::string_view data = R"(
 let f: R->R, x->x+1;
@@ -89,6 +89,83 @@ let f: R->R, x->x+1;
     REQUIRE(symbol_m->attributes().isInitialized());
   }
 
+  SECTION("Lists")
+  {
+    SECTION("Declarative initialization")
+    {
+      std::string_view data = R"(
+R*R (x,y) = (2.3, 4.1);
+)";
+
+      string_input input{data, "test.pgs"};
+      auto ast = ASTBuilder::build(input);
+
+      ASTSymbolTableBuilder{*ast};
+      ASTSymbolInitializationChecker{*ast};
+
+      position position{internal::iterator{"fixture"}, "fixture"};
+      position.byte = data.size();   // ensure that variables are declared at this point
+
+      auto [symbol_x, found_x] = ast->m_symbol_table->find("x", position);
+      REQUIRE(found_x);
+      REQUIRE(symbol_x->attributes().isInitialized());
+
+      auto [symbol_y, found_y] = ast->m_symbol_table->find("y", position);
+      REQUIRE(found_y);
+      REQUIRE(symbol_y->attributes().isInitialized());
+    }
+
+    SECTION("Not initialized")
+    {
+      std::string_view data = R"(
+R*R (x,y);
+y = 3;
+)";
+
+      string_input input{data, "test.pgs"};
+      auto ast = ASTBuilder::build(input);
+
+      ASTSymbolTableBuilder{*ast};
+      ASTSymbolInitializationChecker{*ast};
+
+      position position{internal::iterator{"fixture"}, "fixture"};
+      position.byte = data.size();   // ensure that variables are declared at this point
+
+      auto [symbol_x, found_x] = ast->m_symbol_table->find("x", position);
+      REQUIRE(found_x);
+      REQUIRE(not symbol_x->attributes().isInitialized());
+
+      auto [symbol_y, found_y] = ast->m_symbol_table->find("y", position);
+      REQUIRE(found_y);
+      REQUIRE(symbol_y->attributes().isInitialized());
+    }
+
+    SECTION("Affectation")
+    {
+      std::string_view data = R"(
+R*R (x,y);
+(x,y) = (2.3, 4.1);
+)";
+
+      string_input input{data, "test.pgs"};
+      auto ast = ASTBuilder::build(input);
+
+      ASTSymbolTableBuilder{*ast};
+      ASTSymbolInitializationChecker{*ast};
+
+      position position{internal::iterator{"fixture"}, "fixture"};
+      position.byte = data.size();   // ensure that variables are declared at this point
+
+      auto [symbol_x, found_x] = ast->m_symbol_table->find("x", position);
+      REQUIRE(found_x);
+      REQUIRE(symbol_x->attributes().isInitialized());
+
+      auto [symbol_y, found_y] = ast->m_symbol_table->find("y", position);
+      REQUIRE(found_y);
+      REQUIRE(symbol_y->attributes().isInitialized());
+    }
+  }
+
   SECTION("errors")
   {
     SECTION("used uninitialized")
@@ -102,7 +179,23 @@ N m = n;
       auto ast = ASTBuilder::build(input);
 
       ASTSymbolTableBuilder{*ast};
-      REQUIRE_THROWS_AS(ASTSymbolInitializationChecker{*ast}, parse_error);
+      REQUIRE_THROWS_WITH(ASTSymbolInitializationChecker{*ast}, std::string{"uninitialized symbol 'n'"});
+    }
+
+    SECTION("used uninitialized in list affectation")
+    {
+      std::string_view data = R"(
+N k;
+N*R (l, x);
+
+(k, x) = (l, 3.2);
+)";
+
+      string_input input{data, "test.pgs"};
+      auto ast = ASTBuilder::build(input);
+
+      ASTSymbolTableBuilder{*ast};
+      REQUIRE_THROWS_WITH(ASTSymbolInitializationChecker{*ast}, std::string{"uninitialized symbol 'l'"});
     }
 
     SECTION("used uninitialized in function")
@@ -116,7 +209,7 @@ let f : R->R, x->x+y;
       auto ast = ASTBuilder::build(input);
 
       ASTSymbolTableBuilder{*ast};
-      REQUIRE_THROWS_AS(ASTSymbolInitializationChecker{*ast}, parse_error);
+      REQUIRE_THROWS_WITH(ASTSymbolInitializationChecker{*ast}, std::string{"uninitialized symbol 'y'"});
     }
   }
 }
-- 
GitLab