223 lines
6.2 KiB
Diff
223 lines
6.2 KiB
Diff
|
From 85933ccfa7a1068f16fde557fe825c750899659a Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com>
|
||
|
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
|
||
|
|