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
Branches
Tags
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 to comment