xref: /aosp_15_r20/external/llvm-libc/test/src/search/insque_test.cpp (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1*71db0c75SAndroid Build Coastguard Worker //===-- Unittests for insque ----------------------------------------------===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker 
9*71db0c75SAndroid Build Coastguard Worker #include "src/search/insque.h"
10*71db0c75SAndroid Build Coastguard Worker #include "src/search/remque.h"
11*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h"
12*71db0c75SAndroid Build Coastguard Worker 
13*71db0c75SAndroid Build Coastguard Worker namespace {
14*71db0c75SAndroid Build Coastguard Worker 
15*71db0c75SAndroid Build Coastguard Worker struct Node {
16*71db0c75SAndroid Build Coastguard Worker   Node *next;
17*71db0c75SAndroid Build Coastguard Worker   Node *prev;
18*71db0c75SAndroid Build Coastguard Worker };
19*71db0c75SAndroid Build Coastguard Worker 
make_linear_links(Node (& nodes)[N])20*71db0c75SAndroid Build Coastguard Worker template <unsigned N> void make_linear_links(Node (&nodes)[N]) {
21*71db0c75SAndroid Build Coastguard Worker   for (unsigned i = 0; i < N; ++i) {
22*71db0c75SAndroid Build Coastguard Worker     if (i == N - 1)
23*71db0c75SAndroid Build Coastguard Worker       nodes[i].next = nullptr;
24*71db0c75SAndroid Build Coastguard Worker     else
25*71db0c75SAndroid Build Coastguard Worker       nodes[i].next = &nodes[i + 1];
26*71db0c75SAndroid Build Coastguard Worker 
27*71db0c75SAndroid Build Coastguard Worker     if (i == 0)
28*71db0c75SAndroid Build Coastguard Worker       nodes[i].prev = nullptr;
29*71db0c75SAndroid Build Coastguard Worker     else
30*71db0c75SAndroid Build Coastguard Worker       nodes[i].prev = &nodes[i - 1];
31*71db0c75SAndroid Build Coastguard Worker   }
32*71db0c75SAndroid Build Coastguard Worker }
33*71db0c75SAndroid Build Coastguard Worker 
make_circular_links(Node (& nodes)[N])34*71db0c75SAndroid Build Coastguard Worker template <unsigned N> void make_circular_links(Node (&nodes)[N]) {
35*71db0c75SAndroid Build Coastguard Worker   for (unsigned i = 0; i < N; ++i) {
36*71db0c75SAndroid Build Coastguard Worker     nodes[i].next = &nodes[(i + 1) % N];
37*71db0c75SAndroid Build Coastguard Worker     nodes[i].prev = &nodes[(i + N - 1) % N];
38*71db0c75SAndroid Build Coastguard Worker   }
39*71db0c75SAndroid Build Coastguard Worker }
40*71db0c75SAndroid Build Coastguard Worker 
41*71db0c75SAndroid Build Coastguard Worker } // namespace
42*71db0c75SAndroid Build Coastguard Worker 
43*71db0c75SAndroid Build Coastguard Worker class LlvmLibcInsqueTest : public LIBC_NAMESPACE::testing::Test {
44*71db0c75SAndroid Build Coastguard Worker protected:
45*71db0c75SAndroid Build Coastguard Worker   template <unsigned N>
check_linear(const Node * head,const Node * const (& nodes)[N])46*71db0c75SAndroid Build Coastguard Worker   void check_linear(const Node *head, const Node *const (&nodes)[N]) {
47*71db0c75SAndroid Build Coastguard Worker     // First make sure that the given N nodes form a valid linear list.
48*71db0c75SAndroid Build Coastguard Worker     for (unsigned i = 0; i < N; ++i) {
49*71db0c75SAndroid Build Coastguard Worker       const Node *next = nullptr;
50*71db0c75SAndroid Build Coastguard Worker       if (i + 1 < N)
51*71db0c75SAndroid Build Coastguard Worker         next = nodes[i + 1];
52*71db0c75SAndroid Build Coastguard Worker 
53*71db0c75SAndroid Build Coastguard Worker       const Node *prev = nullptr;
54*71db0c75SAndroid Build Coastguard Worker       if (i > 0)
55*71db0c75SAndroid Build Coastguard Worker         prev = nodes[i - 1];
56*71db0c75SAndroid Build Coastguard Worker 
57*71db0c75SAndroid Build Coastguard Worker       EXPECT_EQ(static_cast<const Node *>(nodes[i]->next), next);
58*71db0c75SAndroid Build Coastguard Worker       EXPECT_EQ(static_cast<const Node *>(nodes[i]->prev), prev);
59*71db0c75SAndroid Build Coastguard Worker     }
60*71db0c75SAndroid Build Coastguard Worker 
61*71db0c75SAndroid Build Coastguard Worker     // Then check the list nodes match.
62*71db0c75SAndroid Build Coastguard Worker     for (unsigned i = 0; i < N; ++i) {
63*71db0c75SAndroid Build Coastguard Worker       EXPECT_EQ(head, nodes[i]);
64*71db0c75SAndroid Build Coastguard Worker       // Traversal by head should always be OK since we have already confirmed
65*71db0c75SAndroid Build Coastguard Worker       // the validity of links.
66*71db0c75SAndroid Build Coastguard Worker       head = head->next;
67*71db0c75SAndroid Build Coastguard Worker     }
68*71db0c75SAndroid Build Coastguard Worker   }
69*71db0c75SAndroid Build Coastguard Worker 
70*71db0c75SAndroid Build Coastguard Worker   template <unsigned N>
check_circular(const Node * head,const Node * const (& nodes)[N])71*71db0c75SAndroid Build Coastguard Worker   void check_circular(const Node *head, const Node *const (&nodes)[N]) {
72*71db0c75SAndroid Build Coastguard Worker     // First make sure that the given N nodes form a valid linear list.
73*71db0c75SAndroid Build Coastguard Worker     for (unsigned i = 0; i < N; ++i) {
74*71db0c75SAndroid Build Coastguard Worker       auto next = nodes[(i + 1) % N];
75*71db0c75SAndroid Build Coastguard Worker       auto prev = nodes[(i + N - 1) % N];
76*71db0c75SAndroid Build Coastguard Worker 
77*71db0c75SAndroid Build Coastguard Worker       EXPECT_EQ(static_cast<const Node *>(nodes[i]->prev), prev);
78*71db0c75SAndroid Build Coastguard Worker       EXPECT_EQ(static_cast<const Node *>(nodes[i]->next), next);
79*71db0c75SAndroid Build Coastguard Worker     }
80*71db0c75SAndroid Build Coastguard Worker 
81*71db0c75SAndroid Build Coastguard Worker     // Then check the list nodes match.
82*71db0c75SAndroid Build Coastguard Worker     for (unsigned i = 0; i < N; ++i) {
83*71db0c75SAndroid Build Coastguard Worker       EXPECT_EQ(head, nodes[i]);
84*71db0c75SAndroid Build Coastguard Worker       // Traversal by head should always be OK since we have already confirmed
85*71db0c75SAndroid Build Coastguard Worker       // the validity of links.
86*71db0c75SAndroid Build Coastguard Worker       head = head->next;
87*71db0c75SAndroid Build Coastguard Worker     }
88*71db0c75SAndroid Build Coastguard Worker   }
89*71db0c75SAndroid Build Coastguard Worker };
90*71db0c75SAndroid Build Coastguard Worker 
TEST_F(LlvmLibcInsqueTest,InsertToNull)91*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcInsqueTest, InsertToNull) {
92*71db0c75SAndroid Build Coastguard Worker   Node node{nullptr, nullptr};
93*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::insque(&node, nullptr);
94*71db0c75SAndroid Build Coastguard Worker   check_linear(&node, {&node});
95*71db0c75SAndroid Build Coastguard Worker }
96*71db0c75SAndroid Build Coastguard Worker 
TEST_F(LlvmLibcInsqueTest,InsertToLinearSingleton)97*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcInsqueTest, InsertToLinearSingleton) {
98*71db0c75SAndroid Build Coastguard Worker   Node base[1];
99*71db0c75SAndroid Build Coastguard Worker   make_linear_links(base);
100*71db0c75SAndroid Build Coastguard Worker 
101*71db0c75SAndroid Build Coastguard Worker   Node incoming{nullptr, nullptr};
102*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::insque(&incoming, &base[0]);
103*71db0c75SAndroid Build Coastguard Worker   check_linear(base, {&base[0], &incoming});
104*71db0c75SAndroid Build Coastguard Worker }
105*71db0c75SAndroid Build Coastguard Worker 
TEST_F(LlvmLibcInsqueTest,InsertToLinearMiddle)106*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcInsqueTest, InsertToLinearMiddle) {
107*71db0c75SAndroid Build Coastguard Worker   Node base[3];
108*71db0c75SAndroid Build Coastguard Worker   make_linear_links(base);
109*71db0c75SAndroid Build Coastguard Worker 
110*71db0c75SAndroid Build Coastguard Worker   Node incoming{nullptr, nullptr};
111*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::insque(&incoming, &base[1]);
112*71db0c75SAndroid Build Coastguard Worker   check_linear(base, {&base[0], &base[1], &incoming, &base[2]});
113*71db0c75SAndroid Build Coastguard Worker }
114*71db0c75SAndroid Build Coastguard Worker 
TEST_F(LlvmLibcInsqueTest,InsertToLinearBack)115*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcInsqueTest, InsertToLinearBack) {
116*71db0c75SAndroid Build Coastguard Worker   Node base[3];
117*71db0c75SAndroid Build Coastguard Worker   make_linear_links(base);
118*71db0c75SAndroid Build Coastguard Worker 
119*71db0c75SAndroid Build Coastguard Worker   Node incoming{nullptr, nullptr};
120*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::insque(&incoming, &base[2]);
121*71db0c75SAndroid Build Coastguard Worker   check_linear(base, {&base[0], &base[1], &base[2], &incoming});
122*71db0c75SAndroid Build Coastguard Worker }
123*71db0c75SAndroid Build Coastguard Worker 
TEST_F(LlvmLibcInsqueTest,InsertToCircularSingleton)124*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcInsqueTest, InsertToCircularSingleton) {
125*71db0c75SAndroid Build Coastguard Worker   Node base[1];
126*71db0c75SAndroid Build Coastguard Worker   make_circular_links(base);
127*71db0c75SAndroid Build Coastguard Worker 
128*71db0c75SAndroid Build Coastguard Worker   Node incoming{nullptr, nullptr};
129*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::insque(&incoming, &base[0]);
130*71db0c75SAndroid Build Coastguard Worker   check_circular(base, {&base[0], &incoming});
131*71db0c75SAndroid Build Coastguard Worker }
132*71db0c75SAndroid Build Coastguard Worker 
TEST_F(LlvmLibcInsqueTest,InsertToCircular)133*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcInsqueTest, InsertToCircular) {
134*71db0c75SAndroid Build Coastguard Worker   Node base[3];
135*71db0c75SAndroid Build Coastguard Worker   make_circular_links(base);
136*71db0c75SAndroid Build Coastguard Worker 
137*71db0c75SAndroid Build Coastguard Worker   Node incoming{nullptr, nullptr};
138*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::insque(&incoming, &base[1]);
139*71db0c75SAndroid Build Coastguard Worker   check_circular(base, {&base[0], &base[1], &incoming, &base[2]});
140*71db0c75SAndroid Build Coastguard Worker }
141*71db0c75SAndroid Build Coastguard Worker 
TEST_F(LlvmLibcInsqueTest,RemoveFromLinearSingleton)142*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcInsqueTest, RemoveFromLinearSingleton) {
143*71db0c75SAndroid Build Coastguard Worker   Node node{nullptr, nullptr};
144*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::remque(&node);
145*71db0c75SAndroid Build Coastguard Worker   ASSERT_EQ(node.next, static_cast<Node *>(nullptr));
146*71db0c75SAndroid Build Coastguard Worker   ASSERT_EQ(node.prev, static_cast<Node *>(nullptr));
147*71db0c75SAndroid Build Coastguard Worker }
148*71db0c75SAndroid Build Coastguard Worker 
TEST_F(LlvmLibcInsqueTest,RemoveFromLinearFront)149*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcInsqueTest, RemoveFromLinearFront) {
150*71db0c75SAndroid Build Coastguard Worker   Node base[3];
151*71db0c75SAndroid Build Coastguard Worker   make_linear_links(base);
152*71db0c75SAndroid Build Coastguard Worker 
153*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::remque(&base[0]);
154*71db0c75SAndroid Build Coastguard Worker   check_linear(&base[1], {&base[1], &base[2]});
155*71db0c75SAndroid Build Coastguard Worker }
156*71db0c75SAndroid Build Coastguard Worker 
TEST_F(LlvmLibcInsqueTest,RemoveFromLinearMiddle)157*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcInsqueTest, RemoveFromLinearMiddle) {
158*71db0c75SAndroid Build Coastguard Worker   Node base[3];
159*71db0c75SAndroid Build Coastguard Worker   make_linear_links(base);
160*71db0c75SAndroid Build Coastguard Worker 
161*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::remque(&base[1]);
162*71db0c75SAndroid Build Coastguard Worker   check_linear(&base[0], {&base[0], &base[2]});
163*71db0c75SAndroid Build Coastguard Worker }
164*71db0c75SAndroid Build Coastguard Worker 
TEST_F(LlvmLibcInsqueTest,RemoveFromLinearBack)165*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcInsqueTest, RemoveFromLinearBack) {
166*71db0c75SAndroid Build Coastguard Worker   Node base[3];
167*71db0c75SAndroid Build Coastguard Worker   make_linear_links(base);
168*71db0c75SAndroid Build Coastguard Worker 
169*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::remque(&base[2]);
170*71db0c75SAndroid Build Coastguard Worker   check_linear(&base[0], {&base[0], &base[1]});
171*71db0c75SAndroid Build Coastguard Worker }
172*71db0c75SAndroid Build Coastguard Worker 
TEST_F(LlvmLibcInsqueTest,RemoveFromCircularSingleton)173*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcInsqueTest, RemoveFromCircularSingleton) {
174*71db0c75SAndroid Build Coastguard Worker   Node node[1];
175*71db0c75SAndroid Build Coastguard Worker   make_circular_links(node);
176*71db0c75SAndroid Build Coastguard Worker 
177*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::remque(&node[0]);
178*71db0c75SAndroid Build Coastguard Worker }
179*71db0c75SAndroid Build Coastguard Worker 
TEST_F(LlvmLibcInsqueTest,RemoveFromCircular)180*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcInsqueTest, RemoveFromCircular) {
181*71db0c75SAndroid Build Coastguard Worker   Node base[3];
182*71db0c75SAndroid Build Coastguard Worker   make_circular_links(base);
183*71db0c75SAndroid Build Coastguard Worker 
184*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::remque(&base[1]);
185*71db0c75SAndroid Build Coastguard Worker   check_circular(&base[0], {&base[0], &base[2]});
186*71db0c75SAndroid Build Coastguard Worker }
187