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