1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "sync/internal_api/public/base/enum_set.h" 6 7 #include "base/basictypes.h" 8 #include "testing/gtest/include/gtest/gtest.h" 9 10 namespace syncer { 11 namespace { 12 13 enum TestEnum { 14 TEST_0, 15 TEST_MIN = TEST_0, 16 TEST_1, 17 TEST_2, 18 TEST_3, 19 TEST_4, 20 TEST_MAX = TEST_4, 21 TEST_5 22 }; 23 24 typedef EnumSet<TestEnum, TEST_MIN, TEST_MAX> TestEnumSet; 25 26 class EnumSetTest : public ::testing::Test {}; 27 28 TEST_F(EnumSetTest, ClassConstants) { 29 TestEnumSet enums; 30 EXPECT_EQ(TEST_MIN, TestEnumSet::kMinValue); 31 EXPECT_EQ(TEST_MAX, TestEnumSet::kMaxValue); 32 EXPECT_EQ(static_cast<size_t>(5), TestEnumSet::kValueCount); 33 } 34 35 TEST_F(EnumSetTest, DefaultConstructor) { 36 const TestEnumSet enums; 37 EXPECT_TRUE(enums.Empty()); 38 EXPECT_EQ(static_cast<size_t>(0), enums.Size()); 39 EXPECT_FALSE(enums.Has(TEST_0)); 40 EXPECT_FALSE(enums.Has(TEST_1)); 41 EXPECT_FALSE(enums.Has(TEST_2)); 42 EXPECT_FALSE(enums.Has(TEST_3)); 43 EXPECT_FALSE(enums.Has(TEST_4)); 44 } 45 46 TEST_F(EnumSetTest, OneArgConstructor) { 47 const TestEnumSet enums(TEST_3); 48 EXPECT_FALSE(enums.Empty()); 49 EXPECT_EQ(static_cast<size_t>(1), enums.Size()); 50 EXPECT_FALSE(enums.Has(TEST_0)); 51 EXPECT_FALSE(enums.Has(TEST_1)); 52 EXPECT_FALSE(enums.Has(TEST_2)); 53 EXPECT_TRUE(enums.Has(TEST_3)); 54 EXPECT_FALSE(enums.Has(TEST_4)); 55 } 56 57 TEST_F(EnumSetTest, TwoArgConstructor) { 58 const TestEnumSet enums(TEST_3, TEST_1); 59 EXPECT_FALSE(enums.Empty()); 60 EXPECT_EQ(static_cast<size_t>(2), enums.Size()); 61 EXPECT_FALSE(enums.Has(TEST_0)); 62 EXPECT_TRUE(enums.Has(TEST_1)); 63 EXPECT_FALSE(enums.Has(TEST_2)); 64 EXPECT_TRUE(enums.Has(TEST_3)); 65 EXPECT_FALSE(enums.Has(TEST_4)); 66 } 67 68 TEST_F(EnumSetTest, ThreeArgConstructor) { 69 const TestEnumSet enums(TEST_3, TEST_1, TEST_0); 70 EXPECT_FALSE(enums.Empty()); 71 EXPECT_EQ(static_cast<size_t>(3), enums.Size()); 72 EXPECT_TRUE(enums.Has(TEST_0)); 73 EXPECT_TRUE(enums.Has(TEST_1)); 74 EXPECT_FALSE(enums.Has(TEST_2)); 75 EXPECT_TRUE(enums.Has(TEST_3)); 76 EXPECT_FALSE(enums.Has(TEST_4)); 77 } 78 79 TEST_F(EnumSetTest, All) { 80 const TestEnumSet enums(TestEnumSet::All()); 81 EXPECT_FALSE(enums.Empty()); 82 EXPECT_EQ(static_cast<size_t>(5), enums.Size()); 83 EXPECT_TRUE(enums.Has(TEST_0)); 84 EXPECT_TRUE(enums.Has(TEST_1)); 85 EXPECT_TRUE(enums.Has(TEST_2)); 86 EXPECT_TRUE(enums.Has(TEST_3)); 87 EXPECT_TRUE(enums.Has(TEST_4)); 88 } 89 90 TEST_F(EnumSetTest, Put) { 91 TestEnumSet enums(TEST_3); 92 enums.Put(TEST_2); 93 EXPECT_TRUE(enums.Equals(TestEnumSet(TEST_2, TEST_3))); 94 enums.Put(TEST_4); 95 EXPECT_TRUE(enums.Equals(TestEnumSet(TEST_2, TEST_3, TEST_4))); 96 } 97 98 TEST_F(EnumSetTest, PutAll) { 99 TestEnumSet enums(TEST_3, TEST_4); 100 enums.PutAll(TestEnumSet(TEST_2, TEST_3)); 101 EXPECT_TRUE(enums.Equals(TestEnumSet(TEST_2, TEST_3, TEST_4))); 102 } 103 104 TEST_F(EnumSetTest, RetainAll) { 105 TestEnumSet enums(TEST_3, TEST_4); 106 enums.RetainAll(TestEnumSet(TEST_2, TEST_3)); 107 EXPECT_TRUE(enums.Equals(TestEnumSet(TEST_3))); 108 } 109 110 TEST_F(EnumSetTest, Remove) { 111 TestEnumSet enums(TEST_3, TEST_4); 112 enums.Remove(TEST_0); 113 enums.Remove(TEST_2); 114 EXPECT_TRUE(enums.Equals(TestEnumSet(TEST_3, TEST_4))); 115 enums.Remove(TEST_3); 116 EXPECT_TRUE(enums.Equals(TestEnumSet(TEST_4))); 117 enums.Remove(TEST_4); 118 enums.Remove(TEST_5); 119 EXPECT_TRUE(enums.Empty()); 120 } 121 122 TEST_F(EnumSetTest, RemoveAll) { 123 TestEnumSet enums(TEST_3, TEST_4); 124 enums.RemoveAll(TestEnumSet(TEST_2, TEST_3)); 125 EXPECT_TRUE(enums.Equals(TestEnumSet(TEST_4))); 126 } 127 128 TEST_F(EnumSetTest, Clear) { 129 TestEnumSet enums(TEST_3, TEST_4); 130 enums.Clear(); 131 EXPECT_TRUE(enums.Empty()); 132 } 133 134 TEST_F(EnumSetTest, Has) { 135 const TestEnumSet enums(TEST_3, TEST_4); 136 EXPECT_FALSE(enums.Has(TEST_0)); 137 EXPECT_FALSE(enums.Has(TEST_1)); 138 EXPECT_FALSE(enums.Has(TEST_2)); 139 EXPECT_TRUE(enums.Has(TEST_3)); 140 EXPECT_TRUE(enums.Has(TEST_4)); 141 EXPECT_FALSE(enums.Has(TEST_5)); 142 } 143 144 TEST_F(EnumSetTest, HasAll) { 145 const TestEnumSet enums1(TEST_3, TEST_4); 146 const TestEnumSet enums2(TEST_2, TEST_3); 147 const TestEnumSet enums3 = Union(enums1, enums2); 148 EXPECT_TRUE(enums1.HasAll(enums1)); 149 EXPECT_FALSE(enums1.HasAll(enums2)); 150 EXPECT_FALSE(enums1.HasAll(enums3)); 151 152 EXPECT_FALSE(enums2.HasAll(enums1)); 153 EXPECT_TRUE(enums2.HasAll(enums2)); 154 EXPECT_FALSE(enums2.HasAll(enums3)); 155 156 EXPECT_TRUE(enums3.HasAll(enums1)); 157 EXPECT_TRUE(enums3.HasAll(enums2)); 158 EXPECT_TRUE(enums3.HasAll(enums3)); 159 } 160 161 TEST_F(EnumSetTest, Iterators) { 162 const TestEnumSet enums1(TEST_3, TEST_4); 163 TestEnumSet enums2; 164 for (TestEnumSet::Iterator it = enums1.First(); it.Good(); it.Inc()) { 165 enums2.Put(it.Get()); 166 } 167 EXPECT_TRUE(enums1.Equals(enums2)); 168 } 169 170 TEST_F(EnumSetTest, Union) { 171 const TestEnumSet enums1(TEST_3, TEST_4); 172 const TestEnumSet enums2(TEST_2, TEST_3); 173 const TestEnumSet enums3 = Union(enums1, enums2); 174 175 EXPECT_TRUE(enums3.Equals(TestEnumSet(TEST_2, TEST_3, TEST_4))); 176 } 177 178 TEST_F(EnumSetTest, Intersection) { 179 const TestEnumSet enums1(TEST_3, TEST_4); 180 const TestEnumSet enums2(TEST_2, TEST_3); 181 const TestEnumSet enums3 = Intersection(enums1, enums2); 182 183 EXPECT_TRUE(enums3.Equals(TestEnumSet(TEST_3))); 184 } 185 186 TEST_F(EnumSetTest, Difference) { 187 const TestEnumSet enums1(TEST_3, TEST_4); 188 const TestEnumSet enums2(TEST_2, TEST_3); 189 const TestEnumSet enums3 = Difference(enums1, enums2); 190 191 EXPECT_TRUE(enums3.Equals(TestEnumSet(TEST_4))); 192 } 193 194 } // namespace 195 } // namespace syncer 196