diff --git a/tests/test_ASTSymbolInitializationChecker.cpp b/tests/test_ASTSymbolInitializationChecker.cpp index 0c71c3a693c18ad0e8611c1502368fcf757db897..8f05d87b8207bea795025d757063ae8a35b4f2b7 100644 --- a/tests/test_ASTSymbolInitializationChecker.cpp +++ b/tests/test_ASTSymbolInitializationChecker.cpp @@ -69,17 +69,54 @@ m = n; REQUIRE(not symbol_z->attributes().isInitialized()); } - SECTION("used uninitialized") + SECTION("Declarative initialization") { std::string_view data = R"( -N n; -N m = n; +let f: R->R, x->x+1; )"; string_input input{data, "test.pgs"}; auto ast = ASTBuilder::build(input); ASTSymbolTableBuilder{*ast}; - REQUIRE_THROWS_AS(ASTSymbolInitializationChecker{*ast}, parse_error); + ASTSymbolInitializationChecker{*ast}; + + position position{internal::iterator{"fixture"}, "fixture"}; + position.byte = data.size(); // ensure that variables are declared at this point + + auto [symbol_m, found_m] = ast->m_symbol_table->find("f", position); + REQUIRE(found_m); + REQUIRE(symbol_m->attributes().isInitialized()); + } + + SECTION("errors") + { + SECTION("used uninitialized") + { + std::string_view data = R"( +N n; +N m = n; +)"; + + string_input input{data, "test.pgs"}; + auto ast = ASTBuilder::build(input); + + ASTSymbolTableBuilder{*ast}; + REQUIRE_THROWS_AS(ASTSymbolInitializationChecker{*ast}, parse_error); + } + + SECTION("used uninitialized in function") + { + std::string_view data = R"( +R y; +let f : R->R, x->x+y; +)"; + + string_input input{data, "test.pgs"}; + auto ast = ASTBuilder::build(input); + + ASTSymbolTableBuilder{*ast}; + REQUIRE_THROWS_AS(ASTSymbolInitializationChecker{*ast}, parse_error); + } } }