Skip to content
Snippets Groups Projects
Commit f85684c2 authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Add test for DoWhileProcessor

parent e09ce6db
No related branches found
No related tags found
1 merge request!37Feature/language
......@@ -30,7 +30,7 @@ class DoWhileProcessor final : public INodeProcessor
if constexpr (std::is_arithmetic_v<T>) {
return value;
} else {
return false;
return false; // LCOV_EXCL_LINE (unreachable: only there for compilation purpose)
}
},
m_node.children[1]->m_value));
......
......@@ -30,6 +30,7 @@ add_executable (unit_tests
test_BiCGStab.cpp
test_ContinueProcessor.cpp
test_CRSMatrix.cpp
test_DoWhileProcessor.cpp
test_ExecUntilBreakOrContinue.cpp
test_FakeProcessor.cpp
test_ForProcessor.cpp
......
#include <catch2/catch.hpp>
#include <ASTNodeValueBuilder.hpp>
#include <ASTBuilder.hpp>
#include <ASTNodeDataTypeBuilder.hpp>
#include <ASTNodeDeclarationCleaner.hpp>
#include <ASTNodeDeclarationToAffectationConverter.hpp>
#include <ASTNodeExpressionBuilder.hpp>
#include <ASTNodeAffectationExpressionBuilder.hpp>
#include <ASTSymbolTableBuilder.hpp>
#include <ASTPrinter.hpp>
#include <Demangle.hpp>
#include <PEGGrammar.hpp>
#include <sstream>
#define CHECK_WHILE_PROCESSOR_RESULT(data, variable_name, expected_value) \
{ \
string_input input{data, "test.pgs"}; \
auto ast = ASTBuilder::build(input); \
\
ASTSymbolTableBuilder{*ast}; \
ASTNodeDataTypeBuilder{*ast}; \
ASTNodeValueBuilder{*ast}; \
\
ASTNodeDeclarationToAffectationConverter{*ast}; \
ASTNodeDeclarationCleaner{*ast}; \
\
ASTNodeExpressionBuilder{*ast}; \
ExecUntilBreakOrContinue exec_policy; \
ast->execute(exec_policy); \
\
auto symbol_table = ast->m_symbol_table; \
\
using namespace TAO_PEGTL_NAMESPACE; \
position use_position{internal::iterator{"fixture"}, "fixture"}; \
use_position.byte = 10000; \
auto [symbol, found] = symbol_table->find(variable_name, use_position); \
\
auto attribute = symbol->second; \
auto value = std::get<decltype(expected_value)>(attribute.value()); \
\
REQUIRE(value == expected_value); \
}
TEST_CASE("DoWhileProcessor", "[language]")
{
SECTION("simple loop")
{
std::string_view data = R"(
N i = 3;
N j = 0;
do {
j++;
i += j;
} while(i<10);
)";
CHECK_WHILE_PROCESSOR_RESULT(data, "i", 13ul);
}
SECTION("do-while with break")
{
std::string_view data = R"(
N i = 3;
N j = 0;
do {
j++;
if (j==2) break;
i += j;
} while(i<10);
)";
CHECK_WHILE_PROCESSOR_RESULT(data, "i", 4ul);
}
SECTION("do-while with continue")
{
std::string_view data = R"(
N i = 3;
N j = 0;
do {
j++;
if (j<=3) continue;
i += j;
} while(i<10);
)";
CHECK_WHILE_PROCESSOR_RESULT(data, "i", 12ul);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment