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