| #include "unit-test.h" |
| #include "string-list.h" |
| |
| static void t_vcreate_string_list_dup(struct string_list *list, |
| int free_util, va_list ap) |
| { |
| const char *arg; |
| |
| cl_assert(list->strdup_strings); |
| |
| string_list_clear(list, free_util); |
| while ((arg = va_arg(ap, const char *))) |
| string_list_append(list, arg); |
| } |
| |
| static void t_create_string_list_dup(struct string_list *list, int free_util, ...) |
| { |
| va_list ap; |
| |
| cl_assert(list->strdup_strings); |
| |
| string_list_clear(list, free_util); |
| va_start(ap, free_util); |
| t_vcreate_string_list_dup(list, free_util, ap); |
| va_end(ap); |
| } |
| |
| static void t_string_list_clear(struct string_list *list, int free_util) |
| { |
| string_list_clear(list, free_util); |
| cl_assert_equal_p(list->items, NULL); |
| cl_assert_equal_i(list->nr, 0); |
| cl_assert_equal_i(list->alloc, 0); |
| } |
| |
| static void t_string_list_equal(struct string_list *list, |
| struct string_list *expected_strings) |
| { |
| cl_assert_equal_i(list->nr, expected_strings->nr); |
| cl_assert(list->nr <= list->alloc); |
| for (size_t i = 0; i < expected_strings->nr; i++) |
| cl_assert_equal_s(list->items[i].string, |
| expected_strings->items[i].string); |
| } |
| |
| static void t_string_list_split(const char *data, const char *delim, int maxsplit, ...) |
| { |
| struct string_list expected_strings = STRING_LIST_INIT_DUP; |
| struct string_list list = STRING_LIST_INIT_DUP; |
| va_list ap; |
| int len; |
| |
| va_start(ap, maxsplit); |
| t_vcreate_string_list_dup(&expected_strings, 0, ap); |
| va_end(ap); |
| |
| string_list_clear(&list, 0); |
| len = string_list_split(&list, data, delim, maxsplit); |
| cl_assert_equal_i(len, expected_strings.nr); |
| t_string_list_equal(&list, &expected_strings); |
| |
| string_list_clear(&expected_strings, 0); |
| string_list_clear(&list, 0); |
| } |
| |
| static void t_string_list_split_f(const char *data, const char *delim, |
| int maxsplit, unsigned flags, ...) |
| { |
| struct string_list expected_strings = STRING_LIST_INIT_DUP; |
| struct string_list list = STRING_LIST_INIT_DUP; |
| va_list ap; |
| int len; |
| |
| va_start(ap, flags); |
| t_vcreate_string_list_dup(&expected_strings, 0, ap); |
| va_end(ap); |
| |
| string_list_clear(&list, 0); |
| len = string_list_split_f(&list, data, delim, maxsplit, flags); |
| cl_assert_equal_i(len, expected_strings.nr); |
| t_string_list_equal(&list, &expected_strings); |
| |
| string_list_clear(&expected_strings, 0); |
| string_list_clear(&list, 0); |
| } |
| |
| void test_string_list__split_f(void) |
| { |
| t_string_list_split_f("::foo:bar:baz:", ":", -1, 0, |
| "", "", "foo", "bar", "baz", "", NULL); |
| t_string_list_split_f(" foo:bar : baz", ":", -1, STRING_LIST_SPLIT_TRIM, |
| "foo", "bar", "baz", NULL); |
| t_string_list_split_f(" a b c ", " ", 1, STRING_LIST_SPLIT_TRIM, |
| "a", "b c", NULL); |
| t_string_list_split_f("::foo::bar:baz:", ":", -1, STRING_LIST_SPLIT_NONEMPTY, |
| "foo", "bar", "baz", NULL); |
| t_string_list_split_f("foo:baz", ":", -1, STRING_LIST_SPLIT_NONEMPTY, |
| "foo", "baz", NULL); |
| t_string_list_split_f("foo :: : baz", ":", -1, |
| STRING_LIST_SPLIT_NONEMPTY | STRING_LIST_SPLIT_TRIM, |
| "foo", "baz", NULL); |
| } |
| |
| static void t_string_list_split_in_place_f(const char *data_, const char *delim, |
| int maxsplit, unsigned flags, ...) |
| { |
| struct string_list expected_strings = STRING_LIST_INIT_DUP; |
| struct string_list list = STRING_LIST_INIT_NODUP; |
| char *data = xstrdup(data_); |
| va_list ap; |
| int len; |
| |
| va_start(ap, flags); |
| t_vcreate_string_list_dup(&expected_strings, 0, ap); |
| va_end(ap); |
| |
| string_list_clear(&list, 0); |
| len = string_list_split_in_place_f(&list, data, delim, maxsplit, flags); |
| cl_assert_equal_i(len, expected_strings.nr); |
| t_string_list_equal(&list, &expected_strings); |
| |
| free(data); |
| string_list_clear(&expected_strings, 0); |
| string_list_clear(&list, 0); |
| } |
| |
| void test_string_list__split_in_place_f(void) |
| { |
| t_string_list_split_in_place_f("::foo:bar:baz:", ":", -1, 0, |
| "", "", "foo", "bar", "baz", "", NULL); |
| t_string_list_split_in_place_f(" foo:bar : baz", ":", -1, STRING_LIST_SPLIT_TRIM, |
| "foo", "bar", "baz", NULL); |
| t_string_list_split_in_place_f(" a b c ", " ", 1, STRING_LIST_SPLIT_TRIM, |
| "a", "b c", NULL); |
| t_string_list_split_in_place_f("::foo::bar:baz:", ":", -1, |
| STRING_LIST_SPLIT_NONEMPTY, |
| "foo", "bar", "baz", NULL); |
| t_string_list_split_in_place_f("foo:baz", ":", -1, STRING_LIST_SPLIT_NONEMPTY, |
| "foo", "baz", NULL); |
| t_string_list_split_in_place_f("foo :: : baz", ":", -1, |
| STRING_LIST_SPLIT_NONEMPTY | STRING_LIST_SPLIT_TRIM, |
| "foo", "baz", NULL); |
| } |
| |
| void test_string_list__split(void) |
| { |
| t_string_list_split("foo:bar:baz", ":", -1, "foo", "bar", "baz", NULL); |
| t_string_list_split("foo:bar:baz", ":", 0, "foo:bar:baz", NULL); |
| t_string_list_split("foo:bar:baz", ":", 1, "foo", "bar:baz", NULL); |
| t_string_list_split("foo:bar:baz", ":", 2, "foo", "bar", "baz", NULL); |
| t_string_list_split("foo:bar:", ":", -1, "foo", "bar", "", NULL); |
| t_string_list_split("", ":", -1, "", NULL); |
| t_string_list_split(":", ":", -1, "", "", NULL); |
| } |
| |
| static void t_string_list_split_in_place(const char *data, const char *delim, |
| int maxsplit, ...) |
| { |
| struct string_list expected_strings = STRING_LIST_INIT_DUP; |
| struct string_list list = STRING_LIST_INIT_NODUP; |
| char *string = xstrdup(data); |
| va_list ap; |
| int len; |
| |
| va_start(ap, maxsplit); |
| t_vcreate_string_list_dup(&expected_strings, 0, ap); |
| va_end(ap); |
| |
| string_list_clear(&list, 0); |
| len = string_list_split_in_place(&list, string, delim, maxsplit); |
| cl_assert_equal_i(len, expected_strings.nr); |
| t_string_list_equal(&list, &expected_strings); |
| |
| free(string); |
| string_list_clear(&expected_strings, 0); |
| string_list_clear(&list, 0); |
| } |
| |
| void test_string_list__split_in_place(void) |
| { |
| t_string_list_split_in_place("foo:;:bar:;:baz:;:", ":;", -1, |
| "foo", "", "", "bar", "", "", "baz", "", "", "", NULL); |
| t_string_list_split_in_place("foo:;:bar:;:baz", ":;", 0, |
| "foo:;:bar:;:baz", NULL); |
| t_string_list_split_in_place("foo:;:bar:;:baz", ":;", 1, |
| "foo", ";:bar:;:baz", NULL); |
| t_string_list_split_in_place("foo:;:bar:;:baz", ":;", 2, |
| "foo", "", ":bar:;:baz", NULL); |
| t_string_list_split_in_place("foo:;:bar:;:", ":;", -1, |
| "foo", "", "", "bar", "", "", "", NULL); |
| } |
| |
| static int prefix_cb(struct string_list_item *item, void *cb_data) |
| { |
| const char *prefix = (const char *)cb_data; |
| return starts_with(item->string, prefix); |
| } |
| |
| static void t_string_list_filter(struct string_list *list, ...) |
| { |
| struct string_list expected_strings = STRING_LIST_INIT_DUP; |
| const char *prefix = "y"; |
| va_list ap; |
| |
| va_start(ap, list); |
| t_vcreate_string_list_dup(&expected_strings, 0, ap); |
| va_end(ap); |
| |
| filter_string_list(list, 0, prefix_cb, (void *)prefix); |
| t_string_list_equal(list, &expected_strings); |
| |
| string_list_clear(&expected_strings, 0); |
| } |
| |
| void test_string_list__filter(void) |
| { |
| struct string_list list = STRING_LIST_INIT_DUP; |
| |
| t_create_string_list_dup(&list, 0, NULL); |
| t_string_list_filter(&list, NULL); |
| |
| t_create_string_list_dup(&list, 0, "no", NULL); |
| t_string_list_filter(&list, NULL); |
| |
| t_create_string_list_dup(&list, 0, "yes", NULL); |
| t_string_list_filter(&list, "yes", NULL); |
| |
| t_create_string_list_dup(&list, 0, "no", "yes", NULL); |
| t_string_list_filter(&list, "yes", NULL); |
| |
| t_create_string_list_dup(&list, 0, "yes", "no", NULL); |
| t_string_list_filter(&list, "yes", NULL); |
| |
| t_create_string_list_dup(&list, 0, "y1", "y2", NULL); |
| t_string_list_filter(&list, "y1", "y2", NULL); |
| |
| t_create_string_list_dup(&list, 0, "y2", "y1", NULL); |
| t_string_list_filter(&list, "y2", "y1", NULL); |
| |
| t_create_string_list_dup(&list, 0, "x1", "x2", NULL); |
| t_string_list_filter(&list, NULL); |
| |
| t_string_list_clear(&list, 0); |
| } |
| |
| static void t_string_list_has_string( |
| struct string_list *list, |
| const char *string, |
| int expected) |
| { |
| int has_string = string_list_has_string(list, string); |
| cl_assert_equal_i(has_string, expected); |
| } |
| |
| void test_string_list__has_string(void) |
| { |
| struct string_list list = STRING_LIST_INIT_DUP; |
| |
| t_create_string_list_dup(&list, 0, NULL); |
| t_string_list_has_string(&list, "", 0); |
| |
| t_create_string_list_dup(&list, 0, "a", "b", "c", NULL); |
| t_string_list_has_string(&list, "a", 1); |
| t_string_list_has_string(&list, "b", 1); |
| t_string_list_has_string(&list, "c", 1); |
| t_string_list_has_string(&list, "d", 0); |
| |
| t_string_list_clear(&list, 0); |
| } |
| |
| static void t_string_list_insert(struct string_list *expected_strings, ...) |
| { |
| struct string_list strings_to_insert = STRING_LIST_INIT_DUP; |
| struct string_list list = STRING_LIST_INIT_DUP; |
| va_list ap; |
| |
| va_start(ap, expected_strings); |
| t_vcreate_string_list_dup(&strings_to_insert, 0, ap); |
| va_end(ap); |
| |
| for (size_t i = 0; i < strings_to_insert.nr; i++) |
| string_list_insert(&list, strings_to_insert.items[i].string); |
| |
| t_string_list_equal(&list, expected_strings); |
| |
| string_list_clear(&strings_to_insert, 0); |
| string_list_clear(&list, 0); |
| } |
| |
| void test_string_list__insert(void) |
| { |
| struct string_list expected_strings = STRING_LIST_INIT_DUP; |
| |
| t_create_string_list_dup(&expected_strings, 0, NULL); |
| t_string_list_insert(&expected_strings, NULL); |
| |
| t_create_string_list_dup(&expected_strings, 0, "a", "b", NULL); |
| t_string_list_insert(&expected_strings, "b", "a", "a", "b", NULL); |
| |
| t_create_string_list_dup(&expected_strings, 0, "a", "b", "c", NULL); |
| t_string_list_insert(&expected_strings, "c", "b", "a", "c", "b", NULL); |
| |
| t_create_string_list_dup(&expected_strings, 0, "", "a", NULL); |
| t_string_list_insert(&expected_strings, "a", "a", "a", "", NULL); |
| |
| t_string_list_clear(&expected_strings, 0); |
| } |
| |
| static void t_string_list_sort(struct string_list *list, ...) |
| { |
| struct string_list expected_strings = STRING_LIST_INIT_DUP; |
| va_list ap; |
| |
| va_start(ap, list); |
| t_vcreate_string_list_dup(&expected_strings, 0, ap); |
| va_end(ap); |
| |
| string_list_sort(list); |
| t_string_list_equal(list, &expected_strings); |
| |
| string_list_clear(&expected_strings, 0); |
| } |
| |
| void test_string_list__sort(void) |
| { |
| struct string_list list = STRING_LIST_INIT_DUP; |
| |
| t_create_string_list_dup(&list, 0, NULL); |
| t_string_list_sort(&list, NULL); |
| |
| t_create_string_list_dup(&list, 0, "b", "", "a", NULL); |
| t_string_list_sort(&list, "", "a", "b", NULL); |
| |
| t_create_string_list_dup(&list, 0, "c", "a", "b", "a", NULL); |
| t_string_list_sort(&list, "a", "a", "b", "c", NULL); |
| |
| t_string_list_clear(&list, 0); |
| } |
| |
| static void t_string_list_remove( |
| struct string_list *expected_strings, |
| struct string_list *list, |
| char const *str) |
| { |
| string_list_remove(list, str, 0); |
| t_string_list_equal(list, expected_strings); |
| } |
| |
| void test_string_list__remove(void) |
| { |
| struct string_list expected_strings = STRING_LIST_INIT_DUP; |
| struct string_list list = STRING_LIST_INIT_DUP; |
| |
| t_create_string_list_dup(&expected_strings, 0, NULL); |
| t_create_string_list_dup(&list, 0, NULL); |
| t_string_list_remove(&expected_strings, &list, ""); |
| |
| t_create_string_list_dup(&expected_strings, 0, "a", NULL); |
| t_create_string_list_dup(&list, 0, "a", "a", NULL); |
| t_string_list_remove(&expected_strings, &list, "a"); |
| |
| t_create_string_list_dup(&expected_strings, 0, "a", "b", "b", NULL); |
| t_create_string_list_dup(&list, 0, "a", "b", "b", "c", NULL); |
| t_string_list_remove(&expected_strings, &list, "c"); |
| |
| t_create_string_list_dup(&expected_strings, 0, "a", "b", "d", NULL); |
| t_create_string_list_dup(&list, 0, "a", "b", "c", "d", NULL); |
| t_string_list_remove(&expected_strings, &list, "c"); |
| |
| t_create_string_list_dup(&expected_strings, 0, "a", "b", "c", "d", NULL); |
| t_create_string_list_dup(&list, 0, "a", "b", "c", "d", NULL); |
| t_string_list_remove(&expected_strings, &list, "e"); |
| |
| t_string_list_clear(&expected_strings, 0); |
| t_string_list_clear(&list, 0); |
| } |
| |
| static void t_string_list_remove_duplicates(struct string_list *list, ...) |
| { |
| struct string_list expected_strings = STRING_LIST_INIT_DUP; |
| va_list ap; |
| |
| va_start(ap, list); |
| t_vcreate_string_list_dup(&expected_strings, 0, ap); |
| va_end(ap); |
| |
| string_list_remove_duplicates(list, 0); |
| t_string_list_equal(list, &expected_strings); |
| |
| string_list_clear(&expected_strings, 0); |
| } |
| |
| void test_string_list__remove_duplicates(void) |
| { |
| struct string_list list = STRING_LIST_INIT_DUP; |
| |
| t_create_string_list_dup(&list, 0, NULL); |
| t_string_list_remove_duplicates(&list, NULL); |
| |
| t_create_string_list_dup(&list, 0, "", NULL); |
| t_string_list_remove_duplicates(&list, "", NULL); |
| |
| t_create_string_list_dup(&list, 0, "a", NULL); |
| t_string_list_remove_duplicates(&list, "a", NULL); |
| |
| t_create_string_list_dup(&list, 0, "a", "a", NULL); |
| t_string_list_remove_duplicates(&list, "a", NULL); |
| |
| t_create_string_list_dup(&list, 0, "a", "a", "a", NULL); |
| t_string_list_remove_duplicates(&list, "a", NULL); |
| |
| t_create_string_list_dup(&list, 0, "a", "a", "b", NULL); |
| t_string_list_remove_duplicates(&list, "a", "b", NULL); |
| |
| t_create_string_list_dup(&list, 0, "a", "b", "b", NULL); |
| t_string_list_remove_duplicates(&list, "a", "b", NULL); |
| |
| t_create_string_list_dup(&list, 0, "a", "b", "c", NULL); |
| t_string_list_remove_duplicates(&list, "a", "b", "c", NULL); |
| |
| t_create_string_list_dup(&list, 0, "a", "a", "b", "c", NULL); |
| t_string_list_remove_duplicates(&list, "a", "b", "c", NULL); |
| |
| t_create_string_list_dup(&list, 0, "a", "b", "b", "c", NULL); |
| t_string_list_remove_duplicates(&list, "a", "b", "c", NULL); |
| |
| t_create_string_list_dup(&list, 0, "a", "b", "c", "c", NULL); |
| t_string_list_remove_duplicates(&list, "a", "b", "c", NULL); |
| |
| t_create_string_list_dup(&list, 0, "a", "a", "b", "b", "c", "c", NULL); |
| t_string_list_remove_duplicates(&list, "a", "b", "c", NULL); |
| |
| t_create_string_list_dup(&list, 0, "a", "a", "a", "b", "b", "b", |
| "c", "c", "c", NULL); |
| t_string_list_remove_duplicates(&list, "a", "b", "c", NULL); |
| |
| t_string_list_clear(&list, 0); |
| } |
| |
| static void t_string_list_sort_u(struct string_list *list, ...) |
| { |
| struct string_list expected_strings = STRING_LIST_INIT_DUP; |
| va_list ap; |
| |
| va_start(ap, list); |
| t_vcreate_string_list_dup(&expected_strings, 0, ap); |
| va_end(ap); |
| |
| string_list_sort_u(list, 0); |
| t_string_list_equal(list, &expected_strings); |
| |
| string_list_clear(&expected_strings, 0); |
| } |
| |
| void test_string_list__sort_u(void) |
| { |
| struct string_list list = STRING_LIST_INIT_DUP; |
| |
| t_create_string_list_dup(&list, 0, NULL); |
| t_string_list_sort_u(&list, NULL); |
| |
| t_create_string_list_dup(&list, 0, "", "", "", "", NULL); |
| t_string_list_sort_u(&list, "", NULL); |
| |
| t_create_string_list_dup(&list, 0, "b", "a", "a", "", NULL); |
| t_string_list_sort_u(&list, "", "a", "b", NULL); |
| |
| t_create_string_list_dup(&list, 0, "b", "a", "a", "d", "c", "c", NULL); |
| t_string_list_sort_u(&list, "a", "b", "c", "d", NULL); |
| |
| t_string_list_clear(&list, 0); |
| } |
| |
| static void t_string_list_remove_empty_items( |
| struct string_list *expected_strings, |
| struct string_list *list) |
| { |
| string_list_remove_empty_items(list, 0); |
| t_string_list_equal(list, expected_strings); |
| } |
| |
| void test_string_list__remove_empty_items(void) |
| { |
| struct string_list expected_strings = STRING_LIST_INIT_DUP; |
| struct string_list list = STRING_LIST_INIT_DUP; |
| |
| t_create_string_list_dup(&expected_strings, 0, NULL); |
| t_create_string_list_dup(&list, 0, "", "", "", NULL); |
| t_string_list_remove_empty_items(&expected_strings, &list); |
| |
| t_create_string_list_dup(&expected_strings, 0, "a", "b", NULL); |
| t_create_string_list_dup(&list, 0, "a", "", "b", "", NULL); |
| t_string_list_remove_empty_items(&expected_strings, &list); |
| |
| t_string_list_clear(&expected_strings, 0); |
| t_string_list_clear(&list, 0); |
| } |
| |
| static void t_string_list_unsorted_string_list_has_string( |
| struct string_list *list, |
| const char *str, int expected) |
| { |
| int has_string = unsorted_string_list_has_string(list, str); |
| cl_assert_equal_i(has_string, expected); |
| } |
| |
| void test_string_list__unsorted_string_list_has_string(void) |
| { |
| struct string_list list = STRING_LIST_INIT_DUP; |
| |
| t_create_string_list_dup(&list, 0, "b", "d", "a", NULL); |
| t_string_list_unsorted_string_list_has_string(&list, "a", 1); |
| t_string_list_unsorted_string_list_has_string(&list, "b", 1); |
| t_string_list_unsorted_string_list_has_string(&list, "c", 0); |
| t_string_list_unsorted_string_list_has_string(&list, "d", 1); |
| |
| t_string_list_clear(&list, 0); |
| } |
| |
| static void t_string_list_unsorted_string_list_delete_item( |
| struct string_list *expected_list, |
| struct string_list *list, |
| int i) |
| { |
| unsorted_string_list_delete_item(list, i, 0); |
| |
| t_string_list_equal(list, expected_list); |
| } |
| |
| void test_string_list__unsorted_string_list_delete_item(void) |
| { |
| struct string_list expected_strings = STRING_LIST_INIT_DUP; |
| struct string_list list = STRING_LIST_INIT_DUP; |
| |
| t_create_string_list_dup(&expected_strings, 0, "a", "c", "b", NULL); |
| t_create_string_list_dup(&list, 0, "a", "d", "b", "c", NULL); |
| t_string_list_unsorted_string_list_delete_item(&expected_strings, &list, 1); |
| |
| t_create_string_list_dup(&expected_strings, 0, NULL); |
| t_create_string_list_dup(&list, 0, "", NULL); |
| t_string_list_unsorted_string_list_delete_item(&expected_strings, &list, 0); |
| |
| t_create_string_list_dup(&expected_strings, 0, "a", "d", "c", "b", NULL); |
| t_create_string_list_dup(&list, 0, "a", "d", "c", "b", "d", NULL); |
| t_string_list_unsorted_string_list_delete_item(&expected_strings, &list, 4); |
| |
| t_string_list_clear(&expected_strings, 0); |
| t_string_list_clear(&list, 0); |
| } |