diff --git a/include/ccaosdb.h b/include/ccaosdb.h index 027a10286336a542dafe190bb452e6aadbaa9151..1ab0a8afa51abdeaa0425be585a556a58f29557d 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 e8b0a849bb58a8b1228a2249e2755da53e6f1132..7e8ec9c5d0f1006d5d47fb4aad35664e662a59f2 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 6559167731502d04cbd378f736399979a0c7c11c..4bdc6a9f63d7b7a2e05c1b9a78fb96125b0084a1 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); +}