From 85933ccfa7a1068f16fde557fe825c750899659a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= Date: Wed, 28 Nov 2018 13:45:33 +0100 Subject: [PATCH 13/15] util: remove duplicate values correctly in string_array_del_value --- src/lib/util/string_array.c | 27 ++++-- src/tests/test_util_string_array.c | 146 ++++++++++++++++++++++++++++- 2 files changed, 163 insertions(+), 10 deletions(-) diff --git a/src/lib/util/string_array.c b/src/lib/util/string_array.c index e56d66bdcce7c8a1cf99f9b91068614c4b8d3d81..a8afa5ab8edbb26d6f946619f9ce0b83c511bb8c 100644 --- a/src/lib/util/string_array.c +++ b/src/lib/util/string_array.c @@ -140,24 +140,33 @@ string_array_add_value(char **array, const char *value, bool unique) char ** string_array_del_value(char **array, const char *value) { - bool found = false; - int i; + size_t count; + size_t pos; + size_t i; - if (!string_array_has_value(array, value)) { - return array; + if (array == NULL) { + return NULL; } - for (i = 0; array[i] != NULL; i++) { - if (strcmp(value, array[i]) == 0) { + count = string_array_count(array); + for (i = 0; i < count; i++) { + if (strcmp(array[i], value) == 0) { free(array[i]); - found = true; + array[i] = NULL; } + } - if (found) { - array[i] = array[i + 1]; + for (i = 0, pos = 0; i < count; i++) { + if (array[i] != NULL) { + array[pos] = array[i]; + pos++; } } + for (; pos < count; pos++) { + array[pos] = NULL; + } + return array; } diff --git a/src/tests/test_util_string_array.c b/src/tests/test_util_string_array.c index 4f6812e9396f04bbbfb72bda8a9022501f074faf..249cb96acea3c4feac910702572cafb1025d9496 100644 --- a/src/tests/test_util_string_array.c +++ b/src/tests/test_util_string_array.c @@ -32,11 +32,155 @@ void test_string_array_create(void **state) string_array_free(array); } +void test_string_array_del_value__single(void **state) +{ + char **array; + const char *values[] = {"1", "2", "3", "4", "5", NULL}; + const char *expected[] = {"1", "3", "4", "5", NULL}; + int i; + + array = string_array_create(10); + assert_non_null(array); + + /* Fill array. */ + for (i = 0; values[i] != NULL; i++) { + array = string_array_add_value(array, values[i], false); + assert_non_null(array); + assert_non_null(array[i]); + } + assert_null(array[i]); + + /* Delete value. */ + array = string_array_del_value(array, "2"); + assert_non_null(array); + + /* Test values. */ + for (i = 0; expected[i] != NULL; i++) { + assert_non_null(array[i]); + assert_string_equal(array[i], expected[i]); + } + assert_null(array[i]); + + string_array_free(array); +} + +void test_string_array_del_value__single_repeated(void **state) +{ + char **array; + const char *values[] = {"1", "2", "2", "3", "2", "4", "2", "5", NULL}; + const char *expected[] = {"1", "3", "4", "5", NULL}; + int i; + + array = string_array_create(10); + assert_non_null(array); + + /* Fill array. */ + for (i = 0; values[i] != NULL; i++) { + array = string_array_add_value(array, values[i], false); + assert_non_null(array); + assert_non_null(array[i]); + } + assert_null(array[i]); + + /* Delete value. */ + array = string_array_del_value(array, "2"); + assert_non_null(array); + + /* Test values. */ + for (i = 0; expected[i] != NULL; i++) { + assert_non_null(array[i]); + assert_string_equal(array[i], expected[i]); + } + assert_null(array[i]); + + string_array_free(array); +} + +void test_string_array_del_value__multiple(void **state) +{ + char **array; + const char *values[] = {"1", "2", "3", "4", "5", NULL}; + const char *expected[] = {"1", "4", NULL}; + int i; + + array = string_array_create(10); + assert_non_null(array); + + /* Fill array. */ + for (i = 0; values[i] != NULL; i++) { + array = string_array_add_value(array, values[i], false); + assert_non_null(array); + assert_non_null(array[i]); + } + assert_null(array[i]); + + /* Delete value. */ + array = string_array_del_value(array, "2"); + assert_non_null(array); + + array = string_array_del_value(array, "3"); + assert_non_null(array); + + array = string_array_del_value(array, "5"); + assert_non_null(array); + + /* Test values. */ + for (i = 0; expected[i] != NULL; i++) { + assert_non_null(array[i]); + assert_string_equal(array[i], expected[i]); + } + assert_null(array[i]); + + string_array_free(array); +} + +void test_string_array_del_value__multiple_repeated(void **state) +{ + char **array; + const char *values[] = {"1", "2", "2", "3", "3", "2", "4", "2", "5", "5", NULL}; + const char *expected[] = {"1", "4", NULL}; + int i; + + array = string_array_create(10); + assert_non_null(array); + + /* Fill array. */ + for (i = 0; values[i] != NULL; i++) { + array = string_array_add_value(array, values[i], false); + assert_non_null(array); + assert_non_null(array[i]); + } + assert_null(array[i]); + + /* Delete value. */ + array = string_array_del_value(array, "2"); + assert_non_null(array); + + array = string_array_del_value(array, "3"); + assert_non_null(array); + + array = string_array_del_value(array, "5"); + assert_non_null(array); + + /* Test values. */ + for (i = 0; expected[i] != NULL; i++) { + assert_non_null(array[i]); + assert_string_equal(array[i], expected[i]); + } + assert_null(array[i]); + + string_array_free(array); +} + int main(int argc, const char *argv[]) { const struct CMUnitTest tests[] = { - cmocka_unit_test(test_string_array_create) + cmocka_unit_test(test_string_array_create), + cmocka_unit_test(test_string_array_del_value__single), + cmocka_unit_test(test_string_array_del_value__single_repeated), + cmocka_unit_test(test_string_array_del_value__multiple), + cmocka_unit_test(test_string_array_del_value__multiple_repeated) }; return cmocka_run_group_tests(tests, NULL, NULL); -- 2.17.2