brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · 8183845 Raw
126 lines · cpp
1//===-- tsan_ilist_test.cpp -----------------------------------------------===//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// This file is a part of ThreadSanitizer (TSan), a race detector.10//11//===----------------------------------------------------------------------===//12#include "tsan_ilist.h"13 14#include "gtest/gtest.h"15 16namespace __tsan {17 18struct Node {19  INode node1;20  INode node2;21};22 23struct Parent : Node {};24 25TEST(IList, Empty) {26  IList<Node, &Node::node1> list;27  Node node;28 29  EXPECT_TRUE(list.Empty());30  EXPECT_EQ(list.Size(), (size_t)0);31  EXPECT_EQ(list.Back(), nullptr);32  EXPECT_EQ(list.Front(), nullptr);33  EXPECT_EQ(list.PopBack(), nullptr);34  EXPECT_EQ(list.PopFront(), nullptr);35  EXPECT_FALSE(list.Queued(&node));36}37 38TEST(IList, OneNode) {39  IList<Node, &Node::node1> list;40  Node node;41 42  list.PushBack(&node);43  EXPECT_FALSE(list.Empty());44  EXPECT_EQ(list.Size(), (size_t)1);45  EXPECT_EQ(list.Back(), &node);46  EXPECT_EQ(list.Front(), &node);47  EXPECT_TRUE(list.Queued(&node));48  EXPECT_EQ(list.Prev(&node), nullptr);49  EXPECT_EQ(list.Next(&node), nullptr);50 51  EXPECT_EQ(list.PopFront(), &node);52  EXPECT_TRUE(list.Empty());53  EXPECT_EQ(list.Size(), (size_t)0);54  EXPECT_FALSE(list.Queued(&node));55}56 57TEST(IList, MultipleNodes) {58  IList<Node, &Node::node1> list;59  Node nodes[3];60 61  list.PushBack(&nodes[1]);62  list.PushBack(&nodes[0]);63  list.PushFront(&nodes[2]);64 65  EXPECT_EQ(list.Size(), (size_t)3);66  EXPECT_EQ(list.Back(), &nodes[0]);67  EXPECT_EQ(list.Front(), &nodes[2]);68 69  EXPECT_EQ(list.Next(&nodes[0]), nullptr);70  EXPECT_EQ(list.Prev(&nodes[0]), &nodes[1]);71 72  EXPECT_EQ(list.Next(&nodes[1]), &nodes[0]);73  EXPECT_EQ(list.Prev(&nodes[1]), &nodes[2]);74 75  EXPECT_EQ(list.Next(&nodes[2]), &nodes[1]);76  EXPECT_EQ(list.Prev(&nodes[2]), nullptr);77 78  EXPECT_EQ(list.PopBack(), &nodes[0]);79  EXPECT_EQ(list.PopFront(), &nodes[2]);80  EXPECT_EQ(list.PopFront(), &nodes[1]);81  EXPECT_TRUE(list.Empty());82}83 84TEST(IList, TwoLists) {85  IList<Node, &Node::node1> list1;86  IList<Node, &Node::node2, Parent> list2;87  Parent nodes[3];88 89  list1.PushBack(&nodes[2]);90  list1.PushBack(&nodes[1]);91  list1.PushBack(&nodes[0]);92 93  list2.PushFront(&nodes[1]);94 95  EXPECT_EQ(list1.Size(), (size_t)3);96  EXPECT_TRUE(list1.Queued(&nodes[0]));97  EXPECT_TRUE(list1.Queued(&nodes[1]));98  EXPECT_TRUE(list1.Queued(&nodes[2]));99 100  EXPECT_EQ(list2.Size(), (size_t)1);101  EXPECT_FALSE(list2.Queued(&nodes[0]));102  EXPECT_TRUE(list2.Queued(&nodes[1]));103  EXPECT_FALSE(list2.Queued(&nodes[2]));104 105  EXPECT_EQ(list1.Next(&nodes[1]), &nodes[0]);106  EXPECT_EQ(list1.Prev(&nodes[1]), &nodes[2]);107 108  EXPECT_EQ(list2.Next(&nodes[1]), nullptr);109  EXPECT_EQ(list2.Prev(&nodes[1]), nullptr);110 111  list1.Remove(&nodes[1]);112  EXPECT_EQ(list1.Size(), (size_t)2);113  EXPECT_FALSE(list1.Queued(&nodes[1]));114  EXPECT_EQ(list2.Size(), (size_t)1);115  EXPECT_TRUE(list2.Queued(&nodes[1]));116 117  EXPECT_EQ(list1.PopBack(), &nodes[0]);118  EXPECT_EQ(list1.PopBack(), &nodes[2]);119  EXPECT_EQ(list1.Size(), (size_t)0);120 121  EXPECT_EQ(list2.PopBack(), &nodes[1]);122  EXPECT_EQ(list2.Size(), (size_t)0);123}124 125}  // namespace __tsan126