diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 05ddfa76c1721fea5931f1bf1f0a59f7a7dc0eec..4eff7bbdfa88c402b238c94acddb1ab8e80002ae 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -44,6 +44,7 @@ add_executable (unit_tests test_BinaryExpressionProcessor_comparison.cpp test_BinaryExpressionProcessor_equality.cpp test_BinaryExpressionProcessor_logic.cpp + test_BinaryExpressionProcessor_raw.cpp test_BinaryExpressionProcessor_shift.cpp test_BinaryOperatorMangler.cpp test_BiCGStab.cpp diff --git a/tests/test_BinaryExpressionProcessor_raw.cpp b/tests/test_BinaryExpressionProcessor_raw.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c115c67ca070c0610e5225c022fc527e4cff8a1a --- /dev/null +++ b/tests/test_BinaryExpressionProcessor_raw.cpp @@ -0,0 +1,86 @@ +#include <catch2/catch_test_macros.hpp> +#include <catch2/matchers/catch_matchers_all.hpp> + +#include <language/node_processor/BinaryExpressionProcessor.hpp> +#include <language/utils/OFStream.hpp> + +// clazy:excludeall=non-pod-global-static + +TEST_CASE("BinaryExpressionProcessor raw operators", "[language]") +{ + REQUIRE(BinOp<language::and_op>{}.eval(true, true) == true); + REQUIRE(BinOp<language::and_op>{}.eval(true, false) == false); + REQUIRE(BinOp<language::and_op>{}.eval(false, true) == false); + REQUIRE(BinOp<language::and_op>{}.eval(false, false) == false); + + REQUIRE(BinOp<language::or_op>{}.eval(true, true) == true); + REQUIRE(BinOp<language::or_op>{}.eval(true, false) == true); + REQUIRE(BinOp<language::or_op>{}.eval(false, true) == true); + REQUIRE(BinOp<language::or_op>{}.eval(false, false) == false); + + REQUIRE(BinOp<language::xor_op>{}.eval(true, true) == false); + REQUIRE(BinOp<language::xor_op>{}.eval(true, false) == true); + REQUIRE(BinOp<language::xor_op>{}.eval(false, true) == true); + REQUIRE(BinOp<language::xor_op>{}.eval(false, false) == false); + + REQUIRE(BinOp<language::eqeq_op>{}.eval(3, 3) == true); + REQUIRE(BinOp<language::eqeq_op>{}.eval(2, 3) == false); + + REQUIRE(BinOp<language::not_eq_op>{}.eval(3, 3) == false); + REQUIRE(BinOp<language::not_eq_op>{}.eval(2, 3) == true); + + REQUIRE(BinOp<language::lesser_op>{}.eval(2.9, 3) == true); + REQUIRE(BinOp<language::lesser_op>{}.eval(3, 3) == false); + REQUIRE(BinOp<language::lesser_op>{}.eval(3.1, 3) == false); + + REQUIRE(BinOp<language::lesser_or_eq_op>{}.eval(2.9, 3) == true); + REQUIRE(BinOp<language::lesser_or_eq_op>{}.eval(3, 3) == true); + REQUIRE(BinOp<language::lesser_or_eq_op>{}.eval(3.1, 3) == false); + + REQUIRE(BinOp<language::greater_op>{}.eval(2.9, 3) == false); + REQUIRE(BinOp<language::greater_op>{}.eval(3, 3) == false); + REQUIRE(BinOp<language::greater_op>{}.eval(3.1, 3) == true); + + REQUIRE(BinOp<language::greater_or_eq_op>{}.eval(2.9, 3) == false); + REQUIRE(BinOp<language::greater_or_eq_op>{}.eval(3, 3) == true); + REQUIRE(BinOp<language::greater_or_eq_op>{}.eval(3.1, 3) == true); + + REQUIRE(BinOp<language::plus_op>{}.eval(2.9, 3) == (2.9 + 3)); + REQUIRE(BinOp<language::minus_op>{}.eval(2.9, 3) == (2.9 - 3)); + REQUIRE(BinOp<language::multiply_op>{}.eval(2.9, 3) == (2.9 * 3)); + REQUIRE(BinOp<language::divide_op>{}.eval(2.9, 3) == (2.9 / 3)); + + { + std::filesystem::path path = std::filesystem::temp_directory_path(); + path.append(std::string{"binary_expression_processor_shift_left_"} + std::to_string(getpid())); + + std::string filename = path.string(); + + std::shared_ptr<const OStream> p_fout = std::make_shared<OFStream>(filename); + BinOp<language::shift_left_op>{}.eval(p_fout, true); + BinOp<language::shift_left_op>{}.eval(p_fout, std::string{" bar\n"}); + p_fout.reset(); + + REQUIRE(std::filesystem::exists(filename)); + + { + std::string file_content; + std::ifstream fin(filename.c_str()); + + do { + char c = fin.get(); + if (c != EOF) { + file_content += c; + } + } while (fin); + + REQUIRE(file_content == "true bar\n"); + } + + std::filesystem::remove(filename); + REQUIRE(not std::filesystem::exists(filename)); + } + + REQUIRE(BinOp<language::shift_left_op>{}.eval(3, 2) == (3 << 2)); + REQUIRE(BinOp<language::shift_right_op>{}.eval(17, 2) == (17 >> 2)); +}