diff --git a/tests/test_ASTSymbolInitializationChecker.cpp b/tests/test_ASTSymbolInitializationChecker.cpp index 8f05d87b8207bea795025d757063ae8a35b4f2b7..46c9add1f68ea285dd48fd11dace87fb955e5777 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'"}); } } }