169 lines · cpp
1//===- unittests/ADT/IListBaseTest.cpp - ilist_base unit tests ------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/ADT/ilist_base.h"10#include "gtest/gtest.h"11 12using namespace llvm;13 14namespace {15 16// Test fixture.17template <typename T> class IListBaseTest : public ::testing::Test {};18 19class Parent;20 21// Test variants with the same test.22using IListBaseTestTypes =23 ::testing::Types<ilist_base<false, void>, ilist_base<true, void>,24 ilist_base<false, Parent *>, ilist_base<true, Parent *>>;25TYPED_TEST_SUITE(IListBaseTest, IListBaseTestTypes, );26 27TYPED_TEST(IListBaseTest, insertBeforeImpl) {28 using list_base_type = TypeParam;29 using node_base_type = typename list_base_type::node_base_type;30 31 node_base_type S, A, B;32 33 // [S] <-> [S]34 S.setPrev(&S);35 S.setNext(&S);36 37 // [S] <-> A <-> [S]38 list_base_type::insertBeforeImpl(S, A);39 EXPECT_EQ(&A, S.getPrev());40 EXPECT_EQ(&S, A.getPrev());41 EXPECT_EQ(&A, S.getNext());42 EXPECT_EQ(&S, A.getNext());43 44 // [S] <-> A <-> B <-> [S]45 list_base_type::insertBeforeImpl(S, B);46 EXPECT_EQ(&B, S.getPrev());47 EXPECT_EQ(&A, B.getPrev());48 EXPECT_EQ(&S, A.getPrev());49 EXPECT_EQ(&A, S.getNext());50 EXPECT_EQ(&B, A.getNext());51 EXPECT_EQ(&S, B.getNext());52}53 54TYPED_TEST(IListBaseTest, removeImpl) {55 using list_base_type = TypeParam;56 using node_base_type = typename list_base_type::node_base_type;57 58 node_base_type S, A, B;59 60 // [S] <-> A <-> B <-> [S]61 S.setPrev(&S);62 S.setNext(&S);63 list_base_type::insertBeforeImpl(S, A);64 list_base_type::insertBeforeImpl(S, B);65 66 // [S] <-> B <-> [S]67 list_base_type::removeImpl(A);68 EXPECT_EQ(&B, S.getPrev());69 EXPECT_EQ(&S, B.getPrev());70 EXPECT_EQ(&B, S.getNext());71 EXPECT_EQ(&S, B.getNext());72 EXPECT_EQ(nullptr, A.getPrev());73 EXPECT_EQ(nullptr, A.getNext());74 75 // [S] <-> [S]76 list_base_type::removeImpl(B);77 EXPECT_EQ(&S, S.getPrev());78 EXPECT_EQ(&S, S.getNext());79 EXPECT_EQ(nullptr, B.getPrev());80 EXPECT_EQ(nullptr, B.getNext());81}82 83TYPED_TEST(IListBaseTest, removeRangeImpl) {84 using list_base_type = TypeParam;85 using node_base_type = typename list_base_type::node_base_type;86 87 node_base_type S, A, B, C, D;88 89 // [S] <-> A <-> B <-> C <-> D <-> [S]90 S.setPrev(&S);91 S.setNext(&S);92 list_base_type::insertBeforeImpl(S, A);93 list_base_type::insertBeforeImpl(S, B);94 list_base_type::insertBeforeImpl(S, C);95 list_base_type::insertBeforeImpl(S, D);96 97 // [S] <-> A <-> D <-> [S]98 list_base_type::removeRangeImpl(B, D);99 EXPECT_EQ(&D, S.getPrev());100 EXPECT_EQ(&A, D.getPrev());101 EXPECT_EQ(&S, A.getPrev());102 EXPECT_EQ(&A, S.getNext());103 EXPECT_EQ(&D, A.getNext());104 EXPECT_EQ(&S, D.getNext());105 EXPECT_EQ(nullptr, B.getPrev());106 EXPECT_EQ(nullptr, C.getNext());107}108 109TYPED_TEST(IListBaseTest, removeRangeImplAllButSentinel) {110 using list_base_type = TypeParam;111 using node_base_type = typename list_base_type::node_base_type;112 113 node_base_type S, A, B;114 115 // [S] <-> A <-> B <-> [S]116 S.setPrev(&S);117 S.setNext(&S);118 list_base_type::insertBeforeImpl(S, A);119 list_base_type::insertBeforeImpl(S, B);120 121 // [S] <-> [S]122 list_base_type::removeRangeImpl(A, S);123 EXPECT_EQ(&S, S.getPrev());124 EXPECT_EQ(&S, S.getNext());125 EXPECT_EQ(nullptr, A.getPrev());126 EXPECT_EQ(nullptr, B.getNext());127}128 129TYPED_TEST(IListBaseTest, transferBeforeImpl) {130 using list_base_type = TypeParam;131 using node_base_type = typename list_base_type::node_base_type;132 133 node_base_type S1, S2, A, B, C, D, E;134 135 // [S1] <-> A <-> B <-> C <-> [S1]136 S1.setPrev(&S1);137 S1.setNext(&S1);138 list_base_type::insertBeforeImpl(S1, A);139 list_base_type::insertBeforeImpl(S1, B);140 list_base_type::insertBeforeImpl(S1, C);141 142 // [S2] <-> D <-> E <-> [S2]143 S2.setPrev(&S2);144 S2.setNext(&S2);145 list_base_type::insertBeforeImpl(S2, D);146 list_base_type::insertBeforeImpl(S2, E);147 148 // [S1] <-> C <-> [S1]149 list_base_type::transferBeforeImpl(D, A, C);150 EXPECT_EQ(&C, S1.getPrev());151 EXPECT_EQ(&S1, C.getPrev());152 EXPECT_EQ(&C, S1.getNext());153 EXPECT_EQ(&S1, C.getNext());154 155 // [S2] <-> A <-> B <-> D <-> E <-> [S2]156 EXPECT_EQ(&E, S2.getPrev());157 EXPECT_EQ(&D, E.getPrev());158 EXPECT_EQ(&B, D.getPrev());159 EXPECT_EQ(&A, B.getPrev());160 EXPECT_EQ(&S2, A.getPrev());161 EXPECT_EQ(&A, S2.getNext());162 EXPECT_EQ(&B, A.getNext());163 EXPECT_EQ(&D, B.getNext());164 EXPECT_EQ(&E, D.getNext());165 EXPECT_EQ(&S2, E.getNext());166}167 168} // end namespace169