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