13fa38318SNico Weber //===-- list_test.cpp -------------------------------------------*- C++ -*-===//
23fa38318SNico Weber //
33fa38318SNico Weber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43fa38318SNico Weber // See https://llvm.org/LICENSE.txt for license information.
53fa38318SNico Weber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63fa38318SNico Weber //
73fa38318SNico Weber //===----------------------------------------------------------------------===//
83fa38318SNico Weber
9*0d3d4d3bSKostya Kortchinsky #include "tests/scudo_unit_test.h"
10*0d3d4d3bSKostya Kortchinsky
11*0d3d4d3bSKostya Kortchinsky #include "list.h"
123fa38318SNico Weber
133fa38318SNico Weber struct ListItem {
143fa38318SNico Weber ListItem *Next;
156f2de9cbSKostya Kortchinsky ListItem *Prev;
163fa38318SNico Weber };
173fa38318SNico Weber
186f2de9cbSKostya Kortchinsky static ListItem Items[6];
196f2de9cbSKostya Kortchinsky static ListItem *X = &Items[0];
206f2de9cbSKostya Kortchinsky static ListItem *Y = &Items[1];
216f2de9cbSKostya Kortchinsky static ListItem *Z = &Items[2];
226f2de9cbSKostya Kortchinsky static ListItem *A = &Items[3];
236f2de9cbSKostya Kortchinsky static ListItem *B = &Items[4];
246f2de9cbSKostya Kortchinsky static ListItem *C = &Items[5];
253fa38318SNico Weber
266f2de9cbSKostya Kortchinsky typedef scudo::SinglyLinkedList<ListItem> SLList;
276f2de9cbSKostya Kortchinsky typedef scudo::DoublyLinkedList<ListItem> DLList;
283fa38318SNico Weber
296f2de9cbSKostya Kortchinsky template <typename ListT>
setList(ListT * L,ListItem * I1=nullptr,ListItem * I2=nullptr,ListItem * I3=nullptr)306f2de9cbSKostya Kortchinsky static void setList(ListT *L, ListItem *I1 = nullptr, ListItem *I2 = nullptr,
316f2de9cbSKostya Kortchinsky ListItem *I3 = nullptr) {
323fa38318SNico Weber L->clear();
336f2de9cbSKostya Kortchinsky if (I1)
346f2de9cbSKostya Kortchinsky L->push_back(I1);
356f2de9cbSKostya Kortchinsky if (I2)
366f2de9cbSKostya Kortchinsky L->push_back(I2);
376f2de9cbSKostya Kortchinsky if (I3)
386f2de9cbSKostya Kortchinsky L->push_back(I3);
393fa38318SNico Weber }
403fa38318SNico Weber
416f2de9cbSKostya Kortchinsky template <typename ListT>
checkList(ListT * L,ListItem * I1,ListItem * I2=nullptr,ListItem * I3=nullptr,ListItem * I4=nullptr,ListItem * I5=nullptr,ListItem * I6=nullptr)426f2de9cbSKostya Kortchinsky static void checkList(ListT *L, ListItem *I1, ListItem *I2 = nullptr,
433fa38318SNico Weber ListItem *I3 = nullptr, ListItem *I4 = nullptr,
443fa38318SNico Weber ListItem *I5 = nullptr, ListItem *I6 = nullptr) {
453fa38318SNico Weber if (I1) {
463fa38318SNico Weber EXPECT_EQ(L->front(), I1);
473fa38318SNico Weber L->pop_front();
483fa38318SNico Weber }
493fa38318SNico Weber if (I2) {
503fa38318SNico Weber EXPECT_EQ(L->front(), I2);
513fa38318SNico Weber L->pop_front();
523fa38318SNico Weber }
533fa38318SNico Weber if (I3) {
543fa38318SNico Weber EXPECT_EQ(L->front(), I3);
553fa38318SNico Weber L->pop_front();
563fa38318SNico Weber }
573fa38318SNico Weber if (I4) {
583fa38318SNico Weber EXPECT_EQ(L->front(), I4);
593fa38318SNico Weber L->pop_front();
603fa38318SNico Weber }
613fa38318SNico Weber if (I5) {
623fa38318SNico Weber EXPECT_EQ(L->front(), I5);
633fa38318SNico Weber L->pop_front();
643fa38318SNico Weber }
653fa38318SNico Weber if (I6) {
663fa38318SNico Weber EXPECT_EQ(L->front(), I6);
673fa38318SNico Weber L->pop_front();
683fa38318SNico Weber }
693fa38318SNico Weber EXPECT_TRUE(L->empty());
703fa38318SNico Weber }
713fa38318SNico Weber
testListCommon(void)726f2de9cbSKostya Kortchinsky template <typename ListT> static void testListCommon(void) {
736f2de9cbSKostya Kortchinsky ListT L;
743fa38318SNico Weber L.clear();
753fa38318SNico Weber
763fa38318SNico Weber EXPECT_EQ(L.size(), 0U);
773fa38318SNico Weber L.push_back(X);
783fa38318SNico Weber EXPECT_EQ(L.size(), 1U);
793fa38318SNico Weber EXPECT_EQ(L.back(), X);
803fa38318SNico Weber EXPECT_EQ(L.front(), X);
813fa38318SNico Weber L.pop_front();
823fa38318SNico Weber EXPECT_TRUE(L.empty());
833fa38318SNico Weber L.checkConsistency();
843fa38318SNico Weber
853fa38318SNico Weber L.push_front(X);
863fa38318SNico Weber EXPECT_EQ(L.size(), 1U);
873fa38318SNico Weber EXPECT_EQ(L.back(), X);
883fa38318SNico Weber EXPECT_EQ(L.front(), X);
893fa38318SNico Weber L.pop_front();
903fa38318SNico Weber EXPECT_TRUE(L.empty());
913fa38318SNico Weber L.checkConsistency();
923fa38318SNico Weber
933fa38318SNico Weber L.push_front(X);
943fa38318SNico Weber L.push_front(Y);
953fa38318SNico Weber L.push_front(Z);
963fa38318SNico Weber EXPECT_EQ(L.size(), 3U);
973fa38318SNico Weber EXPECT_EQ(L.front(), Z);
983fa38318SNico Weber EXPECT_EQ(L.back(), X);
993fa38318SNico Weber L.checkConsistency();
1003fa38318SNico Weber
1013fa38318SNico Weber L.pop_front();
1023fa38318SNico Weber EXPECT_EQ(L.size(), 2U);
1033fa38318SNico Weber EXPECT_EQ(L.front(), Y);
1043fa38318SNico Weber EXPECT_EQ(L.back(), X);
1053fa38318SNico Weber L.pop_front();
1063fa38318SNico Weber L.pop_front();
1073fa38318SNico Weber EXPECT_TRUE(L.empty());
1083fa38318SNico Weber L.checkConsistency();
1093fa38318SNico Weber
1103fa38318SNico Weber L.push_back(X);
1113fa38318SNico Weber L.push_back(Y);
1123fa38318SNico Weber L.push_back(Z);
1133fa38318SNico Weber EXPECT_EQ(L.size(), 3U);
1143fa38318SNico Weber EXPECT_EQ(L.front(), X);
1153fa38318SNico Weber EXPECT_EQ(L.back(), Z);
1163fa38318SNico Weber L.checkConsistency();
1173fa38318SNico Weber
1183fa38318SNico Weber L.pop_front();
1193fa38318SNico Weber EXPECT_EQ(L.size(), 2U);
1203fa38318SNico Weber EXPECT_EQ(L.front(), Y);
1213fa38318SNico Weber EXPECT_EQ(L.back(), Z);
1223fa38318SNico Weber L.pop_front();
1233fa38318SNico Weber L.pop_front();
1243fa38318SNico Weber EXPECT_TRUE(L.empty());
1253fa38318SNico Weber L.checkConsistency();
1266f2de9cbSKostya Kortchinsky }
1276f2de9cbSKostya Kortchinsky
TEST(ScudoListTest,LinkedListCommon)1286f2de9cbSKostya Kortchinsky TEST(ScudoListTest, LinkedListCommon) {
1296f2de9cbSKostya Kortchinsky testListCommon<SLList>();
1306f2de9cbSKostya Kortchinsky testListCommon<DLList>();
1316f2de9cbSKostya Kortchinsky }
1326f2de9cbSKostya Kortchinsky
TEST(ScudoListTest,SinglyLinkedList)1336f2de9cbSKostya Kortchinsky TEST(ScudoListTest, SinglyLinkedList) {
1346f2de9cbSKostya Kortchinsky SLList L;
1356f2de9cbSKostya Kortchinsky L.clear();
1363fa38318SNico Weber
1373fa38318SNico Weber L.push_back(X);
1383fa38318SNico Weber L.push_back(Y);
1393fa38318SNico Weber L.push_back(Z);
1403fa38318SNico Weber L.extract(X, Y);
1413fa38318SNico Weber EXPECT_EQ(L.size(), 2U);
1423fa38318SNico Weber EXPECT_EQ(L.front(), X);
1433fa38318SNico Weber EXPECT_EQ(L.back(), Z);
1443fa38318SNico Weber L.checkConsistency();
1453fa38318SNico Weber L.extract(X, Z);
1463fa38318SNico Weber EXPECT_EQ(L.size(), 1U);
1473fa38318SNico Weber EXPECT_EQ(L.front(), X);
1483fa38318SNico Weber EXPECT_EQ(L.back(), X);
1493fa38318SNico Weber L.checkConsistency();
1503fa38318SNico Weber L.pop_front();
1513fa38318SNico Weber EXPECT_TRUE(L.empty());
1523fa38318SNico Weber
1536f2de9cbSKostya Kortchinsky SLList L1, L2;
1543fa38318SNico Weber L1.clear();
1553fa38318SNico Weber L2.clear();
1563fa38318SNico Weber
1573fa38318SNico Weber L1.append_back(&L2);
1583fa38318SNico Weber EXPECT_TRUE(L1.empty());
1593fa38318SNico Weber EXPECT_TRUE(L2.empty());
1603fa38318SNico Weber
1613fa38318SNico Weber setList(&L1, X);
1623fa38318SNico Weber checkList(&L1, X);
1633fa38318SNico Weber
1643fa38318SNico Weber setList(&L1, X, Y, Z);
1653fa38318SNico Weber setList(&L2, A, B, C);
1663fa38318SNico Weber L1.append_back(&L2);
1673fa38318SNico Weber checkList(&L1, X, Y, Z, A, B, C);
1683fa38318SNico Weber EXPECT_TRUE(L2.empty());
1693fa38318SNico Weber
1706f2de9cbSKostya Kortchinsky L1.clear();
1716f2de9cbSKostya Kortchinsky L2.clear();
1726f2de9cbSKostya Kortchinsky L1.push_back(X);
1736f2de9cbSKostya Kortchinsky L1.append_back(&L2);
1746f2de9cbSKostya Kortchinsky EXPECT_EQ(L1.back(), X);
1756f2de9cbSKostya Kortchinsky EXPECT_EQ(L1.front(), X);
1766f2de9cbSKostya Kortchinsky EXPECT_EQ(L1.size(), 1U);
1773fa38318SNico Weber }
1783fa38318SNico Weber
TEST(ScudoListTest,DoublyLinkedList)1796f2de9cbSKostya Kortchinsky TEST(ScudoListTest, DoublyLinkedList) {
1806f2de9cbSKostya Kortchinsky DLList L;
1813fa38318SNico Weber L.clear();
1826f2de9cbSKostya Kortchinsky
1836f2de9cbSKostya Kortchinsky L.push_back(X);
1846f2de9cbSKostya Kortchinsky L.push_back(Y);
1856f2de9cbSKostya Kortchinsky L.push_back(Z);
1866f2de9cbSKostya Kortchinsky L.remove(Y);
1876f2de9cbSKostya Kortchinsky EXPECT_EQ(L.size(), 2U);
1886f2de9cbSKostya Kortchinsky EXPECT_EQ(L.front(), X);
1896f2de9cbSKostya Kortchinsky EXPECT_EQ(L.back(), Z);
1906f2de9cbSKostya Kortchinsky L.checkConsistency();
1916f2de9cbSKostya Kortchinsky L.remove(Z);
1923fa38318SNico Weber EXPECT_EQ(L.size(), 1U);
1936f2de9cbSKostya Kortchinsky EXPECT_EQ(L.front(), X);
1946f2de9cbSKostya Kortchinsky EXPECT_EQ(L.back(), X);
1956f2de9cbSKostya Kortchinsky L.checkConsistency();
1966f2de9cbSKostya Kortchinsky L.pop_front();
1976f2de9cbSKostya Kortchinsky EXPECT_TRUE(L.empty());
1982513250bSKostya Kortchinsky
1992513250bSKostya Kortchinsky L.push_back(X);
2002513250bSKostya Kortchinsky L.insert(Y, X);
2012513250bSKostya Kortchinsky EXPECT_EQ(L.size(), 2U);
2022513250bSKostya Kortchinsky EXPECT_EQ(L.front(), Y);
2032513250bSKostya Kortchinsky EXPECT_EQ(L.back(), X);
2042513250bSKostya Kortchinsky L.checkConsistency();
2052513250bSKostya Kortchinsky L.remove(Y);
2062513250bSKostya Kortchinsky EXPECT_EQ(L.size(), 1U);
2072513250bSKostya Kortchinsky EXPECT_EQ(L.front(), X);
2082513250bSKostya Kortchinsky EXPECT_EQ(L.back(), X);
2092513250bSKostya Kortchinsky L.checkConsistency();
2102513250bSKostya Kortchinsky L.pop_front();
2112513250bSKostya Kortchinsky EXPECT_TRUE(L.empty());
2123fa38318SNico Weber }
213