}
/** @} */
-
-#ifdef DBUS_ENABLE_EMBEDDED_TESTS
-#include "dbus-test.h"
-#include <stdio.h>
-
-static void
-verify_list (DBusList **list)
-{
- DBusList *link;
- int length;
-
- link = *list;
-
- if (link == NULL)
- return;
-
- if (link->next == link)
- {
- _dbus_assert (link->prev == link);
- _dbus_assert (*list == link);
- return;
- }
-
- length = 0;
- do
- {
- length += 1;
- _dbus_assert (link->prev->next == link);
- _dbus_assert (link->next->prev == link);
- link = link->next;
- }
- while (link != *list);
-
- _dbus_assert (length == _dbus_list_get_length (list));
-
- if (length == 1)
- _dbus_assert (_dbus_list_length_is_one (list));
- else
- _dbus_assert (!_dbus_list_length_is_one (list));
-}
-
-static dbus_bool_t
-is_ascending_sequence (DBusList **list)
-{
- DBusList *link;
- int prev;
-
- prev = _DBUS_INT_MIN;
-
- link = _dbus_list_get_first_link (list);
- while (link != NULL)
- {
- int v = _DBUS_POINTER_TO_INT (link->data);
-
- if (v <= prev)
- return FALSE;
-
- prev = v;
-
- link = _dbus_list_get_next_link (list, link);
- }
-
- return TRUE;
-}
-
-static dbus_bool_t
-is_descending_sequence (DBusList **list)
-{
- DBusList *link;
- int prev;
-
- prev = _DBUS_INT_MAX;
-
- link = _dbus_list_get_first_link (list);
- while (link != NULL)
- {
- int v = _DBUS_POINTER_TO_INT (link->data);
-
- if (v >= prev)
- return FALSE;
-
- prev = v;
-
- link = _dbus_list_get_next_link (list, link);
- }
-
- return TRUE;
-}
-
-static dbus_bool_t
-all_even_values (DBusList **list)
-{
- DBusList *link;
-
- link = _dbus_list_get_first_link (list);
- while (link != NULL)
- {
- int v = _DBUS_POINTER_TO_INT (link->data);
-
- if ((v % 2) != 0)
- return FALSE;
-
- link = _dbus_list_get_next_link (list, link);
- }
-
- return TRUE;
-}
-
-static dbus_bool_t
-all_odd_values (DBusList **list)
-{
- DBusList *link;
-
- link = _dbus_list_get_first_link (list);
- while (link != NULL)
- {
- int v = _DBUS_POINTER_TO_INT (link->data);
-
- if ((v % 2) == 0)
- return FALSE;
-
- link = _dbus_list_get_next_link (list, link);
- }
-
- return TRUE;
-}
-
-static dbus_bool_t
-lists_equal (DBusList **list1,
- DBusList **list2)
-{
- DBusList *link1;
- DBusList *link2;
-
- link1 = _dbus_list_get_first_link (list1);
- link2 = _dbus_list_get_first_link (list2);
- while (link1 && link2)
- {
- if (link1->data != link2->data)
- return FALSE;
-
- link1 = _dbus_list_get_next_link (list1, link1);
- link2 = _dbus_list_get_next_link (list2, link2);
- }
-
- if (link1 || link2)
- return FALSE;
-
- return TRUE;
-}
-
-/**
- * @ingroup DBusListInternals
- * Unit test for DBusList
- * @returns #TRUE on success.
- */
-dbus_bool_t
-_dbus_list_test (const char *test_data_dir _DBUS_GNUC_UNUSED)
-{
- DBusList *list1;
- DBusList *list2;
- DBusList *link1;
- DBusList *link2;
- DBusList *copy1;
- DBusList *copy2;
- int i;
-
- list1 = NULL;
- list2 = NULL;
-
- /* Test append and prepend */
-
- i = 0;
- while (i < 10)
- {
- if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("could not allocate for append");
-
- if (!_dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("count not allocate for prepend");
- ++i;
-
- verify_list (&list1);
- verify_list (&list2);
-
- _dbus_assert (_dbus_list_get_length (&list1) == i);
- _dbus_assert (_dbus_list_get_length (&list2) == i);
- }
-
- _dbus_assert (is_ascending_sequence (&list1));
- _dbus_assert (is_descending_sequence (&list2));
-
- /* Test list clear */
- _dbus_list_clear (&list1);
- _dbus_list_clear (&list2);
-
- verify_list (&list1);
- verify_list (&list2);
-
- /* Test get_first, get_last, pop_first, pop_last */
-
- i = 0;
- while (i < 10)
- {
- if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("could not allocate for append");
- if (!_dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("could not allocate for prepend");
- ++i;
- }
-
- --i;
- while (i >= 0)
- {
- void *got_data1;
- void *got_data2;
-
- void *data1;
- void *data2;
-
- got_data1 = _dbus_list_get_last (&list1);
- got_data2 = _dbus_list_get_first (&list2);
-
- data1 = _dbus_list_pop_last (&list1);
- data2 = _dbus_list_pop_first (&list2);
-
- _dbus_assert (got_data1 == data1);
- _dbus_assert (got_data2 == data2);
-
- _dbus_assert (_DBUS_POINTER_TO_INT (data1) == i);
- _dbus_assert (_DBUS_POINTER_TO_INT (data2) == i);
-
- verify_list (&list1);
- verify_list (&list2);
-
- _dbus_assert (is_ascending_sequence (&list1));
- _dbus_assert (is_descending_sequence (&list2));
-
- --i;
- }
-
- _dbus_assert (list1 == NULL);
- _dbus_assert (list2 == NULL);
-
- /* Test get_first_link, get_last_link, pop_first_link, pop_last_link */
-
- i = 0;
- while (i < 10)
- {
- if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("could not allocate for append");
- if (!_dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("could not allocate for prepend");
- ++i;
- }
-
- --i;
- while (i >= 0)
- {
- DBusList *got_link1;
- DBusList *got_link2;
-
- void *data1_indirect;
- void *data1;
- void *data2;
-
- got_link1 = _dbus_list_get_last_link (&list1);
- got_link2 = _dbus_list_get_first_link (&list2);
-
- link2 = _dbus_list_pop_first_link (&list2);
-
- _dbus_assert (got_link2 == link2);
-
- data1_indirect = got_link1->data;
- /* this call makes got_link1 invalid */
- data1 = _dbus_list_pop_last (&list1);
- _dbus_assert (data1 == data1_indirect);
- data2 = link2->data;
-
- _dbus_list_free_link (link2);
-
- _dbus_assert (_DBUS_POINTER_TO_INT (data1) == i);
- _dbus_assert (_DBUS_POINTER_TO_INT (data2) == i);
-
- verify_list (&list1);
- verify_list (&list2);
-
- _dbus_assert (is_ascending_sequence (&list1));
- _dbus_assert (is_descending_sequence (&list2));
-
- --i;
- }
-
- _dbus_assert (list1 == NULL);
- _dbus_assert (list2 == NULL);
-
- /* Test iteration */
-
- i = 0;
- while (i < 10)
- {
- if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("could not allocate for append");
- if (!_dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("could not allocate for prepend");
- ++i;
-
- verify_list (&list1);
- verify_list (&list2);
-
- _dbus_assert (_dbus_list_get_length (&list1) == i);
- _dbus_assert (_dbus_list_get_length (&list2) == i);
- }
-
- _dbus_assert (is_ascending_sequence (&list1));
- _dbus_assert (is_descending_sequence (&list2));
-
- --i;
- link2 = _dbus_list_get_first_link (&list2);
- while (link2 != NULL)
- {
- verify_list (&link2); /* pretend this link is the head */
-
- _dbus_assert (_DBUS_POINTER_TO_INT (link2->data) == i);
-
- link2 = _dbus_list_get_next_link (&list2, link2);
- --i;
- }
-
- i = 0;
- link1 = _dbus_list_get_first_link (&list1);
- while (link1 != NULL)
- {
- verify_list (&link1); /* pretend this link is the head */
-
- _dbus_assert (_DBUS_POINTER_TO_INT (link1->data) == i);
-
- link1 = _dbus_list_get_next_link (&list1, link1);
- ++i;
- }
-
- --i;
- link1 = _dbus_list_get_last_link (&list1);
- while (link1 != NULL)
- {
- verify_list (&link1); /* pretend this link is the head */
-
- _dbus_assert (_DBUS_POINTER_TO_INT (link1->data) == i);
-
- link1 = _dbus_list_get_prev_link (&list1, link1);
- --i;
- }
-
- _dbus_list_clear (&list1);
- _dbus_list_clear (&list2);
-
- /* Test remove */
-
- i = 0;
- while (i < 10)
- {
- if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("could not allocate for append");
- if (!_dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("could not allocate for prepend");
- ++i;
- }
-
- --i;
- while (i >= 0)
- {
- if ((i % 2) == 0)
- {
- if (!_dbus_list_remove (&list1, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("element should have been in list");
- if (!_dbus_list_remove (&list2, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("element should have been in list");
-
- verify_list (&list1);
- verify_list (&list2);
- }
- --i;
- }
-
- _dbus_assert (all_odd_values (&list1));
- _dbus_assert (all_odd_values (&list2));
-
- _dbus_list_clear (&list1);
- _dbus_list_clear (&list2);
-
- /* test removing the other half of the elements */
-
- i = 0;
- while (i < 10)
- {
- if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("could not allocate for append");
- if (!_dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("could not allocate for prepend");
- ++i;
- }
-
- --i;
- while (i >= 0)
- {
- if ((i % 2) != 0)
- {
- if (!_dbus_list_remove (&list1, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("element should have been in list");
- if (!_dbus_list_remove (&list2, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("element should have been in list");
-
- verify_list (&list1);
- verify_list (&list2);
- }
- --i;
- }
-
- _dbus_assert (all_even_values (&list1));
- _dbus_assert (all_even_values (&list2));
-
- /* clear list using remove_link */
- while (list1 != NULL)
- {
- _dbus_list_remove_link (&list1, list1);
- verify_list (&list1);
- }
- while (list2 != NULL)
- {
- _dbus_list_remove_link (&list2, list2);
- verify_list (&list2);
- }
-
- /* Test remove link more generally */
- i = 0;
- while (i < 10)
- {
- if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("could not allocate for append");
- if (!_dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("could not allocate for prepend");
- ++i;
- }
-
- --i;
- link2 = _dbus_list_get_first_link (&list2);
- while (link2 != NULL)
- {
- DBusList *next = _dbus_list_get_next_link (&list2, link2);
-
- _dbus_assert (_DBUS_POINTER_TO_INT (link2->data) == i);
-
- if ((i % 2) == 0)
- _dbus_list_remove_link (&list2, link2);
-
- verify_list (&list2);
-
- link2 = next;
- --i;
- }
-
- _dbus_assert (all_odd_values (&list2));
- _dbus_list_clear (&list2);
-
- i = 0;
- link1 = _dbus_list_get_first_link (&list1);
- while (link1 != NULL)
- {
- DBusList *next = _dbus_list_get_next_link (&list1, link1);
-
- _dbus_assert (_DBUS_POINTER_TO_INT (link1->data) == i);
-
- if ((i % 2) != 0)
- _dbus_list_remove_link (&list1, link1);
-
- verify_list (&list1);
-
- link1 = next;
- ++i;
- }
-
- _dbus_assert (all_even_values (&list1));
- _dbus_list_clear (&list1);
-
- /* Test copying a list */
- i = 0;
- while (i < 10)
- {
- if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("could not allocate for append");
- if (!_dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i)))
- _dbus_test_fatal ("could not allocate for prepend");
- ++i;
- }
-
- /* bad pointers, because they are allowed in the copy dest */
- copy1 = _DBUS_INT_TO_POINTER (0x342234);
- copy2 = _DBUS_INT_TO_POINTER (23);
-
- _dbus_list_copy (&list1, ©1);
- verify_list (&list1);
- verify_list (©1);
- _dbus_assert (lists_equal (&list1, ©1));
-
- _dbus_list_copy (&list2, ©2);
- verify_list (&list2);
- verify_list (©2);
- _dbus_assert (lists_equal (&list2, ©2));
-
- /* Now test copying empty lists */
- _dbus_list_clear (&list1);
- _dbus_list_clear (&list2);
- _dbus_list_clear (©1);
- _dbus_list_clear (©2);
-
- /* bad pointers, because they are allowed in the copy dest */
- copy1 = _DBUS_INT_TO_POINTER (0x342234);
- copy2 = _DBUS_INT_TO_POINTER (23);
-
- _dbus_list_copy (&list1, ©1);
- verify_list (&list1);
- verify_list (©1);
- _dbus_assert (lists_equal (&list1, ©1));
-
- _dbus_list_copy (&list2, ©2);
- verify_list (&list2);
- verify_list (©2);
- _dbus_assert (lists_equal (&list2, ©2));
-
- _dbus_list_clear (&list1);
- _dbus_list_clear (&list2);
-
- /* insert_after on empty list */
- _dbus_list_insert_after (&list1, NULL,
- _DBUS_INT_TO_POINTER (0));
- verify_list (&list1);
-
- /* inserting after first element */
- _dbus_list_insert_after (&list1, list1,
- _DBUS_INT_TO_POINTER (1));
- verify_list (&list1);
- _dbus_assert (is_ascending_sequence (&list1));
-
- /* inserting at the end */
- _dbus_list_insert_after (&list1, list1->next,
- _DBUS_INT_TO_POINTER (2));
- verify_list (&list1);
- _dbus_assert (is_ascending_sequence (&list1));
-
- /* using insert_after to prepend */
- _dbus_list_insert_after (&list1, NULL,
- _DBUS_INT_TO_POINTER (-1));
- verify_list (&list1);
- _dbus_assert (is_ascending_sequence (&list1));
-
- _dbus_list_clear (&list1);
-
- /* using remove_last */
- if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (2)))
- _dbus_test_fatal ("could not allocate for append");
- if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (1)))
- _dbus_test_fatal ("could not allocate for append");
- if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (3)))
- _dbus_test_fatal ("could not allocate for append");
-
- _dbus_list_remove_last (&list1, _DBUS_INT_TO_POINTER (2));
-
- verify_list (&list1);
- _dbus_assert (is_ascending_sequence (&list1));
-
- _dbus_list_clear (&list1);
-
- return TRUE;
-}
-
-#endif
* then you have added too many.
*/
-DBUS_PRIVATE_EXPORT
-dbus_bool_t _dbus_list_test (const char *test_data_dir);
-
DBUS_PRIVATE_EXPORT
dbus_bool_t _dbus_marshal_test (const char *test_data_dir);
#include "misc-internals.h"
+static void
+verify_list (DBusList **list)
+{
+ DBusList *link;
+ int length;
+
+ link = *list;
+
+ if (link == NULL)
+ return;
+
+ if (link->next == link)
+ {
+ _dbus_assert (link->prev == link);
+ _dbus_assert (*list == link);
+ return;
+ }
+
+ length = 0;
+ do
+ {
+ length += 1;
+ _dbus_assert (link->prev->next == link);
+ _dbus_assert (link->next->prev == link);
+ link = link->next;
+ }
+ while (link != *list);
+
+ _dbus_assert (length == _dbus_list_get_length (list));
+
+ if (length == 1)
+ _dbus_assert (_dbus_list_length_is_one (list));
+ else
+ _dbus_assert (!_dbus_list_length_is_one (list));
+}
+
+static dbus_bool_t
+is_ascending_sequence (DBusList **list)
+{
+ DBusList *link;
+ int prev;
+
+ prev = _DBUS_INT_MIN;
+
+ link = _dbus_list_get_first_link (list);
+ while (link != NULL)
+ {
+ int v = _DBUS_POINTER_TO_INT (link->data);
+
+ if (v <= prev)
+ return FALSE;
+
+ prev = v;
+
+ link = _dbus_list_get_next_link (list, link);
+ }
+
+ return TRUE;
+}
+
+static dbus_bool_t
+is_descending_sequence (DBusList **list)
+{
+ DBusList *link;
+ int prev;
+
+ prev = _DBUS_INT_MAX;
+
+ link = _dbus_list_get_first_link (list);
+ while (link != NULL)
+ {
+ int v = _DBUS_POINTER_TO_INT (link->data);
+
+ if (v >= prev)
+ return FALSE;
+
+ prev = v;
+
+ link = _dbus_list_get_next_link (list, link);
+ }
+
+ return TRUE;
+}
+
+static dbus_bool_t
+all_even_values (DBusList **list)
+{
+ DBusList *link;
+
+ link = _dbus_list_get_first_link (list);
+ while (link != NULL)
+ {
+ int v = _DBUS_POINTER_TO_INT (link->data);
+
+ if ((v % 2) != 0)
+ return FALSE;
+
+ link = _dbus_list_get_next_link (list, link);
+ }
+
+ return TRUE;
+}
+
+static dbus_bool_t
+all_odd_values (DBusList **list)
+{
+ DBusList *link;
+
+ link = _dbus_list_get_first_link (list);
+ while (link != NULL)
+ {
+ int v = _DBUS_POINTER_TO_INT (link->data);
+
+ if ((v % 2) == 0)
+ return FALSE;
+
+ link = _dbus_list_get_next_link (list, link);
+ }
+
+ return TRUE;
+}
+
+static dbus_bool_t
+lists_equal (DBusList **list1,
+ DBusList **list2)
+{
+ DBusList *link1;
+ DBusList *link2;
+
+ link1 = _dbus_list_get_first_link (list1);
+ link2 = _dbus_list_get_first_link (list2);
+ while (link1 && link2)
+ {
+ if (link1->data != link2->data)
+ return FALSE;
+
+ link1 = _dbus_list_get_next_link (list1, link1);
+ link2 = _dbus_list_get_next_link (list2, link2);
+ }
+
+ if (link1 || link2)
+ return FALSE;
+
+ return TRUE;
+}
+
+/**
+ * @ingroup DBusListInternals
+ * Unit test for DBusList
+ * @returns #TRUE on success.
+ */
+static dbus_bool_t
+_dbus_list_test (const char *test_data_dir _DBUS_GNUC_UNUSED)
+{
+ DBusList *list1;
+ DBusList *list2;
+ DBusList *link1;
+ DBusList *link2;
+ DBusList *copy1;
+ DBusList *copy2;
+ int i;
+
+ list1 = NULL;
+ list2 = NULL;
+
+ /* Test append and prepend */
+
+ i = 0;
+ while (i < 10)
+ {
+ if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("could not allocate for append");
+
+ if (!_dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("count not allocate for prepend");
+ ++i;
+
+ verify_list (&list1);
+ verify_list (&list2);
+
+ _dbus_assert (_dbus_list_get_length (&list1) == i);
+ _dbus_assert (_dbus_list_get_length (&list2) == i);
+ }
+
+ _dbus_assert (is_ascending_sequence (&list1));
+ _dbus_assert (is_descending_sequence (&list2));
+
+ /* Test list clear */
+ _dbus_list_clear (&list1);
+ _dbus_list_clear (&list2);
+
+ verify_list (&list1);
+ verify_list (&list2);
+
+ /* Test get_first, get_last, pop_first, pop_last */
+
+ i = 0;
+ while (i < 10)
+ {
+ if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("could not allocate for append");
+ if (!_dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("could not allocate for prepend");
+ ++i;
+ }
+
+ --i;
+ while (i >= 0)
+ {
+ void *got_data1;
+ void *got_data2;
+
+ void *data1;
+ void *data2;
+
+ got_data1 = _dbus_list_get_last (&list1);
+ got_data2 = _dbus_list_get_first (&list2);
+
+ data1 = _dbus_list_pop_last (&list1);
+ data2 = _dbus_list_pop_first (&list2);
+
+ _dbus_assert (got_data1 == data1);
+ _dbus_assert (got_data2 == data2);
+
+ _dbus_assert (_DBUS_POINTER_TO_INT (data1) == i);
+ _dbus_assert (_DBUS_POINTER_TO_INT (data2) == i);
+
+ verify_list (&list1);
+ verify_list (&list2);
+
+ _dbus_assert (is_ascending_sequence (&list1));
+ _dbus_assert (is_descending_sequence (&list2));
+
+ --i;
+ }
+
+ _dbus_assert (list1 == NULL);
+ _dbus_assert (list2 == NULL);
+
+ /* Test get_first_link, get_last_link, pop_first_link, pop_last_link */
+
+ i = 0;
+ while (i < 10)
+ {
+ if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("could not allocate for append");
+ if (!_dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("could not allocate for prepend");
+ ++i;
+ }
+
+ --i;
+ while (i >= 0)
+ {
+ DBusList *got_link1;
+ DBusList *got_link2;
+
+ void *data1_indirect;
+ void *data1;
+ void *data2;
+
+ got_link1 = _dbus_list_get_last_link (&list1);
+ got_link2 = _dbus_list_get_first_link (&list2);
+
+ link2 = _dbus_list_pop_first_link (&list2);
+
+ _dbus_assert (got_link2 == link2);
+
+ data1_indirect = got_link1->data;
+ /* this call makes got_link1 invalid */
+ data1 = _dbus_list_pop_last (&list1);
+ _dbus_assert (data1 == data1_indirect);
+ data2 = link2->data;
+
+ _dbus_list_free_link (link2);
+
+ _dbus_assert (_DBUS_POINTER_TO_INT (data1) == i);
+ _dbus_assert (_DBUS_POINTER_TO_INT (data2) == i);
+
+ verify_list (&list1);
+ verify_list (&list2);
+
+ _dbus_assert (is_ascending_sequence (&list1));
+ _dbus_assert (is_descending_sequence (&list2));
+
+ --i;
+ }
+
+ _dbus_assert (list1 == NULL);
+ _dbus_assert (list2 == NULL);
+
+ /* Test iteration */
+
+ i = 0;
+ while (i < 10)
+ {
+ if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("could not allocate for append");
+ if (!_dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("could not allocate for prepend");
+ ++i;
+
+ verify_list (&list1);
+ verify_list (&list2);
+
+ _dbus_assert (_dbus_list_get_length (&list1) == i);
+ _dbus_assert (_dbus_list_get_length (&list2) == i);
+ }
+
+ _dbus_assert (is_ascending_sequence (&list1));
+ _dbus_assert (is_descending_sequence (&list2));
+
+ --i;
+ link2 = _dbus_list_get_first_link (&list2);
+ while (link2 != NULL)
+ {
+ verify_list (&link2); /* pretend this link is the head */
+
+ _dbus_assert (_DBUS_POINTER_TO_INT (link2->data) == i);
+
+ link2 = _dbus_list_get_next_link (&list2, link2);
+ --i;
+ }
+
+ i = 0;
+ link1 = _dbus_list_get_first_link (&list1);
+ while (link1 != NULL)
+ {
+ verify_list (&link1); /* pretend this link is the head */
+
+ _dbus_assert (_DBUS_POINTER_TO_INT (link1->data) == i);
+
+ link1 = _dbus_list_get_next_link (&list1, link1);
+ ++i;
+ }
+
+ --i;
+ link1 = _dbus_list_get_last_link (&list1);
+ while (link1 != NULL)
+ {
+ verify_list (&link1); /* pretend this link is the head */
+
+ _dbus_assert (_DBUS_POINTER_TO_INT (link1->data) == i);
+
+ link1 = _dbus_list_get_prev_link (&list1, link1);
+ --i;
+ }
+
+ _dbus_list_clear (&list1);
+ _dbus_list_clear (&list2);
+
+ /* Test remove */
+
+ i = 0;
+ while (i < 10)
+ {
+ if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("could not allocate for append");
+ if (!_dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("could not allocate for prepend");
+ ++i;
+ }
+
+ --i;
+ while (i >= 0)
+ {
+ if ((i % 2) == 0)
+ {
+ if (!_dbus_list_remove (&list1, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("element should have been in list");
+ if (!_dbus_list_remove (&list2, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("element should have been in list");
+
+ verify_list (&list1);
+ verify_list (&list2);
+ }
+ --i;
+ }
+
+ _dbus_assert (all_odd_values (&list1));
+ _dbus_assert (all_odd_values (&list2));
+
+ _dbus_list_clear (&list1);
+ _dbus_list_clear (&list2);
+
+ /* test removing the other half of the elements */
+
+ i = 0;
+ while (i < 10)
+ {
+ if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("could not allocate for append");
+ if (!_dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("could not allocate for prepend");
+ ++i;
+ }
+
+ --i;
+ while (i >= 0)
+ {
+ if ((i % 2) != 0)
+ {
+ if (!_dbus_list_remove (&list1, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("element should have been in list");
+ if (!_dbus_list_remove (&list2, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("element should have been in list");
+
+ verify_list (&list1);
+ verify_list (&list2);
+ }
+ --i;
+ }
+
+ _dbus_assert (all_even_values (&list1));
+ _dbus_assert (all_even_values (&list2));
+
+ /* clear list using remove_link */
+ while (list1 != NULL)
+ {
+ _dbus_list_remove_link (&list1, list1);
+ verify_list (&list1);
+ }
+ while (list2 != NULL)
+ {
+ _dbus_list_remove_link (&list2, list2);
+ verify_list (&list2);
+ }
+
+ /* Test remove link more generally */
+ i = 0;
+ while (i < 10)
+ {
+ if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("could not allocate for append");
+ if (!_dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("could not allocate for prepend");
+ ++i;
+ }
+
+ --i;
+ link2 = _dbus_list_get_first_link (&list2);
+ while (link2 != NULL)
+ {
+ DBusList *next = _dbus_list_get_next_link (&list2, link2);
+
+ _dbus_assert (_DBUS_POINTER_TO_INT (link2->data) == i);
+
+ if ((i % 2) == 0)
+ _dbus_list_remove_link (&list2, link2);
+
+ verify_list (&list2);
+
+ link2 = next;
+ --i;
+ }
+
+ _dbus_assert (all_odd_values (&list2));
+ _dbus_list_clear (&list2);
+
+ i = 0;
+ link1 = _dbus_list_get_first_link (&list1);
+ while (link1 != NULL)
+ {
+ DBusList *next = _dbus_list_get_next_link (&list1, link1);
+
+ _dbus_assert (_DBUS_POINTER_TO_INT (link1->data) == i);
+
+ if ((i % 2) != 0)
+ _dbus_list_remove_link (&list1, link1);
+
+ verify_list (&list1);
+
+ link1 = next;
+ ++i;
+ }
+
+ _dbus_assert (all_even_values (&list1));
+ _dbus_list_clear (&list1);
+
+ /* Test copying a list */
+ i = 0;
+ while (i < 10)
+ {
+ if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("could not allocate for append");
+ if (!_dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i)))
+ _dbus_test_fatal ("could not allocate for prepend");
+ ++i;
+ }
+
+ /* bad pointers, because they are allowed in the copy dest */
+ copy1 = _DBUS_INT_TO_POINTER (0x342234);
+ copy2 = _DBUS_INT_TO_POINTER (23);
+
+ _dbus_list_copy (&list1, ©1);
+ verify_list (&list1);
+ verify_list (©1);
+ _dbus_assert (lists_equal (&list1, ©1));
+
+ _dbus_list_copy (&list2, ©2);
+ verify_list (&list2);
+ verify_list (©2);
+ _dbus_assert (lists_equal (&list2, ©2));
+
+ /* Now test copying empty lists */
+ _dbus_list_clear (&list1);
+ _dbus_list_clear (&list2);
+ _dbus_list_clear (©1);
+ _dbus_list_clear (©2);
+
+ /* bad pointers, because they are allowed in the copy dest */
+ copy1 = _DBUS_INT_TO_POINTER (0x342234);
+ copy2 = _DBUS_INT_TO_POINTER (23);
+
+ _dbus_list_copy (&list1, ©1);
+ verify_list (&list1);
+ verify_list (©1);
+ _dbus_assert (lists_equal (&list1, ©1));
+
+ _dbus_list_copy (&list2, ©2);
+ verify_list (&list2);
+ verify_list (©2);
+ _dbus_assert (lists_equal (&list2, ©2));
+
+ _dbus_list_clear (&list1);
+ _dbus_list_clear (&list2);
+
+ /* insert_after on empty list */
+ _dbus_list_insert_after (&list1, NULL,
+ _DBUS_INT_TO_POINTER (0));
+ verify_list (&list1);
+
+ /* inserting after first element */
+ _dbus_list_insert_after (&list1, list1,
+ _DBUS_INT_TO_POINTER (1));
+ verify_list (&list1);
+ _dbus_assert (is_ascending_sequence (&list1));
+
+ /* inserting at the end */
+ _dbus_list_insert_after (&list1, list1->next,
+ _DBUS_INT_TO_POINTER (2));
+ verify_list (&list1);
+ _dbus_assert (is_ascending_sequence (&list1));
+
+ /* using insert_after to prepend */
+ _dbus_list_insert_after (&list1, NULL,
+ _DBUS_INT_TO_POINTER (-1));
+ verify_list (&list1);
+ _dbus_assert (is_ascending_sequence (&list1));
+
+ _dbus_list_clear (&list1);
+
+ /* using remove_last */
+ if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (2)))
+ _dbus_test_fatal ("could not allocate for append");
+ if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (1)))
+ _dbus_test_fatal ("could not allocate for append");
+ if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (3)))
+ _dbus_test_fatal ("could not allocate for append");
+
+ _dbus_list_remove_last (&list1, _DBUS_INT_TO_POINTER (2));
+
+ verify_list (&list1);
+ _dbus_assert (is_ascending_sequence (&list1));
+
+ _dbus_list_clear (&list1);
+
+ return TRUE;
+}
+
static dbus_bool_t
_dbus_misc_test (const char *test_data_dir _DBUS_GNUC_UNUSED)
{