diff --git a/tests/test_OStreamProcessor.cpp b/tests/test_OStreamProcessor.cpp index 2c2dec499ded521a58780f125d965d2361c51bbc..a88662b1a00f0dfaf4977da9a79b7d44dd2405f1 100644 --- a/tests/test_OStreamProcessor.cpp +++ b/tests/test_OStreamProcessor.cpp @@ -47,6 +47,25 @@ _replaceOStream(ASTNode& node, std::ostringstream& sout) REQUIRE(sout.str() == expected_value); \ } +#define CHECK_OSTREAM_EXPRESSION_THROWS(data, expected_error) \ + { \ + static_assert(std::is_same_v<std::decay_t<decltype(data)>, std::string_view>); \ + static_assert((std::is_same_v<std::decay_t<decltype(expected_error)>, std::string_view>) or \ + (std::is_same_v<std::decay_t<decltype(expected_error)>, std::string>)); \ + \ + string_input input{data, "test.pgs"}; \ + auto ast = ASTBuilder::build(input); \ + \ + ASTSymbolTableBuilder{*ast}; \ + ASTNodeDataTypeBuilder{*ast}; \ + \ + ASTNodeDeclarationToAffectationConverter{*ast}; \ + ASTNodeTypeCleaner<language::var_declaration>{*ast}; \ + ASTNodeTypeCleaner<language::fct_declaration>{*ast}; \ + \ + REQUIRE_THROWS_WITH(ASTNodeExpressionBuilder{*ast}, expected_error); \ + } + // clazy:excludeall=non-pod-global-static TEST_CASE("OStreamProcessor", "[language]") @@ -66,4 +85,15 @@ TEST_CASE("OStreamProcessor", "[language]") CHECK_OSTREAM_EXPRESSION_RESULT(R"(cerr << false;)", "false"); CHECK_OSTREAM_EXPRESSION_RESULT(R"(cerr << "x=" << 2 << "\n";)", "x=2\n"); } + + SECTION("runtime error") + { + std::string_view data_type = R"( +let f : R -> R, x -> 2; +cerr << "f=" << f << "\n"; +)"; + + std::string error_msg = "invalid argument, cannot print a 'function'"; + CHECK_OSTREAM_EXPRESSION_THROWS(data_type, error_msg); + } }