From 8acc01a2264956df3515bd445710198a1144a1db Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Fri, 20 Aug 2021 15:30:58 +0200
Subject: [PATCH] ENH: Empty listst are handled now.

---
 CHANGELOG.md           |  1 +
 include/caosdb/value.h | 11 +++++++++--
 test/test_value.cpp    |  9 +++++++++
 3 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 03710a3..d5debc0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Added
 
 - New functions getEnumNameFromValue() and getEnumValueFromName().
+- Values with empty lists are implemented now.
 
 ### Changed
 
diff --git a/include/caosdb/value.h b/include/caosdb/value.h
index 989f780..d5e6b1f 100644
--- a/include/caosdb/value.h
+++ b/include/caosdb/value.h
@@ -34,6 +34,10 @@
     for (const auto &value : values) {                                                             \
       this->wrapped->mutable_list_values()->add_values()->SETTER(value);                           \
     }                                                                                              \
+    if (values.empty()) {                                                                          \
+      this->wrapped->mutable_list_values()->add_values()->set_special_value                        \
+        (ProtoSpecialValue::SPECIAL_VALUE_UNSPECIFIED);                                            \
+    }                                                                                              \
   }
 
 namespace caosdb::entity {
@@ -177,8 +181,11 @@ public:
   [[nodiscard]] inline auto IsList() const noexcept -> bool {
     return this->wrapped->value_case() == ValueCase::kListValues;
   }
-  [[nodiscard]] inline auto AsList() const noexcept -> const std::vector<ScalarValue> & {
-    if (!IsList()) {
+  [[nodiscard]] inline auto AsList() const noexcept -> const std::vector<ScalarValue> &
+   {
+    if (!IsList() || (this->wrapped->list_values().values(0).has_special_value()
+                      && this->wrapped->list_values().values(0).special_value()
+                      == ProtoSpecialValue::SPECIAL_VALUE_UNSPECIFIED)) {
       // create empty list
       this->list_values = std::make_unique<std::vector<ScalarValue>>();
     }
diff --git a/test/test_value.cpp b/test/test_value.cpp
index 74d30f0..adc830d 100644
--- a/test/test_value.cpp
+++ b/test/test_value.cpp
@@ -27,6 +27,7 @@
 #include <gtest/gtest-message.h>            // for Message
 #include <gtest/gtest-test-part.h>          // for TestPartResult, SuiteApi...
 #include <gtest/gtest_pred_impl.h>          // for AssertionResult, Test
+#include <gtest/gtest-spi.h>
 #include <initializer_list>                 // for initializer_list
 #include <string>                           // for string, basic_string
 #include <vector>                           // for vector
@@ -134,5 +135,13 @@ TEST(test_value, test_list) {
     EXPECT_EQ(item.IsString(), true);
     EXPECT_EQ(item.AsString(), "id" + std::to_string(counter++));
   }
+
+  // Test empty lists
+  auto empty_content = std::vector<int>();
+  Value value_0(empty_content);
+  EXPECT_TRUE(value_0.IsList());
+  auto list_value_0 = value_0.AsList();
+  EXPECT_EQ(list_value_0.size(), 0);
+  EXPECT_TRUE(list_value_0.empty());
 }
 } // namespace caosdb::entity
-- 
GitLab