// Copyright (c) 2012 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 "sync/util/enum_set.h" #include "base/basictypes.h" #include "testing/gtest/include/gtest/gtest.h" namespace browser_sync { namespace { enum TestEnum { TEST_0, TEST_MIN = TEST_0, TEST_1, TEST_2, TEST_3, TEST_4, TEST_MAX = TEST_4, TEST_5 }; typedef EnumSet TestEnumSet; class EnumSetTest : public ::testing::Test {}; TEST_F(EnumSetTest, ClassConstants) { TestEnumSet enums; EXPECT_EQ(TEST_MIN, TestEnumSet::kMinValue); EXPECT_EQ(TEST_MAX, TestEnumSet::kMaxValue); EXPECT_EQ(static_cast(5), TestEnumSet::kValueCount); } TEST_F(EnumSetTest, DefaultConstructor) { const TestEnumSet enums; EXPECT_TRUE(enums.Empty()); EXPECT_EQ(static_cast(0), enums.Size()); EXPECT_FALSE(enums.Has(TEST_0)); EXPECT_FALSE(enums.Has(TEST_1)); EXPECT_FALSE(enums.Has(TEST_2)); EXPECT_FALSE(enums.Has(TEST_3)); EXPECT_FALSE(enums.Has(TEST_4)); } TEST_F(EnumSetTest, OneArgConstructor) { const TestEnumSet enums(TEST_3); EXPECT_FALSE(enums.Empty()); EXPECT_EQ(static_cast(1), enums.Size()); EXPECT_FALSE(enums.Has(TEST_0)); EXPECT_FALSE(enums.Has(TEST_1)); EXPECT_FALSE(enums.Has(TEST_2)); EXPECT_TRUE(enums.Has(TEST_3)); EXPECT_FALSE(enums.Has(TEST_4)); } TEST_F(EnumSetTest, TwoArgConstructor) { const TestEnumSet enums(TEST_3, TEST_1); EXPECT_FALSE(enums.Empty()); EXPECT_EQ(static_cast(2), enums.Size()); EXPECT_FALSE(enums.Has(TEST_0)); EXPECT_TRUE(enums.Has(TEST_1)); EXPECT_FALSE(enums.Has(TEST_2)); EXPECT_TRUE(enums.Has(TEST_3)); EXPECT_FALSE(enums.Has(TEST_4)); } TEST_F(EnumSetTest, ThreeArgConstructor) { const TestEnumSet enums(TEST_3, TEST_1, TEST_0); EXPECT_FALSE(enums.Empty()); EXPECT_EQ(static_cast(3), enums.Size()); EXPECT_TRUE(enums.Has(TEST_0)); EXPECT_TRUE(enums.Has(TEST_1)); EXPECT_FALSE(enums.Has(TEST_2)); EXPECT_TRUE(enums.Has(TEST_3)); EXPECT_FALSE(enums.Has(TEST_4)); } TEST_F(EnumSetTest, All) { const TestEnumSet enums(TestEnumSet::All()); EXPECT_FALSE(enums.Empty()); EXPECT_EQ(static_cast(5), enums.Size()); EXPECT_TRUE(enums.Has(TEST_0)); EXPECT_TRUE(enums.Has(TEST_1)); EXPECT_TRUE(enums.Has(TEST_2)); EXPECT_TRUE(enums.Has(TEST_3)); EXPECT_TRUE(enums.Has(TEST_4)); } TEST_F(EnumSetTest, Put) { TestEnumSet enums(TEST_3); enums.Put(TEST_2); EXPECT_TRUE(enums.Equals(TestEnumSet(TEST_2, TEST_3))); enums.Put(TEST_4); EXPECT_TRUE(enums.Equals(TestEnumSet(TEST_2, TEST_3, TEST_4))); } TEST_F(EnumSetTest, PutAll) { TestEnumSet enums(TEST_3, TEST_4); enums.PutAll(TestEnumSet(TEST_2, TEST_3)); EXPECT_TRUE(enums.Equals(TestEnumSet(TEST_2, TEST_3, TEST_4))); } TEST_F(EnumSetTest, RetainAll) { TestEnumSet enums(TEST_3, TEST_4); enums.RetainAll(TestEnumSet(TEST_2, TEST_3)); EXPECT_TRUE(enums.Equals(TestEnumSet(TEST_3))); } TEST_F(EnumSetTest, Remove) { TestEnumSet enums(TEST_3, TEST_4); enums.Remove(TEST_0); enums.Remove(TEST_2); EXPECT_TRUE(enums.Equals(TestEnumSet(TEST_3, TEST_4))); enums.Remove(TEST_3); EXPECT_TRUE(enums.Equals(TestEnumSet(TEST_4))); enums.Remove(TEST_4); enums.Remove(TEST_5); EXPECT_TRUE(enums.Empty()); } TEST_F(EnumSetTest, RemoveAll) { TestEnumSet enums(TEST_3, TEST_4); enums.RemoveAll(TestEnumSet(TEST_2, TEST_3)); EXPECT_TRUE(enums.Equals(TestEnumSet(TEST_4))); } TEST_F(EnumSetTest, Clear) { TestEnumSet enums(TEST_3, TEST_4); enums.Clear(); EXPECT_TRUE(enums.Empty()); } TEST_F(EnumSetTest, Has) { const TestEnumSet enums(TEST_3, TEST_4); EXPECT_FALSE(enums.Has(TEST_0)); EXPECT_FALSE(enums.Has(TEST_1)); EXPECT_FALSE(enums.Has(TEST_2)); EXPECT_TRUE(enums.Has(TEST_3)); EXPECT_TRUE(enums.Has(TEST_4)); EXPECT_FALSE(enums.Has(TEST_5)); } TEST_F(EnumSetTest, HasAll) { const TestEnumSet enums1(TEST_3, TEST_4); const TestEnumSet enums2(TEST_2, TEST_3); const TestEnumSet enums3 = Union(enums1, enums2); EXPECT_TRUE(enums1.HasAll(enums1)); EXPECT_FALSE(enums1.HasAll(enums2)); EXPECT_FALSE(enums1.HasAll(enums3)); EXPECT_FALSE(enums2.HasAll(enums1)); EXPECT_TRUE(enums2.HasAll(enums2)); EXPECT_FALSE(enums2.HasAll(enums3)); EXPECT_TRUE(enums3.HasAll(enums1)); EXPECT_TRUE(enums3.HasAll(enums2)); EXPECT_TRUE(enums3.HasAll(enums3)); } TEST_F(EnumSetTest, Iterators) { const TestEnumSet enums1(TEST_3, TEST_4); TestEnumSet enums2; for (TestEnumSet::Iterator it = enums1.First(); it.Good(); it.Inc()) { enums2.Put(it.Get()); } EXPECT_TRUE(enums1.Equals(enums2)); } TEST_F(EnumSetTest, Union) { const TestEnumSet enums1(TEST_3, TEST_4); const TestEnumSet enums2(TEST_2, TEST_3); const TestEnumSet enums3 = Union(enums1, enums2); EXPECT_TRUE(enums3.Equals(TestEnumSet(TEST_2, TEST_3, TEST_4))); } TEST_F(EnumSetTest, Intersection) { const TestEnumSet enums1(TEST_3, TEST_4); const TestEnumSet enums2(TEST_2, TEST_3); const TestEnumSet enums3 = Intersection(enums1, enums2); EXPECT_TRUE(enums3.Equals(TestEnumSet(TEST_3))); } TEST_F(EnumSetTest, Difference) { const TestEnumSet enums1(TEST_3, TEST_4); const TestEnumSet enums2(TEST_2, TEST_3); const TestEnumSet enums3 = Difference(enums1, enums2); EXPECT_TRUE(enums3.Equals(TestEnumSet(TEST_4))); } } // namespace } // namespace browser_sync