123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- /*
- * Copyright (C) 2009 Mamadou Diop.
- *
- * Contact: Mamadou Diop <diopmamadou(at)doubango.org>
- *
- * This file is part of Open Source Doubango Framework.
- *
- * DOUBANGO is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * DOUBANGO 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with DOUBANGO.
- *
- */
- #ifndef _TEST_LISTS_H_
- #define _TEST_LISTS_H_
- // (well-defined object declaration)
- typedef struct student_s {
- TSK_DECLARE_OBJECT;
- char *id;
- char *name;
- }
- student_t;
- // (constructor)
- static tsk_object_t* student_ctor(tsk_object_t* self, va_list * app)
- {
- student_t* student = (tsk_object_t*)self;
- if(student) {
- }
- return self;
- }
- // (destructor)
- static tsk_object_t* student_dtor(tsk_object_t* self)
- {
- student_t* student = (tsk_object_t*)self;
- TSK_FREE(student->id);
- TSK_FREE(student->name);
- return self;
- }
- // (case insensitive comparator)
- static int student_icmp(const tsk_object_t *self, const tsk_object_t *object)
- {
- const student_t* student1 = (const tsk_object_t*)self;
- const student_t* student2 = (const tsk_object_t*)object;
- if(!student1 || !student2) {
- return 0;// must never happen
- }
- return tsk_stricmp(student1->id, student2->id);
- }
- // (well-defined object declaration)
- static const tsk_object_def_t student_def_s = {
- sizeof(student_t),
- student_ctor,
- student_dtor,
- student_icmp
- };
- // create a stun object
- static student_t* student_create(const char* id, const char* name)
- {
- student_t* student;
- if((student = (student_t*)tsk_object_new(&student_def_s))) {
- student->id = tsk_strdup(id);
- student->name = tsk_strdup(name);
- }
- return student;
- }
- // predicate function to find a student by name
- static int pred_find_student_by_name(const tsk_list_item_t *item, const void *name)
- {
- if(item && item->data) {
- student_t *student = item->data;
- return tsk_striequals(student->name, name);
- }
- return -1;
- }
- // predicate function to find a student by id
- static int pred_find_student_by_id(const tsk_list_item_t *item, const void *id)
- {
- if(item && item->data) {
- student_t *student = item->data;
- return tsk_striequals(student->id, id);
- }
- return -1;
- }
- /* testing basic linked list */
- void test_basic_list()
- {
- tsk_list_t *list = tsk_list_create();
- tsk_list_item_t *item = tsk_list_item_create();
- /* add items to the list */
- item->data = tsk_string_create("First item");
- tsk_list_push_front_item(list, &item);
- item = tsk_list_item_create();
- item->data = tsk_string_create("Second item");
- tsk_list_push_back_item(list, &item);
- item = tsk_list_item_create();
- item->data = tsk_string_create("Third item");
- tsk_list_push_front_item(list, &item);
- item = tsk_list_item_create();
- item->data = tsk_string_create("Fourth item");
- tsk_list_push_back_item(list, &item);
- /* dump all items */
- tsk_list_foreach(item, list) {
- tsk_string_t* item_data = ((tsk_string_t*)item->data);
- printf("test_basic_list/// --> [%s]\n", item_data->value);
- }
- tsk_list_remove_item(list, list->tail);
- tsk_list_remove_item(list, list->tail);
- tsk_list_remove_item(list, list->tail);
- tsk_list_remove_item(list, list->tail);
- /* delete all items in the list */
- TSK_OBJECT_SAFE_FREE(list);
- }
- void test_filtered_list()
- {
- tsk_list_t *list = tsk_list_create();
- tsk_list_item_t *item = 0;
- /* add items to the list */
- {
- student_t *student2 = student_create("2", "student2");
- tsk_list_push_ascending_data(list, ((void**) &student2));
- }
- {
- student_t *student6 = student_create("6", "student6");
- tsk_list_push_ascending_data(list, ((void**) &student6));
- }
- {
- student_t *student1 = student_create("1", "student1");
- tsk_list_push_ascending_data(list, ((void**) &student1));
- }
- {
- student_t *student6 = student_create("6", "student6");
- tsk_list_push_ascending_data(list, ((void**) &student6));
- }
- {
- student_t *student6 = student_create("6", "student6");
- tsk_list_push_ascending_data(list, ((void**) &student6));
- }
- {
- student_t *student2 = student_create("2", "student2");
- tsk_list_push_ascending_data(list, ((void**) &student2));
- }
- {
- student_t *student2 = student_create("2", "student2");
- tsk_list_push_ascending_data(list, ((void**) &student2));
- }
- {
- student_t *student5 = student_create("5", "student5");
- tsk_list_push_ascending_data(list, ((void**) &student5));
- }
- {
- student_t *student4 = student_create("4", "student4");
- tsk_list_push_ascending_data(list, ((void**) &student4));
- }
- {
- student_t *student1 = student_create("1", "student1");
- tsk_list_push_ascending_data(list, ((void**) &student1));
- }
- {
- student_t *student1 = student_create("1", "student1");
- tsk_list_push_ascending_data(list, ((void**) &student1));
- }
- {
- student_t *student3 = student_create("3", "student3");
- tsk_list_push_ascending_data(list, ((void**) &student3));
- }
- {
- student_t *student6 = student_create("6", "student6");
- tsk_list_push_ascending_data(list, ((void**) &student6));
- }
- {
- student_t *student1 = student_create("1", "student1");
- tsk_list_push_ascending_data(list, ((void**) &student1));
- }
- {
- student_t *student3 = student_create("3", "student3");
- tsk_list_push_ascending_data(list, ((void**) &student3));
- }
- {
- student_t *student6 = student_create("6", "student6");
- tsk_list_push_ascending_data(list, ((void**) &student6));
- }
- /* dump all items */
- tsk_list_foreach(item, list) {
- student_t* item_data = item->data;
- TSK_DEBUG_INFO("test_filtered_list/// --> [id=%s and name=%s]", item_data->id, item_data->name);
- }
- /* delete all items in the list */
- TSK_OBJECT_SAFE_FREE(list);
- }
- void test_complex_list()
- {
- tsk_list_t *list = tsk_list_create();
- tsk_list_item_t *item = 0;
- /* add items to the list */
- {
- student_t *student1 = student_create("1", "student1");
- tsk_list_push_back_data(list, ((void**) &student1));
- }
- {
- student_t *student2 = student_create("2", "student2");
- tsk_list_push_front_data(list, ((void**) &student2));
- }
- {
- student_t *student3 = student_create("3", "student3");
- tsk_list_push_front_data(list, ((void**) &student3));
- }
- /* dump all items */
- tsk_list_foreach(item, list) {
- student_t* item_data = item->data;
- TSK_DEBUG_INFO("test_complex_list/// --> [id=%s and name=%s]", item_data->id, item_data->name);
- }
- /* Find student using tsk_object* */
- {
- student_t *student_to_find = student_create("1", "student1");
- const tsk_list_item_t *item_const = tsk_list_find_item_by_data(list, student_to_find);
- {
- const student_t* item_data_const = item_const->data;
- TSK_DEBUG_INFO("test_complex_list/// using tsk_object --> student with name==\"student1\" and id=\"%s\"", item_data_const->id);
- }
- TSK_OBJECT_SAFE_FREE(student_to_find);
- }
- /* Find student named "student2" using predicate */
- {
- const tsk_list_item_t *item_const = tsk_list_find_item_by_pred(list, pred_find_student_by_name, "student2");
- {
- const student_t* item_data_const = item_const->data;
- TSK_DEBUG_INFO("test_complex_list/// using predicate --> student with name==\"student2\" and id=\"%s\"", item_data_const->id);
- }
- }
- /* delete all items in the list */
- TSK_OBJECT_SAFE_FREE(list);
- }
- #endif /* _TEST_LISTS_H_ */
|