1*84e872a0SLloyd Pique /*
2*84e872a0SLloyd Pique * Copyright © 2012 Intel Corporation
3*84e872a0SLloyd Pique *
4*84e872a0SLloyd Pique * Permission is hereby granted, free of charge, to any person obtaining
5*84e872a0SLloyd Pique * a copy of this software and associated documentation files (the
6*84e872a0SLloyd Pique * "Software"), to deal in the Software without restriction, including
7*84e872a0SLloyd Pique * without limitation the rights to use, copy, modify, merge, publish,
8*84e872a0SLloyd Pique * distribute, sublicense, and/or sell copies of the Software, and to
9*84e872a0SLloyd Pique * permit persons to whom the Software is furnished to do so, subject to
10*84e872a0SLloyd Pique * the following conditions:
11*84e872a0SLloyd Pique *
12*84e872a0SLloyd Pique * The above copyright notice and this permission notice (including the
13*84e872a0SLloyd Pique * next paragraph) shall be included in all copies or substantial
14*84e872a0SLloyd Pique * portions of the Software.
15*84e872a0SLloyd Pique *
16*84e872a0SLloyd Pique * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17*84e872a0SLloyd Pique * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18*84e872a0SLloyd Pique * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19*84e872a0SLloyd Pique * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20*84e872a0SLloyd Pique * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21*84e872a0SLloyd Pique * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22*84e872a0SLloyd Pique * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23*84e872a0SLloyd Pique * SOFTWARE.
24*84e872a0SLloyd Pique */
25*84e872a0SLloyd Pique
26*84e872a0SLloyd Pique #include <stdio.h>
27*84e872a0SLloyd Pique #include <stdlib.h>
28*84e872a0SLloyd Pique #include <assert.h>
29*84e872a0SLloyd Pique #include "wayland-private.h"
30*84e872a0SLloyd Pique #include "test-runner.h"
31*84e872a0SLloyd Pique
TEST(list_init)32*84e872a0SLloyd Pique TEST(list_init)
33*84e872a0SLloyd Pique {
34*84e872a0SLloyd Pique struct wl_list list;
35*84e872a0SLloyd Pique
36*84e872a0SLloyd Pique wl_list_init(&list);
37*84e872a0SLloyd Pique assert(list.next == &list);
38*84e872a0SLloyd Pique assert(list.prev == &list);
39*84e872a0SLloyd Pique assert(wl_list_empty(&list));
40*84e872a0SLloyd Pique }
41*84e872a0SLloyd Pique
42*84e872a0SLloyd Pique struct element {
43*84e872a0SLloyd Pique int i;
44*84e872a0SLloyd Pique struct wl_list link;
45*84e872a0SLloyd Pique };
46*84e872a0SLloyd Pique
TEST(list_insert)47*84e872a0SLloyd Pique TEST(list_insert)
48*84e872a0SLloyd Pique {
49*84e872a0SLloyd Pique struct wl_list list;
50*84e872a0SLloyd Pique struct element e;
51*84e872a0SLloyd Pique
52*84e872a0SLloyd Pique wl_list_init(&list);
53*84e872a0SLloyd Pique wl_list_insert(&list, &e.link);
54*84e872a0SLloyd Pique assert(list.next == &e.link);
55*84e872a0SLloyd Pique assert(list.prev == &e.link);
56*84e872a0SLloyd Pique assert(e.link.next == &list);
57*84e872a0SLloyd Pique assert(e.link.prev == &list);
58*84e872a0SLloyd Pique }
59*84e872a0SLloyd Pique
TEST(list_length)60*84e872a0SLloyd Pique TEST(list_length)
61*84e872a0SLloyd Pique {
62*84e872a0SLloyd Pique struct wl_list list;
63*84e872a0SLloyd Pique struct element e;
64*84e872a0SLloyd Pique
65*84e872a0SLloyd Pique wl_list_init(&list);
66*84e872a0SLloyd Pique assert(wl_list_length(&list) == 0);
67*84e872a0SLloyd Pique wl_list_insert(&list, &e.link);
68*84e872a0SLloyd Pique assert(wl_list_length(&list) == 1);
69*84e872a0SLloyd Pique wl_list_remove(&e.link);
70*84e872a0SLloyd Pique assert(wl_list_length(&list) == 0);
71*84e872a0SLloyd Pique }
72*84e872a0SLloyd Pique
TEST(list_iterator)73*84e872a0SLloyd Pique TEST(list_iterator)
74*84e872a0SLloyd Pique {
75*84e872a0SLloyd Pique struct wl_list list;
76*84e872a0SLloyd Pique struct element e1, e2, e3, e4, *e;
77*84e872a0SLloyd Pique int reference[] = { 708090, 102030, 5588, 12 };
78*84e872a0SLloyd Pique unsigned int i;
79*84e872a0SLloyd Pique
80*84e872a0SLloyd Pique e1.i = 708090;
81*84e872a0SLloyd Pique e2.i = 102030;
82*84e872a0SLloyd Pique e3.i = 5588;
83*84e872a0SLloyd Pique e4.i = 12;
84*84e872a0SLloyd Pique
85*84e872a0SLloyd Pique wl_list_init(&list);
86*84e872a0SLloyd Pique wl_list_insert(list.prev, &e1.link);
87*84e872a0SLloyd Pique wl_list_insert(list.prev, &e2.link);
88*84e872a0SLloyd Pique wl_list_insert(list.prev, &e3.link);
89*84e872a0SLloyd Pique wl_list_insert(list.prev, &e4.link);
90*84e872a0SLloyd Pique
91*84e872a0SLloyd Pique i = 0;
92*84e872a0SLloyd Pique wl_list_for_each(e, &list, link) {
93*84e872a0SLloyd Pique assert(i < ARRAY_LENGTH(reference));
94*84e872a0SLloyd Pique assert(e->i == reference[i]);
95*84e872a0SLloyd Pique i++;
96*84e872a0SLloyd Pique }
97*84e872a0SLloyd Pique assert(i == ARRAY_LENGTH(reference));
98*84e872a0SLloyd Pique
99*84e872a0SLloyd Pique i = 0;
100*84e872a0SLloyd Pique wl_list_for_each_reverse(e, &list, link) {
101*84e872a0SLloyd Pique assert(i < ARRAY_LENGTH(reference));
102*84e872a0SLloyd Pique assert(e->i == reference[ARRAY_LENGTH(reference) - i - 1]);
103*84e872a0SLloyd Pique i++;
104*84e872a0SLloyd Pique }
105*84e872a0SLloyd Pique assert(i == ARRAY_LENGTH(reference));
106*84e872a0SLloyd Pique }
107*84e872a0SLloyd Pique
108*84e872a0SLloyd Pique static int
validate_list(struct wl_list * list,int * reference,int length)109*84e872a0SLloyd Pique validate_list(struct wl_list *list, int *reference, int length)
110*84e872a0SLloyd Pique {
111*84e872a0SLloyd Pique struct element *e;
112*84e872a0SLloyd Pique int i;
113*84e872a0SLloyd Pique
114*84e872a0SLloyd Pique i = 0;
115*84e872a0SLloyd Pique wl_list_for_each(e, list, link) {
116*84e872a0SLloyd Pique if (i >= length)
117*84e872a0SLloyd Pique return 0;
118*84e872a0SLloyd Pique if (e->i != reference[i])
119*84e872a0SLloyd Pique return 0;
120*84e872a0SLloyd Pique i++;
121*84e872a0SLloyd Pique }
122*84e872a0SLloyd Pique
123*84e872a0SLloyd Pique if (i != length)
124*84e872a0SLloyd Pique return 0;
125*84e872a0SLloyd Pique
126*84e872a0SLloyd Pique return 1;
127*84e872a0SLloyd Pique }
128*84e872a0SLloyd Pique
TEST(list_remove)129*84e872a0SLloyd Pique TEST(list_remove)
130*84e872a0SLloyd Pique {
131*84e872a0SLloyd Pique struct wl_list list;
132*84e872a0SLloyd Pique struct element e1, e2, e3;
133*84e872a0SLloyd Pique int reference1[] = { 17, 8888, 1000 }, reference2[] = { 17, 1000 };
134*84e872a0SLloyd Pique
135*84e872a0SLloyd Pique e1.i = 17;
136*84e872a0SLloyd Pique e2.i = 8888;
137*84e872a0SLloyd Pique e3.i = 1000;
138*84e872a0SLloyd Pique
139*84e872a0SLloyd Pique wl_list_init(&list);
140*84e872a0SLloyd Pique wl_list_insert(&list, &e1.link);
141*84e872a0SLloyd Pique wl_list_insert(list.prev, &e2.link);
142*84e872a0SLloyd Pique wl_list_insert(list.prev, &e3.link);
143*84e872a0SLloyd Pique assert(validate_list(&list, reference1, ARRAY_LENGTH(reference1)));
144*84e872a0SLloyd Pique
145*84e872a0SLloyd Pique wl_list_remove(&e2.link);
146*84e872a0SLloyd Pique assert(validate_list(&list, reference2, ARRAY_LENGTH(reference2)));
147*84e872a0SLloyd Pique }
148*84e872a0SLloyd Pique
TEST(list_insert_list)149*84e872a0SLloyd Pique TEST(list_insert_list)
150*84e872a0SLloyd Pique {
151*84e872a0SLloyd Pique struct wl_list list, other;
152*84e872a0SLloyd Pique struct element e1, e2, e3, e4, e5, e6;
153*84e872a0SLloyd Pique int reference1[] = { 17, 8888, 1000 };
154*84e872a0SLloyd Pique int reference2[] = { 76543, 1, -500 };
155*84e872a0SLloyd Pique int reference3[] = { 17, 76543, 1, -500, 8888, 1000 };
156*84e872a0SLloyd Pique
157*84e872a0SLloyd Pique e1.i = 17;
158*84e872a0SLloyd Pique e2.i = 8888;
159*84e872a0SLloyd Pique e3.i = 1000;
160*84e872a0SLloyd Pique
161*84e872a0SLloyd Pique wl_list_init(&list);
162*84e872a0SLloyd Pique wl_list_insert(&list, &e1.link);
163*84e872a0SLloyd Pique wl_list_insert(list.prev, &e2.link);
164*84e872a0SLloyd Pique wl_list_insert(list.prev, &e3.link);
165*84e872a0SLloyd Pique assert(validate_list(&list, reference1, ARRAY_LENGTH(reference1)));
166*84e872a0SLloyd Pique
167*84e872a0SLloyd Pique e4.i = 76543;
168*84e872a0SLloyd Pique e5.i = 1;
169*84e872a0SLloyd Pique e6.i = -500;
170*84e872a0SLloyd Pique
171*84e872a0SLloyd Pique wl_list_init(&other);
172*84e872a0SLloyd Pique wl_list_insert(&other, &e4.link);
173*84e872a0SLloyd Pique wl_list_insert(other.prev, &e5.link);
174*84e872a0SLloyd Pique wl_list_insert(other.prev, &e6.link);
175*84e872a0SLloyd Pique assert(validate_list(&other, reference2, ARRAY_LENGTH(reference2)));
176*84e872a0SLloyd Pique
177*84e872a0SLloyd Pique wl_list_insert_list(list.next, &other);
178*84e872a0SLloyd Pique assert(validate_list(&list, reference3, ARRAY_LENGTH(reference3)));
179*84e872a0SLloyd Pique }
180