xref: /llvm-project/libc/test/include/sys/queue_test.cpp (revision 1dbc98294adc06e409b1e0d44252826857ac2ec6)
1dbc09553SPetr Hosek //===-- Unittests for queue -----------------------------------------------===//
2dbc09553SPetr Hosek //
3dbc09553SPetr Hosek // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4dbc09553SPetr Hosek // See https://llvm.org/LICENSE.txt for license information.
5*1dbc9829SRoland McGrath // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6dbc09553SPetr Hosek //
7dbc09553SPetr Hosek //===----------------------------------------------------------------------===//
8dbc09553SPetr Hosek 
9dbc09553SPetr Hosek #include "src/__support/CPP/string.h"
10dbc09553SPetr Hosek #include "src/__support/char_vector.h"
115ff3ff33SPetr Hosek #include "src/__support/macros/config.h"
12dbc09553SPetr Hosek #include "test/UnitTest/Test.h"
13dbc09553SPetr Hosek 
1473aab2f6Slntue #include "include/llvm-libc-macros/sys-queue-macros.h"
15dbc09553SPetr Hosek 
16dbc09553SPetr Hosek using LIBC_NAMESPACE::CharVector;
17dbc09553SPetr Hosek using LIBC_NAMESPACE::cpp::string;
18dbc09553SPetr Hosek 
195ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL {
20dbc09553SPetr Hosek 
21dbc09553SPetr Hosek TEST(LlvmLibcQueueTest, SList) {
22dbc09553SPetr Hosek   struct Entry {
23dbc09553SPetr Hosek     char c;
24dbc09553SPetr Hosek     SLIST_ENTRY(Entry) entries;
25dbc09553SPetr Hosek   };
26dbc09553SPetr Hosek 
27dbc09553SPetr Hosek   SLIST_HEAD(Head, Entry);
28dbc09553SPetr Hosek 
29dbc09553SPetr Hosek   Head head = SLIST_HEAD_INITIALIZER(head);
30dbc09553SPetr Hosek 
31dbc09553SPetr Hosek   struct Contains : public testing::Matcher<Head> {
32dbc09553SPetr Hosek     string s;
33dbc09553SPetr Hosek     Contains(string s) : s(s) {}
34dbc09553SPetr Hosek     bool match(Head head) {
35dbc09553SPetr Hosek       Entry *e;
36dbc09553SPetr Hosek       CharVector v;
37dbc09553SPetr Hosek       SLIST_FOREACH(e, &head, entries) { v.append(e->c); }
38dbc09553SPetr Hosek       return s == v.c_str();
39dbc09553SPetr Hosek     }
40dbc09553SPetr Hosek   };
41dbc09553SPetr Hosek 
42dbc09553SPetr Hosek   Entry e1 = {'a', {NULL}};
43dbc09553SPetr Hosek   SLIST_INSERT_HEAD(&head, &e1, entries);
44dbc09553SPetr Hosek 
45dbc09553SPetr Hosek   ASSERT_THAT(head, Contains("a"));
46dbc09553SPetr Hosek 
47dbc09553SPetr Hosek   Entry e2 = {'b', {NULL}};
48dbc09553SPetr Hosek   SLIST_INSERT_AFTER(&e1, &e2, entries);
49dbc09553SPetr Hosek 
50dbc09553SPetr Hosek   ASSERT_THAT(head, Contains("ab"));
51dbc09553SPetr Hosek 
52dbc09553SPetr Hosek   Head head2 = SLIST_HEAD_INITIALIZER(head);
53dbc09553SPetr Hosek 
54dbc09553SPetr Hosek   Entry e3 = {'c', {NULL}};
55dbc09553SPetr Hosek   SLIST_INSERT_HEAD(&head2, &e3, entries);
56dbc09553SPetr Hosek 
57dbc09553SPetr Hosek   ASSERT_THAT(head2, Contains("c"));
58dbc09553SPetr Hosek 
59dbc09553SPetr Hosek   SLIST_SWAP(&head, &head2, Entry);
60dbc09553SPetr Hosek 
61dbc09553SPetr Hosek   ASSERT_THAT(head2, Contains("ab"));
62dbc09553SPetr Hosek 
63dbc09553SPetr Hosek   SLIST_CONCAT(&head2, &head, Entry, entries);
64dbc09553SPetr Hosek 
65dbc09553SPetr Hosek   ASSERT_THAT(head2, Contains("abc"));
66dbc09553SPetr Hosek 
67dbc09553SPetr Hosek   SLIST_CONCAT(&head, &head2, Entry, entries);
68dbc09553SPetr Hosek 
69dbc09553SPetr Hosek   ASSERT_THAT(head, Contains("abc"));
70dbc09553SPetr Hosek 
71dbc09553SPetr Hosek   Entry *e = NULL, *tmp = NULL;
72dbc09553SPetr Hosek   SLIST_FOREACH_SAFE(e, &head, entries, tmp) {
73dbc09553SPetr Hosek     if (e == &e2) {
74dbc09553SPetr Hosek       SLIST_REMOVE(&head, e, Entry, entries);
75dbc09553SPetr Hosek     }
76dbc09553SPetr Hosek   }
77dbc09553SPetr Hosek 
78dbc09553SPetr Hosek   ASSERT_THAT(head, Contains("ac"));
79dbc09553SPetr Hosek 
80dbc09553SPetr Hosek   while (!SLIST_EMPTY(&head)) {
81dbc09553SPetr Hosek     e = SLIST_FIRST(&head);
82dbc09553SPetr Hosek     SLIST_REMOVE_HEAD(&head, entries);
83dbc09553SPetr Hosek   }
84dbc09553SPetr Hosek 
85dbc09553SPetr Hosek   ASSERT_TRUE(SLIST_EMPTY(&head));
86dbc09553SPetr Hosek }
87dbc09553SPetr Hosek 
88dbc09553SPetr Hosek TEST(LlvmLibcQueueTest, STailQ) {
89dbc09553SPetr Hosek   struct Entry {
90dbc09553SPetr Hosek     char c;
91dbc09553SPetr Hosek     STAILQ_ENTRY(Entry) entries;
92dbc09553SPetr Hosek   };
93dbc09553SPetr Hosek 
94dbc09553SPetr Hosek   STAILQ_HEAD(Head, Entry);
95dbc09553SPetr Hosek 
96dbc09553SPetr Hosek   Head head = STAILQ_HEAD_INITIALIZER(head);
97dbc09553SPetr Hosek 
98dbc09553SPetr Hosek   struct Contains : public testing::Matcher<Head> {
99dbc09553SPetr Hosek     string s;
100dbc09553SPetr Hosek     Contains(string s) : s(s) {}
101dbc09553SPetr Hosek     bool match(Head head) {
102dbc09553SPetr Hosek       Entry *e;
103dbc09553SPetr Hosek       CharVector v;
104dbc09553SPetr Hosek       STAILQ_FOREACH(e, &head, entries) { v.append(e->c); }
105dbc09553SPetr Hosek       return s == v.c_str();
106dbc09553SPetr Hosek     }
107dbc09553SPetr Hosek   };
108dbc09553SPetr Hosek 
109dbc09553SPetr Hosek   STAILQ_INIT(&head);
110dbc09553SPetr Hosek   ASSERT_TRUE(STAILQ_EMPTY(&head));
111dbc09553SPetr Hosek 
112dbc09553SPetr Hosek   Entry e1 = {'a', {NULL}};
113dbc09553SPetr Hosek   STAILQ_INSERT_HEAD(&head, &e1, entries);
114dbc09553SPetr Hosek 
115dbc09553SPetr Hosek   ASSERT_THAT(head, Contains("a"));
116dbc09553SPetr Hosek 
117dbc09553SPetr Hosek   Entry e2 = {'b', {NULL}};
118dbc09553SPetr Hosek   STAILQ_INSERT_TAIL(&head, &e2, entries);
119dbc09553SPetr Hosek 
120dbc09553SPetr Hosek   ASSERT_THAT(head, Contains("ab"));
121dbc09553SPetr Hosek 
122dbc09553SPetr Hosek   Entry e3 = {'c', {NULL}};
123dbc09553SPetr Hosek   STAILQ_INSERT_AFTER(&head, &e2, &e3, entries);
124dbc09553SPetr Hosek 
125dbc09553SPetr Hosek   ASSERT_THAT(head, Contains("abc"));
126dbc09553SPetr Hosek 
127dbc09553SPetr Hosek   Head head2 = STAILQ_HEAD_INITIALIZER(head);
128dbc09553SPetr Hosek 
129dbc09553SPetr Hosek   Entry e4 = {'d', {NULL}};
130dbc09553SPetr Hosek   STAILQ_INSERT_HEAD(&head2, &e4, entries);
131dbc09553SPetr Hosek 
132dbc09553SPetr Hosek   ASSERT_THAT(head2, Contains("d"));
133dbc09553SPetr Hosek 
134dbc09553SPetr Hosek   STAILQ_SWAP(&head, &head2, Entry);
135dbc09553SPetr Hosek 
136dbc09553SPetr Hosek   ASSERT_THAT(head2, Contains("abc"));
137dbc09553SPetr Hosek 
138dbc09553SPetr Hosek   STAILQ_CONCAT(&head2, &head, Entry, entries);
139dbc09553SPetr Hosek 
140dbc09553SPetr Hosek   ASSERT_EQ(STAILQ_FIRST(&head2), &e1);
141dbc09553SPetr Hosek   ASSERT_EQ(STAILQ_LAST(&head2, Entry, entries), &e4);
142dbc09553SPetr Hosek 
143dbc09553SPetr Hosek   ASSERT_THAT(head2, Contains("abcd"));
144dbc09553SPetr Hosek 
145dbc09553SPetr Hosek   STAILQ_CONCAT(&head, &head2, Entry, entries);
146dbc09553SPetr Hosek 
147dbc09553SPetr Hosek   ASSERT_EQ(STAILQ_FIRST(&head), &e1);
148dbc09553SPetr Hosek   ASSERT_EQ(STAILQ_LAST(&head, Entry, entries), &e4);
149dbc09553SPetr Hosek 
150dbc09553SPetr Hosek   ASSERT_THAT(head, Contains("abcd"));
151dbc09553SPetr Hosek 
152dbc09553SPetr Hosek   Entry *e = NULL, *tmp = NULL;
153dbc09553SPetr Hosek   STAILQ_FOREACH_SAFE(e, &head, entries, tmp) {
154dbc09553SPetr Hosek     if (e == &e2) {
155dbc09553SPetr Hosek       STAILQ_REMOVE(&head, e, Entry, entries);
156dbc09553SPetr Hosek     }
157dbc09553SPetr Hosek   }
158dbc09553SPetr Hosek 
159dbc09553SPetr Hosek   ASSERT_THAT(head, Contains("acd"));
160dbc09553SPetr Hosek 
161dbc09553SPetr Hosek   while (!STAILQ_EMPTY(&head)) {
162dbc09553SPetr Hosek     e = STAILQ_FIRST(&head);
163dbc09553SPetr Hosek     STAILQ_REMOVE_HEAD(&head, entries);
164dbc09553SPetr Hosek   }
165dbc09553SPetr Hosek 
166dbc09553SPetr Hosek   ASSERT_TRUE(STAILQ_EMPTY(&head));
167dbc09553SPetr Hosek }
168dbc09553SPetr Hosek 
1695ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL
170