diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 2dd4c589d6772e1eb9067a062b6a6ebeac9a4fcb..19da37a168fdeda6f87010f633d8bc29dd53bc8a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -27,6 +27,7 @@ add_executable (unit_tests test_ASTSymbolTableBuilder.cpp test_ASTSymbolInitializationChecker.cpp test_BreakProcessor.cpp + test_BinaryExpressionProcessor.cpp test_BiCGStab.cpp test_ContinueProcessor.cpp test_ConcatExpressionProcessor.cpp diff --git a/tests/test_BinaryExpressionProcessor.cpp b/tests/test_BinaryExpressionProcessor.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7919bf7d3c5d08e948e452711e7aa758f18ecb2a --- /dev/null +++ b/tests/test_BinaryExpressionProcessor.cpp @@ -0,0 +1,204 @@ +#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_BINARY_EXPRESSION_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("BinaryExpressionProcessor", "[language]") +{ + SECTION("arithmetic operators") + { + SECTION("+") + { + SECTION("lhs is B") + { + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = true + true;)", "z", 2l); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = true + 1;)", "n", 2ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = true + 1;)", "n", 2ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = false + 1;)", "n", 1ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = true + 3;)", "z", 4l); + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = false + 3;)", "z", 3l); + CHECK_BINARY_EXPRESSION_RESULT(R"(R r = false + 3.6;)", "r", 3.6); + CHECK_BINARY_EXPRESSION_RESULT(R"(R s = -3.3; R r = true + s;)", "r", -2.3); + } + + SECTION("lhs is N") + { + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = n + true;)", "n", 2ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; n = n + m;)", "n", 6ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = -1; n = n + z;)", "n", 3ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1 + 2.3;)", "n", 3ul); + } + + SECTION("lhs is Z") + { + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = -1 + true;)", "z", 0l); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = -3 + n;)", "z", 1l); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; Z z = -3 + n;)", "z", -1l); + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 1 + 2;)", "z", 3l); + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 3 + 2.5;)", "z", 5l); + } + + SECTION("lhs is R") + { + CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 + true;)", "r", (-1.2 + true)); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; R r = -1.2 + n;)", "r", (-1.2 + uint64_t{2})); + CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 + 1;)", "r", (-1.2 + 1)); + CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 + 2.3;)", "r", (-1.2 + 2.3)); + } + } + + SECTION("-") + { + SECTION("lhs is B") + { + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = true - false;)", "n", 1ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 1; n = true - n;)", "n", 0ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = false - 1;)", "z", -1l); + CHECK_BINARY_EXPRESSION_RESULT(R"(R r = true - 1.2;)", "r", (true - 1.2)); + } + + SECTION("lhs is N") + { + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; n = n - true;)", "n", 2ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; n = n - m;)", "n", 2ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 5; n = n - 4;)", "n", 1ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3 - 2.3;)", "n", 0ul); + } + + SECTION("lhs is Z") + { + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = -1 - true;)", "z", -2l); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = 3 - n;)", "z", -1l); + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 7 - 2;)", "z", 5l); + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 4 - 2.5;)", "z", 1l); + } + + SECTION("lhs is R") + { + CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 - true;)", "r", (-1.2 - true)); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; R r = -1.2 - n;)", "r", (-1.2 - uint64_t{2})); + CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 - 1;)", "r", (-1.2 - 1)); + CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 - 2.3;)", "r", (-1.2 - 2.3)); + } + } + + SECTION("*") + { + SECTION("lhs is B") + { + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = true * false;)", "n", 0ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; n = true * n;)", "n", 2ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = false * 1;)", "z", 0l); + CHECK_BINARY_EXPRESSION_RESULT(R"(R r = true * 1.2;)", "r", (true * 1.2)); + } + + SECTION("lhs is N") + { + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; n = n * true;)", "n", 3ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; n = n * m;)", "n", 8ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 5; n = n * 4;)", "n", 20ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3 * 2.3;)", "n", 6ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3 * 2.5;)", "n", 7ul); + } + + SECTION("lhs is Z") + { + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = -1 * true;)", "z", -1l); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = 3 * n;)", "z", 12l); + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 7 * 2;)", "z", 14l); + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 4 * 2.4;)", "z", 9l); + } + + SECTION("lhs is R") + { + CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 * true;)", "r", (-1.2 * true)); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; R r = -1.2 * n;)", "r", (-1.2 * uint64_t{2})); + CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 * 11;)", "r", (-1.2 * 11)); + CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 * 2.3;)", "r", (-1.2 * 2.3)); + } + } + + SECTION("/") + { + SECTION("lhs is B") + { + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = false / true;)", "n", 0ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; n = true / n;)", "n", 0ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = false / 1;)", "z", 0l); + CHECK_BINARY_EXPRESSION_RESULT(R"(R r = true / 1.2;)", "r", (true / 1.2)); + } + + SECTION("lhs is N") + { + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3; n = n / true;)", "n", 3ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; N m = 2; n = n / m;)", "n", 2ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 5; n = n / 4;)", "n", 1ul); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 3 / 2.3;)", "n", 1ul); + } + + SECTION("lhs is Z") + { + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = -1 / true;)", "z", -1l); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 4; Z z = 3 / n;)", "z", 0l); + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 7 / 2;)", "z", 3l); + CHECK_BINARY_EXPRESSION_RESULT(R"(Z z = 4 / 2.4;)", "z", 1l); + } + + SECTION("lhs is R") + { + CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 / true;)", "r", (-1.2 / true)); + CHECK_BINARY_EXPRESSION_RESULT(R"(N n = 2; R r = -1.2 / n;)", "r", (-1.2 / uint64_t{2})); + CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 / 11;)", "r", (-1.2 / 11)); + CHECK_BINARY_EXPRESSION_RESULT(R"(R r = -1.2 / 2.3;)", "r", (-1.2 / 2.3)); + } + } + } +}