Lumiera  0.pre.03
»edit your freedom«
test-llist.c
Go to the documentation of this file.
1 /*
2  TEST-LLIST - test the linked list lib
3 
4  Copyright (C) Lumiera.org
5  2008, Christian Thaeter <ct@pipapo.org>
6 
7  This program is free software; you can redistribute it and/or
8  modify it under the terms of the GNU General Public License as
9  published by the Free Software Foundation; either version 2 of
10  the License, or (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program; if not, write to the Free Software
19  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 
21 * *****************************************************/
22 
29 #include <nobug.h>
30 
31 #include "lib/llist.h"
32 #include "lib/test/test.h"
33 
34 TESTS_BEGIN
35 
36 TEST (basic)
37 {
38  LLIST_AUTO (node1);
39 
40  llist node2;
41  llist_init (&node2);
42 
43  printf ("%d\n", llist_is_empty (&node1));
44  printf ("%d\n", llist_is_empty (&node2));
45 }
46 
47 TEST (nodeinsert)
48 {
49  LLIST_AUTO (list);
50  LLIST_AUTO (node1);
51  LLIST_AUTO (node2);
52  LLIST_AUTO (node3);
53 
54  llist_insert_next (&list, &node1);
55  printf ("%d\n", llist_is_empty (&list));
56  printf ("%d\n", llist_is_empty (&node1));
57  printf ("%d\n", llist_is_single (&node1));
58  llist_insert_next (&node1, &node2);
59  printf ("%d\n", llist_is_single (&node1));
60  llist_insert_prev (&node1, &node3);
61  printf ("%d\n", llist_next (&list) == &node3);
62  printf ("%d\n", llist_next (&node3) == &node1);
63  printf ("%d\n", llist_next (&node1) == &node2);
64  printf ("%d\n", llist_prev (&list) == &node2);
65  printf ("%d\n", llist_count (&list));
66 }
67 
68 TEST (predicates)
69 {
70  LLIST_AUTO (list);
71  LLIST_AUTO (node1);
72  LLIST_AUTO (node2);
73  LLIST_AUTO (node3);
74  LLIST_AUTO (node4);
75  LLIST_AUTO (nil);
76 
77  llist_insert_tail (&list, &node2);
78  llist_insert_tail (&list, &node3);
79  llist_insert_tail (&list, &node4);
80  llist_insert_head (&list, &node1);
81 
82  printf ("%d\n", llist_is_head (&list, &node1));
83  printf ("%d\n", llist_is_tail (&list, &node4));
84  printf ("%d\n", llist_is_head (&list, &node4));
85  printf ("%d\n", llist_is_tail (&list, &node1));
86  printf ("%d\n", llist_is_end (&list, &list));
87  printf ("%d\n", llist_is_member (&list, &node3));
88  printf ("%d\n", llist_is_member (&list, &nil));
89 
90  printf ("%d\n", llist_is_before_after (&list, &node1, &node3));
91  printf ("%d\n", llist_is_before_after (&list, &node3, &node1));
92  printf ("%d\n", llist_is_before_after (&list, &node1, &nil));
93 }
94 
95 TEST (unlink)
96 {
97  LLIST_AUTO (list);
98  LLIST_AUTO (node1);
99  LLIST_AUTO (node2);
100  LLIST_AUTO (node3);
101  LLIST_AUTO (node4);
102  LLIST_AUTO (nil);
103 
104  llist_insert_tail (&list, &node2);
105  llist_insert_tail (&list, &node3);
106  llist_insert_tail (&list, &node4);
107  llist_insert_head (&list, &node1);
108 
109  LLIST_FOREACH_REV (&list, itr)
110  {
111  if(itr == &node1) printf ("node1 ");
112  else if(itr == &node2) printf ("node2 ");
113  else if(itr == &node3) printf ("node3 ");
114  else if(itr == &node4) printf ("node4 ");
115  else printf ("unknown ");
116  }
117  printf (".\n");
118 
119  llist_unlink (&nil);
120  llist_unlink (&node2);
121  llist_unlink (&node3);
122 
123  LLIST_FOREACH (&list, itr)
124  {
125  if(itr == &node1) printf ("node1 ");
126  else if(itr == &node2) printf ("node2 ");
127  else if(itr == &node3) printf ("node3 ");
128  else if(itr == &node4) printf ("node4 ");
129  else printf ("unknown ");
130  }
131  printf (".\n");
132  printf ("%d\n", llist_is_empty (&node2));
133  printf ("%d\n", llist_is_empty (&node3));
134  printf ("%d\n", llist_is_empty (&nil));
135 }
136 
137 TEST (whiles)
138 {
139  LLIST_AUTO (list);
140  LLIST_AUTO (node1);
141  LLIST_AUTO (node2);
142  LLIST_AUTO (node3);
143  LLIST_AUTO (node4);
144  LLIST_AUTO (nil);
145 
146  llist_insert_tail (&list, &node2);
147  llist_insert_tail (&list, &node3);
148  llist_insert_tail (&list, &node4);
149  llist_insert_head (&list, &node1);
150 
151  LLIST_FOREACH_REV (&list, itr)
152  {
153  if(itr == &node1) printf ("node1 ");
154  else if(itr == &node2) printf ("node2 ");
155  else if(itr == &node3) printf ("node3 ");
156  else if(itr == &node4) printf ("node4 ");
157  else printf ("unknown ");
158  }
159  printf (".\n");
160 
161  LLIST_WHILE_HEAD (&list, head)
162  llist_unlink (head);
163 
164  LLIST_FOREACH (&list, itr)
165  {
166  if(itr == &node1) printf ("node1 ");
167  else if(itr == &node2) printf ("node2 ");
168  else if(itr == &node3) printf ("node3 ");
169  else if(itr == &node4) printf ("node4 ");
170  else printf ("unknown ");
171  }
172  printf (".\n");
173 
174  llist_insert_tail (&list, &node2);
175  llist_insert_tail (&list, &node3);
176  llist_insert_tail (&list, &node4);
177  llist_insert_head (&list, &node1);
178 
179  LLIST_WHILE_TAIL (&list, tail)
180  llist_unlink (tail);
181 
182  LLIST_FOREACH (&list, itr)
183  {
184  if(itr == &node1) printf ("node1 ");
185  else if(itr == &node2) printf ("node2 ");
186  else if(itr == &node3) printf ("node3 ");
187  else if(itr == &node4) printf ("node4 ");
188  else printf ("unknown ");
189  }
190  printf (".\n");
191 }
192 
193 
194 TEST (relocate)
195 {
196  llist source;
197  llist_init (&source);
198 
199  llist something;
200  llist_init (&something);
201 
202  llist_insert_head (&source, &something);
203 
204  llist target = {NULL,NULL};
205 
206  target = source;
207 
208  llist_relocate (&target);
209  CHECK (llist_is_head (&target, &something));
210 }
211 
212 
213 TESTS_END
Helpers and support macros for defining test executables in C.
#define LLIST_AUTO(name)
Macro to instantiate a local llist.
Definition: llist.h:99
#define LLIST_FOREACH_REV(list, node)
Iterate backward over a list.
Definition: llist.h:139
#define LLIST_FOREACH(list, node)
Iterate forward over a list.
Definition: llist.h:129
Intrusive cyclic double linked list There is only one node type which contains a forward and a backwa...
#define LLIST_WHILE_TAIL(list, tail)
Consume a list from tail.
Definition: llist.h:185
#define LLIST_WHILE_HEAD(list, head)
Consume a list from head.
Definition: llist.h:174