From 67b1de0752fa21f32bf60b3d5e8eb6fca3f4fae4 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Fri, 7 Feb 2020 17:40:03 +0100
Subject: [PATCH] Add missing tests for ASTNodeDataType

---
 tests/test_ASTNodeDataType.cpp | 57 ++++++++++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)

diff --git a/tests/test_ASTNodeDataType.cpp b/tests/test_ASTNodeDataType.cpp
index ab91abd63..7771e3be3 100644
--- a/tests/test_ASTNodeDataType.cpp
+++ b/tests/test_ASTNodeDataType.cpp
@@ -2,6 +2,9 @@
 
 #include <ASTNodeDataType.hpp>
 
+#include <ASTNode.hpp>
+#include <PEGGrammar.hpp>
+
 TEST_CASE("ASTNodeDataType", "[language]")
 {
   SECTION("dataTypeName")
@@ -16,6 +19,10 @@ TEST_CASE("ASTNodeDataType", "[language]")
     REQUIRE(dataTypeName(ASTNodeDataType::void_t) == "void");
     REQUIRE(dataTypeName(ASTNodeDataType::function_t) == "function");
     REQUIRE(dataTypeName(ASTNodeDataType::c_function_t) == "c_function");
+    REQUIRE(dataTypeName(ASTNodeDataType::list_t) == "list");
+    REQUIRE(dataTypeName(ASTNodeDataType{ASTNodeDataType::vector_t, 1}) == "R^1");
+    REQUIRE(dataTypeName(ASTNodeDataType{ASTNodeDataType::vector_t, 2}) == "R^2");
+    REQUIRE(dataTypeName(ASTNodeDataType{ASTNodeDataType::vector_t, 3}) == "R^3");
   }
 
   SECTION("promotion")
@@ -43,5 +50,55 @@ TEST_CASE("ASTNodeDataType", "[language]")
     REQUIRE(dataTypePromotion(ASTNodeDataType::unsigned_int_t, ASTNodeDataType::string_t) ==
             ASTNodeDataType::undefined_t);
     REQUIRE(dataTypePromotion(ASTNodeDataType::double_t, ASTNodeDataType::string_t) == ASTNodeDataType::undefined_t);
+    REQUIRE(dataTypePromotion(ASTNodeDataType::bool_t, ASTNodeDataType::vector_t) == ASTNodeDataType::vector_t);
+    REQUIRE(dataTypePromotion(ASTNodeDataType::double_t, ASTNodeDataType::vector_t) == ASTNodeDataType::vector_t);
+  }
+
+  SECTION("getVectorDataType")
+  {
+    std::unique_ptr type_node = std::make_unique<ASTNode>();
+    type_node->set_type<language::vector_type>();
+
+    type_node->emplace_back(std::make_unique<ASTNode>());
+
+    {
+      std::unique_ptr dimension_node = std::make_unique<ASTNode>();
+      dimension_node->set_type<language::integer>();
+      dimension_node->source  = "17";
+      auto& source            = dimension_node->source;
+      dimension_node->m_begin = TAO_PEGTL_NAMESPACE::internal::iterator{&source[0]};
+      dimension_node->m_end   = TAO_PEGTL_NAMESPACE::internal::iterator{&source[source.size()]};
+      type_node->emplace_back(std::move(dimension_node));
+    }
+
+    SECTION("good node")
+    {
+      REQUIRE(getVectorDataType(*type_node) == ASTNodeDataType::vector_t);
+      REQUIRE(getVectorDataType(*type_node).dimension() == 17);
+    }
+
+    SECTION("bad node type")
+    {
+      type_node->set_type<language::integer>();
+      REQUIRE_THROWS_WITH(getVectorDataType(*type_node), "unexpected node type");
+    }
+
+    SECTION("bad children size 1")
+    {
+      type_node->children.clear();
+      REQUIRE_THROWS_WITH(getVectorDataType(*type_node), "unexpected node type");
+    }
+
+    SECTION("bad children size 1")
+    {
+      type_node->children.emplace_back(std::unique_ptr<ASTNode>());
+      REQUIRE_THROWS_WITH(getVectorDataType(*type_node), "unexpected node type");
+    }
+
+    SECTION("bad dimension type")
+    {
+      type_node->children[1]->set_type<language::real>();
+      REQUIRE_THROWS_WITH(getVectorDataType(*type_node), "unexpected non integer constant dimension");
+    }
   }
 }
-- 
GitLab