| // Copyright 2021 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "gn/pointer_set.h" | |
| #include "util/test/test.h" | |
| #include <algorithm> | |
| struct Foo { | |
| int x; | |
| }; | |
| static const Foo kFoo1[1] = {{1}}; | |
| static const Foo kFoo2[1] = {{2}}; | |
| static const Foo kFoo3[1] = {{3}}; | |
| static const std::initializer_list<const Foo*> kFullList = {kFoo1, kFoo2, | |
| kFoo3}; | |
| using TestPointerSet = PointerSet<const Foo>; | |
| TEST(PointerSet, DefaultConstruction) { | |
| TestPointerSet set; | |
| EXPECT_TRUE(set.empty()); | |
| EXPECT_EQ(0u, set.size()); | |
| EXPECT_FALSE(set.contains(kFoo1)); | |
| } | |
| TEST(PointerSet, RangeConstruction) { | |
| TestPointerSet set(kFullList.begin(), kFullList.end()); | |
| EXPECT_FALSE(set.empty()); | |
| EXPECT_EQ(3u, set.size()); | |
| EXPECT_TRUE(set.contains(kFoo1)); | |
| EXPECT_TRUE(set.contains(kFoo2)); | |
| EXPECT_TRUE(set.contains(kFoo3)); | |
| } | |
| TEST(PointerSet, CopyConstruction) { | |
| TestPointerSet set1(kFullList.begin(), kFullList.end()); | |
| TestPointerSet set2(set1); | |
| set1.clear(); | |
| EXPECT_TRUE(set1.empty()); | |
| EXPECT_FALSE(set2.empty()); | |
| EXPECT_EQ(3u, set2.size()); | |
| EXPECT_TRUE(set2.contains(kFoo1)); | |
| EXPECT_TRUE(set2.contains(kFoo2)); | |
| EXPECT_TRUE(set2.contains(kFoo3)); | |
| } | |
| TEST(PointerSet, MoveConstruction) { | |
| TestPointerSet set1(kFullList.begin(), kFullList.end()); | |
| TestPointerSet set2(std::move(set1)); | |
| EXPECT_TRUE(set1.empty()); | |
| EXPECT_FALSE(set2.empty()); | |
| EXPECT_EQ(3u, set2.size()); | |
| EXPECT_TRUE(set2.contains(kFoo1)); | |
| EXPECT_TRUE(set2.contains(kFoo2)); | |
| EXPECT_TRUE(set2.contains(kFoo3)); | |
| } | |
| TEST(PointerSet, Add) { | |
| TestPointerSet set; | |
| EXPECT_TRUE(set.add(kFoo1)); | |
| EXPECT_EQ(1u, set.size()); | |
| EXPECT_TRUE(set.contains(kFoo1)); | |
| EXPECT_FALSE(set.add(kFoo1)); | |
| EXPECT_EQ(1u, set.size()); | |
| EXPECT_TRUE(set.contains(kFoo1)); | |
| EXPECT_TRUE(set.add(kFoo2)); | |
| EXPECT_EQ(2u, set.size()); | |
| EXPECT_TRUE(set.contains(kFoo1)); | |
| EXPECT_TRUE(set.contains(kFoo2)); | |
| EXPECT_FALSE(set.add(kFoo1)); | |
| EXPECT_FALSE(set.add(kFoo2)); | |
| EXPECT_TRUE(set.add(kFoo3)); | |
| EXPECT_EQ(3u, set.size()); | |
| EXPECT_TRUE(set.contains(kFoo1)); | |
| EXPECT_TRUE(set.contains(kFoo2)); | |
| EXPECT_TRUE(set.contains(kFoo3)); | |
| EXPECT_FALSE(set.add(kFoo1)); | |
| EXPECT_FALSE(set.add(kFoo2)); | |
| EXPECT_FALSE(set.add(kFoo3)); | |
| } | |
| TEST(PointerSet, Erase) { | |
| TestPointerSet set(kFullList.begin(), kFullList.end()); | |
| EXPECT_EQ(3u, set.size()); | |
| EXPECT_TRUE(set.erase(kFoo1)); | |
| EXPECT_EQ(2u, set.size()); | |
| EXPECT_FALSE(set.contains(kFoo1)); | |
| EXPECT_FALSE(set.erase(kFoo1)); | |
| EXPECT_EQ(2u, set.size()); | |
| EXPECT_TRUE(set.erase(kFoo2)); | |
| EXPECT_EQ(1u, set.size()); | |
| EXPECT_FALSE(set.contains(kFoo2)); | |
| EXPECT_FALSE(set.erase(kFoo2)); | |
| EXPECT_EQ(1u, set.size()); | |
| EXPECT_TRUE(set.erase(kFoo3)); | |
| EXPECT_EQ(0u, set.size()); | |
| EXPECT_FALSE(set.contains(kFoo3)); | |
| EXPECT_FALSE(set.erase(kFoo3)); | |
| EXPECT_EQ(0u, set.size()); | |
| } | |
| TEST(PointerSet, RangeInsert) { | |
| TestPointerSet set; | |
| set.insert(kFullList.begin(), kFullList.end()); | |
| EXPECT_EQ(3u, set.size()); | |
| EXPECT_TRUE(set.contains(kFoo1)); | |
| EXPECT_TRUE(set.contains(kFoo2)); | |
| EXPECT_TRUE(set.contains(kFoo3)); | |
| set.insert(kFullList.begin(), kFullList.end()); | |
| EXPECT_EQ(3u, set.size()); | |
| } | |
| TEST(PointerSet, InsertOther) { | |
| TestPointerSet set1(kFullList.begin(), kFullList.end()); | |
| TestPointerSet set2; | |
| set2.add(kFoo1); | |
| set1.insert(set2); | |
| EXPECT_EQ(3u, set1.size()); | |
| EXPECT_EQ(1u, set2.size()); | |
| set1.clear(); | |
| set1.add(kFoo1); | |
| set2.clear(); | |
| set2.add(kFoo3); | |
| set1.insert(set2); | |
| EXPECT_EQ(2u, set1.size()); | |
| EXPECT_EQ(1u, set2.size()); | |
| EXPECT_TRUE(set1.contains(kFoo1)); | |
| EXPECT_TRUE(set1.contains(kFoo3)); | |
| } | |
| TEST(PointerSet, IntersectionWith) { | |
| TestPointerSet set1; | |
| TestPointerSet set2; | |
| set1.add(kFoo1); | |
| set2.add(kFoo3); | |
| TestPointerSet set = set1.intersection_with(set2); | |
| EXPECT_TRUE(set.empty()); | |
| set1.add(kFoo2); | |
| set2.add(kFoo2); | |
| set = set1.intersection_with(set2); | |
| EXPECT_FALSE(set.empty()); | |
| EXPECT_EQ(1u, set.size()); | |
| EXPECT_TRUE(set.contains(kFoo2)); | |
| set1.insert(kFullList.begin(), kFullList.end()); | |
| set2 = set1; | |
| set = set1.intersection_with(set2); | |
| EXPECT_EQ(3u, set.size()); | |
| EXPECT_EQ(set1, set); | |
| EXPECT_EQ(set2, set); | |
| } | |
| TEST(PointerSet, ToVector) { | |
| TestPointerSet set(kFullList.begin(), kFullList.end()); | |
| auto vector = set.ToVector(); | |
| EXPECT_EQ(vector.size(), kFullList.size()); | |
| // NOTE: Order of items in the result is not guaranteed | |
| // so just check whether items are available in it. | |
| EXPECT_NE(std::find(vector.begin(), vector.end(), kFoo1), vector.end()); | |
| EXPECT_NE(std::find(vector.begin(), vector.end(), kFoo2), vector.end()); | |
| EXPECT_NE(std::find(vector.begin(), vector.end(), kFoo3), vector.end()); | |
| } |