/* * Copyright (C) 2015 Intel Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, see <http://www.gnu.org/licenses/>. */ #include <stdio.h> #include <stdlib.h> #include <libkmod/libkmod-internal.h> /* FIXME: hack, change name so we don't clash */ #undef ERR #include "testsuite.h" static int len(struct kmod_list *list) { int count = 0; struct kmod_list *l; kmod_list_foreach(l, list) count++; return count; } static int test_list_last(const struct test *t) { struct kmod_list *list = NULL, *last; int i; const char *v[] = { "v1", "v2", "v3", "v4", "v5" }; const int N = ARRAY_SIZE(v); for (i = 0; i < N; i++) list = kmod_list_append(list, v[i]); assert_return(len(list) == N, EXIT_FAILURE); last = kmod_list_last(list); assert_return(last->data == v[N - 1], EXIT_FAILURE); return 0; } DEFINE_TEST(test_list_last, .description = "test for the last element of a list"); static int test_list_prev(const struct test *t) { struct kmod_list *list = NULL, *l, *p; int i; const char *v[] = { "v1", "v2", "v3", "v4", "v5" }; const int N = ARRAY_SIZE(v); l = kmod_list_prev(list, list); assert_return(l == NULL, EXIT_FAILURE); for (i = 0; i < N; i++) list = kmod_list_append(list, v[i]); l = kmod_list_prev(list, list); assert_return(l == NULL, EXIT_FAILURE); l = list; for (i = 0; i < N - 1; i++) { l = kmod_list_next(list, l); p = kmod_list_prev(list, l); assert_return(p->data == v[i], EXIT_FAILURE); } return 0; } DEFINE_TEST(test_list_prev, .description = "test list prev"); static int test_list_remove_n_latest(const struct test *t) { struct kmod_list *list = NULL, *l; int i; const char *v[] = { "v1", "v2", "v3", "v4", "v5" }; const int N = ARRAY_SIZE(v), M = N / 2; for (i = 0; i < N; i++) list = kmod_list_append(list, v[i]); assert_return(len(list) == N, EXIT_FAILURE); list = kmod_list_remove_n_latest(list, M); assert_return(len(list) == N - M, EXIT_FAILURE); i = 0; kmod_list_foreach (l, list) { assert_return(l->data == v[i], EXIT_FAILURE); i++; } return 0; } DEFINE_TEST(test_list_remove_n_latest, .description = "test list function to remove n latest elements"); static int test_list_remove_data(const struct test *t) { struct kmod_list *list = NULL, *l; int i; const char *v[] = { "v1", "v2", "v3", "v4", "v5" }, *removed; const int N = ARRAY_SIZE(v); for (i = 0; i < N; i++) list = kmod_list_append(list, v[i]); removed = v[N / 2]; list = kmod_list_remove_data(list, removed); assert_return(len(list) == N - 1, EXIT_FAILURE); kmod_list_foreach (l, list) assert_return(l->data != removed, EXIT_FAILURE); return 0; } DEFINE_TEST(test_list_remove_data, .description = "test list function to remove element by data"); static int test_list_append_list(const struct test *t) { struct kmod_list *a = NULL, *b = NULL, *c, *l; int i; const char *v[] = { "v1", "v2", "v3", "v4", "v5" }; const int N = ARRAY_SIZE(v), M = N / 2; for (i = 0; i < M; i++) a = kmod_list_append(a, v[i]); assert_return(len(a) == M, EXIT_FAILURE); for (i = M; i < N; i++) b = kmod_list_append(b, v[i]); assert_return(len(b) == N - M, EXIT_FAILURE); a = kmod_list_append_list(a, NULL); assert_return(len(a) == M, EXIT_FAILURE); b = kmod_list_append_list(NULL, b); assert_return(len(b) == N - M, EXIT_FAILURE); c = kmod_list_append_list(a, b); assert_return(len(c) == N, EXIT_FAILURE); i = 0; kmod_list_foreach (l, c) { assert_return(l->data == v[i], EXIT_FAILURE); i++; } return 0; } DEFINE_TEST(test_list_append_list, .description = "test list function to append another list"); static int test_list_insert_before(const struct test *t) { struct kmod_list *list = NULL, *l; const char *v1 = "v1", *v2 = "v2", *v3 = "v3", *vx = "vx"; list = kmod_list_insert_before(list, v3); assert_return(len(list) == 1, EXIT_FAILURE); list = kmod_list_insert_before(list, v2); list = kmod_list_insert_before(list, v1); assert_return(len(list) == 3, EXIT_FAILURE); l = list; assert_return(l->data == v1, EXIT_FAILURE); l = kmod_list_next(list, l); assert_return(l->data == v2, EXIT_FAILURE); l = kmod_list_insert_before(l, vx); assert_return(len(list) == 4, EXIT_FAILURE); assert_return(l->data == vx, EXIT_FAILURE); l = kmod_list_next(list, l); assert_return(l->data == v2, EXIT_FAILURE); l = kmod_list_next(list, l); assert_return(l->data == v3, EXIT_FAILURE); return 0; } DEFINE_TEST(test_list_insert_before, .description = "test list function to insert before element"); static int test_list_insert_after(const struct test *t) { struct kmod_list *list = NULL, *l; const char *v1 = "v1", *v2 = "v2", *v3 = "v3", *vx = "vx"; list = kmod_list_insert_after(list, v1); assert_return(len(list) == 1, EXIT_FAILURE); list = kmod_list_insert_after(list, v3); list = kmod_list_insert_after(list, v2); assert_return(len(list) == 3, EXIT_FAILURE); l = list; assert_return(l->data == v1, EXIT_FAILURE); l = kmod_list_insert_after(l, vx); assert_return(len(list) == 4, EXIT_FAILURE); assert_return(l->data == v1, EXIT_FAILURE); l = kmod_list_next(list, l); assert_return(l->data == vx, EXIT_FAILURE); l = kmod_list_next(list, l); assert_return(l->data == v2, EXIT_FAILURE); l = kmod_list_next(list, l); assert_return(l->data == v3, EXIT_FAILURE); return 0; } DEFINE_TEST(test_list_insert_after, .description = "test list function to insert after element"); TESTSUITE_MAIN();