diff --git a/src/language/ASTNodeNaturalConversionChecker.cpp b/src/language/ASTNodeNaturalConversionChecker.cpp
index f7c5fa95e48fa17bc1bd63e6a129c88813fe63ee..d0a5a5406d66b2982dc819e05eface3ef52a88d0 100644
--- a/src/language/ASTNodeNaturalConversionChecker.cpp
+++ b/src/language/ASTNodeNaturalConversionChecker.cpp
@@ -46,8 +46,7 @@ ASTNodeNaturalConversionChecker::_checkIsNaturalExpressionConversion(const ASTNo
           break;
         }
       }
-      this->_checkIsNaturalTypeConversion(node, data_type, target_data_type);
-      break;
+      [[fallthrough]];
     }
     default: {
       this->_checkIsNaturalTypeConversion(node, data_type, target_data_type);
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index c43aebe8c642bc16524f02ac075670cae5af7b85..df7a0acfb120df2fb049e8312fb82680b1865b65 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -27,6 +27,7 @@ add_executable (unit_tests
   test_ASTNodeJumpPlacementChecker.cpp
   test_ASTNodeListAffectationExpressionBuilder.cpp
   test_ASTNodeListProcessor.cpp
+  test_ASTNodeNaturalConversionChecker.cpp
   test_ASTNodeTypeCleaner.cpp
   test_ASTNodeUnaryOperatorExpressionBuilder.cpp
   test_ASTPrinter.cpp
diff --git a/tests/test_ASTNodeNaturalConversionChecker.cpp b/tests/test_ASTNodeNaturalConversionChecker.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d29c9095d6f3240f37c9575b0f4d28931f9fcbd4
--- /dev/null
+++ b/tests/test_ASTNodeNaturalConversionChecker.cpp
@@ -0,0 +1,653 @@
+#include <catch2/catch.hpp>
+
+#include <ASTNodeNaturalConversionChecker.hpp>
+
+#include <ASTNode.hpp>
+#include <PEGGrammar.hpp>
+
+TEST_CASE("ASTNodeNaturalConversionChecker", "[language]")
+{
+  SECTION("Valid conversions")
+  {
+    std::unique_ptr data_node = std::make_unique<ASTNode>();
+
+    SECTION("-> string")
+    {
+      SECTION("string -> string")
+      {
+        data_node->m_data_type = ASTNodeDataType::string_t;
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::string_t});
+      }
+
+      SECTION("R^d -> string")
+      {
+        data_node->m_data_type = ASTNodeDataType::vector_t;
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::string_t});
+      }
+
+      SECTION("R -> string")
+      {
+        data_node->m_data_type = ASTNodeDataType::double_t;
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::string_t});
+      }
+
+      SECTION("Z -> string")
+      {
+        data_node->m_data_type = ASTNodeDataType::int_t;
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::string_t});
+      }
+
+      SECTION("N -> string")
+      {
+        data_node->m_data_type = ASTNodeDataType::unsigned_int_t;
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::string_t});
+      }
+
+      SECTION("B -> string")
+      {
+        data_node->m_data_type = ASTNodeDataType::bool_t;
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::string_t});
+      }
+    }
+
+    SECTION("-> R^d")
+    {
+      SECTION("R^1 -> R^1")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 1};
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType{ASTNodeDataType::vector_t, 1}});
+      }
+
+      SECTION("list -> R^1")
+      {
+        data_node->m_data_type = ASTNodeDataType::list_t;
+        {
+          std::unique_ptr list0_node = std::make_unique<ASTNode>();
+          list0_node->m_data_type    = ASTNodeDataType::double_t;
+          data_node->emplace_back(std::move(list0_node));
+        }
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType{ASTNodeDataType::vector_t, 1}});
+      }
+
+      SECTION("'0' -> R^d")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::int_t, 1};
+        data_node->set_type<language::integer>();
+        data_node->source  = "0";
+        auto& source       = data_node->source;
+        data_node->m_begin = TAO_PEGTL_NAMESPACE::internal::iterator{&source[0]};
+        data_node->m_end   = TAO_PEGTL_NAMESPACE::internal::iterator{&source[source.size()]};
+
+        SECTION("d = 1")
+        {
+          REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType{ASTNodeDataType::vector_t, 1}});
+        }
+        SECTION("d = 2")
+        {
+          REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType{ASTNodeDataType::vector_t, 2}});
+        }
+        SECTION("d = 3")
+        {
+          REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType{ASTNodeDataType::vector_t, 3}});
+        }
+      }
+
+      SECTION("R^2 -> R^2")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 2};
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType{ASTNodeDataType::vector_t, 2}});
+      }
+
+      SECTION("list -> R^2")
+      {
+        data_node->m_data_type = ASTNodeDataType::list_t;
+        {
+          std::unique_ptr list0_node = std::make_unique<ASTNode>();
+          list0_node->m_data_type    = ASTNodeDataType::double_t;
+          data_node->emplace_back(std::move(list0_node));
+
+          std::unique_ptr list1_node = std::make_unique<ASTNode>();
+          list1_node->m_data_type    = ASTNodeDataType::unsigned_int_t;
+          data_node->emplace_back(std::move(list1_node));
+        }
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType{ASTNodeDataType::vector_t, 2}});
+      }
+
+      SECTION("R^3 -> R^3")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 3};
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType{ASTNodeDataType::vector_t, 3}});
+      }
+
+      SECTION("list -> R^3")
+      {
+        data_node->m_data_type = ASTNodeDataType::list_t;
+        {
+          std::unique_ptr list0_node = std::make_unique<ASTNode>();
+          list0_node->m_data_type    = ASTNodeDataType::double_t;
+          data_node->emplace_back(std::move(list0_node));
+
+          std::unique_ptr list1_node = std::make_unique<ASTNode>();
+          list1_node->m_data_type    = ASTNodeDataType::unsigned_int_t;
+          data_node->emplace_back(std::move(list1_node));
+
+          std::unique_ptr list2_node = std::make_unique<ASTNode>();
+          list2_node->m_data_type    = ASTNodeDataType::int_t;
+          data_node->emplace_back(std::move(list2_node));
+        }
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType{ASTNodeDataType::vector_t, 3}});
+      }
+    }
+
+    SECTION("-> R")
+    {
+      SECTION("R -> R")
+      {
+        data_node->m_data_type = ASTNodeDataType::double_t;
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::double_t});
+      }
+
+      SECTION("Z -> R")
+      {
+        data_node->m_data_type = ASTNodeDataType::int_t;
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::double_t});
+      }
+
+      SECTION("N -> R")
+      {
+        data_node->m_data_type = ASTNodeDataType::unsigned_int_t;
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::double_t});
+      }
+
+      SECTION("B -> R")
+      {
+        data_node->m_data_type = ASTNodeDataType::bool_t;
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::double_t});
+      }
+    }
+
+    SECTION("-> Z")
+    {
+      SECTION("Z -> Z")
+      {
+        data_node->m_data_type = ASTNodeDataType::int_t;
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::int_t});
+      }
+
+      SECTION("N -> Z")
+      {
+        data_node->m_data_type = ASTNodeDataType::unsigned_int_t;
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::int_t});
+      }
+
+      SECTION("B -> Z")
+      {
+        data_node->m_data_type = ASTNodeDataType::bool_t;
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::int_t});
+      }
+    }
+
+    SECTION("-> N")
+    {
+      SECTION("Z -> N")
+      {
+        data_node->m_data_type = ASTNodeDataType::int_t;
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::unsigned_int_t});
+      }
+
+      SECTION("N -> N")
+      {
+        data_node->m_data_type = ASTNodeDataType::unsigned_int_t;
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::unsigned_int_t});
+      }
+
+      SECTION("B -> N")
+      {
+        data_node->m_data_type = ASTNodeDataType::bool_t;
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::unsigned_int_t});
+      }
+    }
+
+    SECTION("-> B")
+    {
+      SECTION("B -> B")
+      {
+        data_node->m_data_type = ASTNodeDataType::bool_t;
+        REQUIRE_NOTHROW(ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::bool_t});
+      }
+    }
+  }
+
+  SECTION("Invalid conversions")
+  {
+    std::unique_ptr data_node = std::make_unique<ASTNode>();
+
+    SECTION("-> R^d")
+    {
+      SECTION("R^2 -> R^1")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 2};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                             ASTNodeDataType{ASTNodeDataType::vector_t, 1}}),
+                            "incompatible dimensions in affectation");
+      }
+
+      SECTION("R^3 -> R^1")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 3};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                             ASTNodeDataType{ASTNodeDataType::vector_t, 1}}),
+                            "incompatible dimensions in affectation");
+      }
+
+      SECTION("R^1 -> R^2")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 1};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                             ASTNodeDataType{ASTNodeDataType::vector_t, 2}}),
+                            "incompatible dimensions in affectation");
+      }
+
+      SECTION("R^3 -> R^2")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 3};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                             ASTNodeDataType{ASTNodeDataType::vector_t, 2}}),
+                            "incompatible dimensions in affectation");
+      }
+
+      SECTION("R^1 -> R^3")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 1};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                             ASTNodeDataType{ASTNodeDataType::vector_t, 3}}),
+                            "incompatible dimensions in affectation");
+      }
+
+      SECTION("R^2 -> R^3")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 2};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                             ASTNodeDataType{ASTNodeDataType::vector_t, 3}}),
+                            "incompatible dimensions in affectation");
+      }
+
+      SECTION("list1 -> R^d")
+      {
+        data_node->m_data_type = ASTNodeDataType::list_t;
+        {
+          std::unique_ptr list0_node = std::make_unique<ASTNode>();
+          list0_node->m_data_type    = ASTNodeDataType::double_t;
+          data_node->emplace_back(std::move(list0_node));
+        }
+
+        SECTION("d=2")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 2}}),
+                              "incompatible dimensions in affectation");
+        }
+
+        SECTION("d=3")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 3}}),
+                              "incompatible dimensions in affectation");
+        }
+      }
+
+      SECTION("list2 -> R^d")
+      {
+        data_node->m_data_type = ASTNodeDataType::list_t;
+        {
+          std::unique_ptr list0_node = std::make_unique<ASTNode>();
+          list0_node->m_data_type    = ASTNodeDataType::double_t;
+          data_node->emplace_back(std::move(list0_node));
+
+          std::unique_ptr list1_node = std::make_unique<ASTNode>();
+          list1_node->m_data_type    = ASTNodeDataType::unsigned_int_t;
+          data_node->emplace_back(std::move(list1_node));
+        }
+
+        SECTION("d=1")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 1}}),
+                              "incompatible dimensions in affectation");
+        }
+
+        SECTION("d=3")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 3}}),
+                              "incompatible dimensions in affectation");
+        }
+      }
+
+      SECTION("list3 -> R^d")
+      {
+        data_node->m_data_type = ASTNodeDataType::list_t;
+        {
+          std::unique_ptr list0_node = std::make_unique<ASTNode>();
+          list0_node->m_data_type    = ASTNodeDataType::double_t;
+          data_node->emplace_back(std::move(list0_node));
+
+          std::unique_ptr list1_node = std::make_unique<ASTNode>();
+          list1_node->m_data_type    = ASTNodeDataType::unsigned_int_t;
+          data_node->emplace_back(std::move(list1_node));
+
+          std::unique_ptr list2_node = std::make_unique<ASTNode>();
+          list2_node->m_data_type    = ASTNodeDataType::int_t;
+          data_node->emplace_back(std::move(list2_node));
+        }
+
+        SECTION("d=1")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 1}}),
+                              "incompatible dimensions in affectation");
+        }
+
+        SECTION("d=2")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 2}}),
+                              "incompatible dimensions in affectation");
+        }
+      }
+
+      SECTION("R -> R^d")
+      {
+        data_node->m_data_type = ASTNodeDataType::double_t;
+
+        SECTION("d=1")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 1}}),
+                              "invalid implicit conversion: R -> R^1");
+        }
+
+        SECTION("d=2")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 2}}),
+                              "invalid implicit conversion: R -> R^2");
+        }
+
+        SECTION("d=3")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 3}}),
+                              "invalid implicit conversion: R -> R^3");
+        }
+      }
+
+      SECTION("Z -> R^d (non-zero)")
+      {
+        data_node->m_data_type = ASTNodeDataType::int_t;
+        data_node->set_type<language::integer>();
+        data_node->source  = "1";
+        auto& source       = data_node->source;
+        data_node->m_begin = TAO_PEGTL_NAMESPACE::internal::iterator{&source[0]};
+        data_node->m_end   = TAO_PEGTL_NAMESPACE::internal::iterator{&source[source.size()]};
+
+        SECTION("d=1")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 1}}),
+                              "invalid implicit conversion: Z -> R^1");
+        }
+
+        SECTION("d=2")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 2}}),
+                              "invalid implicit conversion: Z -> R^2");
+        }
+
+        SECTION("d=3")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 3}}),
+                              "invalid implicit conversion: Z -> R^3");
+        }
+      }
+
+      SECTION("N -> R^d")
+      {
+        data_node->m_data_type = ASTNodeDataType::unsigned_int_t;
+
+        SECTION("d=1")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 1}}),
+                              "invalid implicit conversion: N -> R^1");
+        }
+
+        SECTION("d=2")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 2}}),
+                              "invalid implicit conversion: N -> R^2");
+        }
+
+        SECTION("d=3")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 3}}),
+                              "invalid implicit conversion: N -> R^3");
+        }
+      }
+
+      SECTION("B -> R^d")
+      {
+        data_node->m_data_type = ASTNodeDataType::bool_t;
+
+        SECTION("d=1")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 1}}),
+                              "invalid implicit conversion: B -> R^1");
+        }
+
+        SECTION("d=2")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 2}}),
+                              "invalid implicit conversion: B -> R^2");
+        }
+
+        SECTION("d=3")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 3}}),
+                              "invalid implicit conversion: B -> R^3");
+        }
+      }
+
+      SECTION("string -> R^d")
+      {
+        data_node->m_data_type = ASTNodeDataType::string_t;
+
+        SECTION("d=1")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 1}}),
+                              "invalid implicit conversion: string -> R^1");
+        }
+
+        SECTION("d=2")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 2}}),
+                              "invalid implicit conversion: string -> R^2");
+        }
+
+        SECTION("d=3")
+        {
+          REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node,
+                                                               ASTNodeDataType{ASTNodeDataType::vector_t, 3}}),
+                              "invalid implicit conversion: string -> R^3");
+        }
+      }
+    }
+
+    SECTION("-> R")
+    {
+      SECTION("string -> R")
+      {
+        data_node->m_data_type = ASTNodeDataType::string_t;
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::double_t}),
+                            "invalid implicit conversion: string -> R");
+      }
+
+      SECTION("R^1 -> R")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 1};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::double_t}),
+                            "invalid implicit conversion: R^1 -> R");
+      }
+
+      SECTION("R^2 -> R")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 2};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::double_t}),
+                            "invalid implicit conversion: R^2 -> R");
+      }
+
+      SECTION("R^3 -> R")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 3};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::double_t}),
+                            "invalid implicit conversion: R^3 -> R");
+      }
+    }
+
+    SECTION("-> Z")
+    {
+      SECTION("string -> Z")
+      {
+        data_node->m_data_type = ASTNodeDataType::string_t;
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::int_t}),
+                            "invalid implicit conversion: string -> Z");
+      }
+
+      SECTION("R^1 -> Z")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 1};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::int_t}),
+                            "invalid implicit conversion: R^1 -> Z");
+      }
+
+      SECTION("R^2 -> Z")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 2};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::int_t}),
+                            "invalid implicit conversion: R^2 -> Z");
+      }
+
+      SECTION("R^3 -> Z")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 3};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::int_t}),
+                            "invalid implicit conversion: R^3 -> Z");
+      }
+
+      SECTION("R -> Z")
+      {
+        data_node->m_data_type = ASTNodeDataType::double_t;
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::int_t}),
+                            "invalid implicit conversion: R -> Z");
+      }
+    }
+
+    SECTION("-> N")
+    {
+      SECTION("string -> N")
+      {
+        data_node->m_data_type = ASTNodeDataType::string_t;
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::unsigned_int_t}),
+                            "invalid implicit conversion: string -> N");
+      }
+
+      SECTION("R^1 -> N")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 1};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::unsigned_int_t}),
+                            "invalid implicit conversion: R^1 -> N");
+      }
+
+      SECTION("R^2 -> N")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 2};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::unsigned_int_t}),
+                            "invalid implicit conversion: R^2 -> N");
+      }
+
+      SECTION("R^3 -> N")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 3};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::unsigned_int_t}),
+                            "invalid implicit conversion: R^3 -> N");
+      }
+
+      SECTION("R -> N")
+      {
+        data_node->m_data_type = ASTNodeDataType::double_t;
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::unsigned_int_t}),
+                            "invalid implicit conversion: R -> N");
+      }
+    }
+
+    SECTION("-> B")
+    {
+      SECTION("string -> B")
+      {
+        data_node->m_data_type = ASTNodeDataType::string_t;
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::bool_t}),
+                            "invalid implicit conversion: string -> B");
+      }
+
+      SECTION("R^1 -> B")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 1};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::bool_t}),
+                            "invalid implicit conversion: R^1 -> B");
+      }
+
+      SECTION("R^2 -> B")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 2};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::bool_t}),
+                            "invalid implicit conversion: R^2 -> B");
+      }
+
+      SECTION("R^3 -> B")
+      {
+        data_node->m_data_type = ASTNodeDataType{ASTNodeDataType::vector_t, 3};
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::bool_t}),
+                            "invalid implicit conversion: R^3 -> B");
+      }
+
+      SECTION("R -> B")
+      {
+        data_node->m_data_type = ASTNodeDataType::double_t;
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::bool_t}),
+                            "invalid implicit conversion: R -> B");
+      }
+
+      SECTION("Z -> B")
+      {
+        data_node->m_data_type = ASTNodeDataType::int_t;
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::bool_t}),
+                            "invalid implicit conversion: Z -> B");
+      }
+      SECTION("N -> B")
+      {
+        data_node->m_data_type = ASTNodeDataType::unsigned_int_t;
+        REQUIRE_THROWS_WITH((ASTNodeNaturalConversionChecker{*data_node, ASTNodeDataType::bool_t}),
+                            "invalid implicit conversion: N -> B");
+      }
+    }
+  }
+}