From 6cba107b822a160c0f77d2f2f5aa3c98c25e07ae Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Wed, 1 Sep 2021 00:21:15 +0200
Subject: [PATCH] WIP: test integer out of range

---
 test/test_transaction.cpp | 67 ++++++++++++++++++++++++++++-----------
 1 file changed, 48 insertions(+), 19 deletions(-)

diff --git a/test/test_transaction.cpp b/test/test_transaction.cpp
index 1dc0970..7625c80 100644
--- a/test/test_transaction.cpp
+++ b/test/test_transaction.cpp
@@ -142,7 +142,6 @@ auto test_transaction::getValueAs<int32_t>(const Value &value) -> int32_t {
   return static_cast<int32_t>(value.AsInteger());
 }
 
-
 template <>
 auto test_transaction::getValueAs<bool>(const Value &value) -> bool {
   return value.AsBool();
@@ -700,8 +699,8 @@ TEST_F(test_transaction, test_query) {
 /**
  * Test numeric values (template).
  */
-template <typename T>
-auto test_numeric_values_impl(AtomicDataType a_type, bool cast_to_int64) -> void {
+template <typename T, typename S>
+auto test_numeric_values_impl(AtomicDataType a_type) -> void {
   const auto &connection =
     caosdb::connection::ConnectionManager::GetDefaultConnection();
 
@@ -718,11 +717,7 @@ auto test_numeric_values_impl(AtomicDataType a_type, bool cast_to_int64) -> void
     prop.SetName(name);
     prop.SetDataType(a_type);
     std::cout << "Setting value " << value << std::endl;
-    if(cast_to_int64) {
-      prop.SetValue(static_cast<int64_t>(value));
-    } else {
-      prop.SetValue(value);
-    }
+    prop.SetValue(static_cast<S>(value));
     props_orig.push_back(prop);
     auto i_stat = insert_transaction->InsertEntity(&prop);
     EXPECT_EQ(i_stat, StatusCode::READY);
@@ -747,12 +742,14 @@ auto test_numeric_values_impl(AtomicDataType a_type, bool cast_to_int64) -> void
     EXPECT_TRUE(t_stat.IsTerminated());
     EXPECT_FALSE(t_stat.IsError());
 
-    const auto result = retrieve_transaction->GetResultSet().at(0);
-    EXPECT_EQ(result.GetDataType(), a_type);
-    const auto &retrieved_value =
-      test_transaction::getValueAs<T>(result.GetValue());
-    // std::cout << "retrieved_value: " << retrieved_value << std::endl;
-    EXPECT_EQ(retrieved_value, value);
+    if (retrieve_transaction->GetResultSet().size() > 0) {
+      const auto result = retrieve_transaction->GetResultSet().at(0);
+      EXPECT_EQ(result.GetDataType(), a_type);
+      const auto &retrieved_value =
+        test_transaction::getValueAs<T>(result.GetValue());
+      // std::cout << "retrieved_value: " << retrieved_value << std::endl;
+      EXPECT_EQ(retrieved_value, value);
+    }
     ++i;
   }
 }
@@ -761,13 +758,45 @@ auto test_numeric_values_impl(AtomicDataType a_type, bool cast_to_int64) -> void
  * Test numeric values (wrapper for types).
  */
 TEST_F(test_transaction, test_numeric_values) {
-  test_numeric_values_impl<double>(AtomicDataType::DOUBLE, false);
+  test_numeric_values_impl<double, double>(AtomicDataType::DOUBLE);
   test_transaction::DeleteEntities();
-  test_numeric_values_impl<int32_t>(AtomicDataType::INTEGER, true);
+  test_numeric_values_impl<int32_t, int64_t>(AtomicDataType::INTEGER);
   test_transaction::DeleteEntities();
-  test_numeric_values_impl<bool>(AtomicDataType::BOOLEAN, false);
-  test_transaction::DeleteEntities();
-  test_numeric_values_impl<int64_t>(AtomicDataType::INTEGER, false);
+  test_numeric_values_impl<bool, bool>(AtomicDataType::BOOLEAN);
+}
+
+TEST_F(test_transaction, test_integer_out_of_range) {
+  const auto &connection =
+    caosdb::connection::ConnectionManager::GetDefaultConnection();
+
+  // Insert entities
+  std::vector<int64_t> values = {std::numeric_limits<int64_t>::max(),
+                                 std::numeric_limits<int64_t>::min()};
+  for (auto value : values) {
+    auto insert_transaction(connection->CreateTransaction());
+    Entity prop;
+
+    prop.SetRole(Role::PROPERTY);
+    const auto name = std::string("Prop_") + std::to_string(value);
+
+    prop.SetName(name);
+    prop.SetDataType(AtomicDataType::INTEGER);
+    prop.SetValue(value);
+
+    auto i_stat = insert_transaction->InsertEntity(&prop);
+    EXPECT_EQ(i_stat, StatusCode::READY);
+
+    insert_transaction->ExecuteAsynchronously();
+    auto t_stat = insert_transaction->WaitForIt();
+    EXPECT_TRUE(t_stat.IsTerminated());
+    EXPECT_TRUE(t_stat.IsError());
+    EXPECT_EQ(t_stat.GetCode(), StatusCode::GENERIC_TRANSACTION_ERROR);
+    EXPECT_EQ(insert_transaction->GetResultSet().size(), 1);
+    EXPECT_TRUE(insert_transaction->GetResultSet().at(0).HasErrors());
+    EXPECT_EQ(
+      insert_transaction->GetResultSet().at(0).GetErrors().at(0).GetCode(),
+      MessageCode::INTEGER_VALUE_OUT_OF_RANGE);
+  }
 }
 
 // /*
-- 
GitLab