From ec2eb3eb5f26227bda7a1faac7781539677478c2 Mon Sep 17 00:00:00 2001
From: florian <f.spreckelsen@inidscale.com>
Date: Thu, 12 Aug 2021 14:00:19 +0200
Subject: [PATCH] ENH: Add removal of parents and properties to Extern C

---
 include/ccaosdb.h     |  3 +++
 src/ccaosdb.cpp       | 21 +++++++++++++++
 test/test_ccaosdb.cpp | 63 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 87 insertions(+)

diff --git a/include/ccaosdb.h b/include/ccaosdb.h
index 027a102..1ab0a8a 100644
--- a/include/ccaosdb.h
+++ b/include/ccaosdb.h
@@ -404,8 +404,11 @@ int caosdb_entity_entity_set_value(caosdb_entity_entity *entity,
                                    const char *value);
 int caosdb_entity_entity_append_parent(caosdb_entity_entity *entity,
                                        caosdb_entity_parent *parent);
+int caosdb_entity_entity_remove_parent(caosdb_entity_entity *entity, int index);
 int caosdb_entity_entity_append_property(caosdb_entity_entity *entity,
                                          caosdb_entity_property *property);
+int caosdb_entity_entity_remove_property(caosdb_entity_entity *entity,
+                                         int index);
 
 int caosdb_entity_property_set_id(caosdb_entity_property *property,
                                   const char *id);
diff --git a/src/ccaosdb.cpp b/src/ccaosdb.cpp
index e8b0a84..7e8ec9c 100644
--- a/src/ccaosdb.cpp
+++ b/src/ccaosdb.cpp
@@ -769,6 +769,17 @@ ERROR_RETURN_CODE(
     return 0;
   })
 
+ERROR_RETURN_CODE(
+  GENERIC_ERROR,
+  int caosdb_entity_entity_remove_parent(caosdb_entity_entity *entity,
+                                         int index),
+  {
+    auto *wrapped_entity =
+      static_cast<caosdb::entity::Entity *>(entity->wrapped_entity);
+    wrapped_entity->RemoveParent(index);
+    return 0;
+  })
+
 ERROR_RETURN_CODE(
   GENERIC_ERROR,
   int caosdb_entity_entity_append_property(caosdb_entity_entity *entity,
@@ -781,6 +792,16 @@ ERROR_RETURN_CODE(
     wrapped_entity->AppendProperty(*wrapped_property);
     return 0;
   })
+ERROR_RETURN_CODE(
+  GENERIC_ERROR,
+  int caosdb_entity_entity_remove_property(caosdb_entity_entity *entity,
+                                           int index),
+  {
+    auto *wrapped_entity =
+      static_cast<caosdb::entity::Entity *>(entity->wrapped_entity);
+    wrapped_entity->RemoveProperty(index);
+    return 0;
+  })
 
 CAOSDB_PARENT_SET(id, id, wrapped_parent->SetId(std::string(id));)
 CAOSDB_PARENT_SET(name, name, wrapped_parent->SetName(std::string(name));)
diff --git a/test/test_ccaosdb.cpp b/test/test_ccaosdb.cpp
index 6559167..4bdc6a9 100644
--- a/test/test_ccaosdb.cpp
+++ b/test/test_ccaosdb.cpp
@@ -347,3 +347,66 @@ TEST_F(test_ccaosdb, test_entity_with_parent_and_property) {
   return_code = caosdb_entity_delete_property(&output_property);
   EXPECT_EQ(return_code, 0);
 }
+
+TEST_F(test_ccaosdb, test_remove_property) {
+  caosdb_entity_entity entity;
+  int return_code(caosdb_entity_create_entity(&entity));
+  EXPECT_EQ(return_code, 0);
+
+  // Create two properties with names
+  caosdb_entity_property in_prop_1;
+  return_code = caosdb_entity_create_property(&in_prop_1);
+  EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_property_set_name(&in_prop_1, "Property 1");
+  EXPECT_EQ(return_code, 0);
+
+  caosdb_entity_property in_prop_2;
+  return_code = caosdb_entity_create_property(&in_prop_2);
+  EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_property_set_name(&in_prop_2, "Property 2");
+  EXPECT_EQ(return_code, 0);
+
+  // Append them
+  return_code = caosdb_entity_entity_append_property(&entity, &in_prop_1);
+  EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_entity_append_property(&entity, &in_prop_2);
+  EXPECT_EQ(return_code, 0);
+
+  // Delete one and see that the number of properties decreases by one
+  int count[] = {0}; // NOLINT
+  return_code = caosdb_entity_entity_get_properties_size(&entity, count);
+  EXPECT_EQ(return_code, 0);
+  EXPECT_EQ(*count, 2);
+
+  return_code = caosdb_entity_entity_remove_property(&entity, 0);
+  EXPECT_EQ(return_code, 0);
+
+  return_code = caosdb_entity_entity_get_properties_size(&entity, count);
+  EXPECT_EQ(return_code, 0);
+  EXPECT_EQ(*count, 1);
+
+  caosdb_entity_property out_prop;
+  return_code = caosdb_entity_entity_get_property(&entity, &out_prop, 0);
+  EXPECT_EQ(return_code, 0);
+
+  char in[255] = {"a"};  // NOLINT
+  char out[255] = {"b"}; // NOLINT
+
+  // Deleted the first property, so the second one should remain.
+  return_code = caosdb_entity_property_get_name(&in_prop_2, in);
+  EXPECT_EQ(return_code, 0);
+  return_code = caosdb_entity_property_get_name(&out_prop, out);
+  EXPECT_EQ(return_code, 0);
+
+  EXPECT_EQ(strcmp(in, out), 0);
+
+  // Delete everything we have created
+  return_code = caosdb_entity_delete_property(&in_prop_2);
+  EXPECT_EQ(return_code, 0);
+
+  return_code = caosdb_entity_delete_property(&in_prop_1);
+  EXPECT_EQ(return_code, 0);
+
+  return_code = caosdb_entity_delete_entity(&entity);
+  EXPECT_EQ(return_code, 0);
+}
-- 
GitLab