brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.8 KiB · 393f83a Raw
205 lines · cpp
1//===- unittests/ADT/IListNodeBaseTest.cpp - ilist_node_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_node_base.h"10#include "gtest/gtest.h"11 12#include <type_traits>13 14using namespace llvm;15 16namespace {17 18class Parent {};19 20using RawNode = ilist_node_base<false, void>;21using TrackingNode = ilist_node_base<true, void>;22using ParentNode = ilist_node_base<false, Parent>;23using ParentTrackingNode = ilist_node_base<true, Parent>;24 25TEST(IListNodeBaseTest, DefaultConstructor) {26  RawNode A;27  EXPECT_EQ(nullptr, A.getPrev());28  EXPECT_EQ(nullptr, A.getNext());29  EXPECT_FALSE(A.isKnownSentinel());30 31  TrackingNode TA;32  EXPECT_EQ(nullptr, TA.getPrev());33  EXPECT_EQ(nullptr, TA.getNext());34  EXPECT_FALSE(TA.isKnownSentinel());35  EXPECT_FALSE(TA.isSentinel());36 37  ParentNode PA;38  EXPECT_EQ(nullptr, PA.getPrev());39  EXPECT_EQ(nullptr, PA.getNext());40  EXPECT_EQ(nullptr, PA.getNodeBaseParent());41  EXPECT_FALSE(PA.isKnownSentinel());42 43  ParentTrackingNode PTA;44  EXPECT_EQ(nullptr, PTA.getPrev());45  EXPECT_EQ(nullptr, PTA.getNext());46  EXPECT_EQ(nullptr, PTA.getNodeBaseParent());47  EXPECT_FALSE(PTA.isKnownSentinel());48  EXPECT_FALSE(PTA.isSentinel());49}50 51TEST(IListNodeBaseTest, setPrevAndNext) {52  RawNode A, B, C;53  A.setPrev(&B);54  EXPECT_EQ(&B, A.getPrev());55  EXPECT_EQ(nullptr, A.getNext());56  EXPECT_EQ(nullptr, B.getPrev());57  EXPECT_EQ(nullptr, B.getNext());58  EXPECT_EQ(nullptr, C.getPrev());59  EXPECT_EQ(nullptr, C.getNext());60 61  A.setNext(&C);62  EXPECT_EQ(&B, A.getPrev());63  EXPECT_EQ(&C, A.getNext());64  EXPECT_EQ(nullptr, B.getPrev());65  EXPECT_EQ(nullptr, B.getNext());66  EXPECT_EQ(nullptr, C.getPrev());67  EXPECT_EQ(nullptr, C.getNext());68 69  TrackingNode TA, TB, TC;70  TA.setPrev(&TB);71  EXPECT_EQ(&TB, TA.getPrev());72  EXPECT_EQ(nullptr, TA.getNext());73  EXPECT_EQ(nullptr, TB.getPrev());74  EXPECT_EQ(nullptr, TB.getNext());75  EXPECT_EQ(nullptr, TC.getPrev());76  EXPECT_EQ(nullptr, TC.getNext());77 78  TA.setNext(&TC);79  EXPECT_EQ(&TB, TA.getPrev());80  EXPECT_EQ(&TC, TA.getNext());81  EXPECT_EQ(nullptr, TB.getPrev());82  EXPECT_EQ(nullptr, TB.getNext());83  EXPECT_EQ(nullptr, TC.getPrev());84  EXPECT_EQ(nullptr, TC.getNext());85 86  ParentNode PA, PB, PC;87  PA.setPrev(&PB);88  EXPECT_EQ(&PB, PA.getPrev());89  EXPECT_EQ(nullptr, PA.getNext());90  EXPECT_EQ(nullptr, PB.getPrev());91  EXPECT_EQ(nullptr, PB.getNext());92  EXPECT_EQ(nullptr, PC.getPrev());93  EXPECT_EQ(nullptr, PC.getNext());94 95  PA.setNext(&PC);96  EXPECT_EQ(&PB, PA.getPrev());97  EXPECT_EQ(&PC, PA.getNext());98  EXPECT_EQ(nullptr, PB.getPrev());99  EXPECT_EQ(nullptr, PB.getNext());100  EXPECT_EQ(nullptr, PC.getPrev());101  EXPECT_EQ(nullptr, PC.getNext());102 103  ParentTrackingNode PTA, PTB, PTC;104  PTA.setPrev(&PTB);105  EXPECT_EQ(&PTB, PTA.getPrev());106  EXPECT_EQ(nullptr, PTA.getNext());107  EXPECT_EQ(nullptr, PTB.getPrev());108  EXPECT_EQ(nullptr, PTB.getNext());109  EXPECT_EQ(nullptr, PTC.getPrev());110  EXPECT_EQ(nullptr, PTC.getNext());111 112  PTA.setNext(&PTC);113  EXPECT_EQ(&PTB, PTA.getPrev());114  EXPECT_EQ(&PTC, PTA.getNext());115  EXPECT_EQ(nullptr, PTB.getPrev());116  EXPECT_EQ(nullptr, PTB.getNext());117  EXPECT_EQ(nullptr, PTC.getPrev());118  EXPECT_EQ(nullptr, PTC.getNext());119 120}121 122TEST(IListNodeBaseTest, isKnownSentinel) {123  // Without sentinel tracking.124  RawNode A, B;125  EXPECT_FALSE(A.isKnownSentinel());126  A.setPrev(&B);127  A.setNext(&B);128  EXPECT_EQ(&B, A.getPrev());129  EXPECT_EQ(&B, A.getNext());130  EXPECT_FALSE(A.isKnownSentinel());131  A.initializeSentinel();132  EXPECT_FALSE(A.isKnownSentinel());133  EXPECT_EQ(&B, A.getPrev());134  EXPECT_EQ(&B, A.getNext());135 136  // With sentinel tracking.137  TrackingNode TA, TB;138  EXPECT_FALSE(TA.isKnownSentinel());139  EXPECT_FALSE(TA.isSentinel());140  TA.setPrev(&TB);141  TA.setNext(&TB);142  EXPECT_EQ(&TB, TA.getPrev());143  EXPECT_EQ(&TB, TA.getNext());144  EXPECT_FALSE(TA.isKnownSentinel());145  EXPECT_FALSE(TA.isSentinel());146  TA.initializeSentinel();147  EXPECT_TRUE(TA.isKnownSentinel());148  EXPECT_TRUE(TA.isSentinel());149  EXPECT_EQ(&TB, TA.getPrev());150  EXPECT_EQ(&TB, TA.getNext());151 152  // Without sentinel tracking (with Parent).153  ParentNode PA, PB;154  EXPECT_FALSE(PA.isKnownSentinel());155  PA.setPrev(&PB);156  PA.setNext(&PB);157  EXPECT_EQ(&PB, PA.getPrev());158  EXPECT_EQ(&PB, PA.getNext());159  EXPECT_FALSE(PA.isKnownSentinel());160  PA.initializeSentinel();161  EXPECT_FALSE(PA.isKnownSentinel());162  EXPECT_EQ(&PB, PA.getPrev());163  EXPECT_EQ(&PB, PA.getNext());164 165  // With sentinel tracking (with Parent).166  ParentTrackingNode PTA, PTB;167  EXPECT_FALSE(PTA.isKnownSentinel());168  EXPECT_FALSE(PTA.isSentinel());169  PTA.setPrev(&PTB);170  PTA.setNext(&PTB);171  EXPECT_EQ(&PTB, PTA.getPrev());172  EXPECT_EQ(&PTB, PTA.getNext());173  EXPECT_FALSE(PTA.isKnownSentinel());174  EXPECT_FALSE(PTA.isSentinel());175  PTA.initializeSentinel();176  EXPECT_TRUE(PTA.isKnownSentinel());177  EXPECT_TRUE(PTA.isSentinel());178  EXPECT_EQ(&PTB, PTA.getPrev());179  EXPECT_EQ(&PTB, PTA.getNext());180}181 182TEST(IListNodeBaseTest, nodeBaseParent) {183  Parent Par;184  ParentNode PA;185  const ParentNode CPA;186  EXPECT_EQ(nullptr, PA.getNodeBaseParent());187  PA.setNodeBaseParent(&Par);188  EXPECT_EQ(&Par, PA.getNodeBaseParent());189 190  ParentTrackingNode PTA;191  EXPECT_EQ(nullptr, PTA.getNodeBaseParent());192  PTA.setNodeBaseParent(&Par);193  EXPECT_EQ(&Par, PTA.getNodeBaseParent());194 195  using VarParentTy = std::remove_pointer_t<decltype(PA.getNodeBaseParent())>;196  using ConstParentTy =197      std::remove_pointer_t<decltype(CPA.getNodeBaseParent())>;198  static_assert(199      std::is_const_v<ConstParentTy> &&200          std::is_same_v<VarParentTy, std::remove_const_t<ConstParentTy>>,201      "`getNodeBaseParent() const` adds const to parent type");202}203 204} // end namespace205