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));
+      }
+    }
+  }
+}