| // Copyright 2021 The PDFium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "core/fxcrt/mask.h" |
| |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace fxcrt { |
| namespace { |
| |
| enum class Privilege : uint8_t { |
| kPriv1 = 1 << 0, |
| kPriv2 = 1 << 1, |
| kPriv4 = 1 << 2, |
| kPriv8 = 1 << 3, |
| kPriv16 = 1 << 4, |
| kPriv32 = 1 << 5, |
| kPriv64 = 1 << 6, |
| kPriv128 = 1 << 7, |
| }; |
| |
| constexpr Mask<Privilege> kAllMask = { |
| Privilege::kPriv1, Privilege::kPriv2, Privilege::kPriv4, |
| Privilege::kPriv8, Privilege::kPriv16, Privilege::kPriv32, |
| Privilege::kPriv64, Privilege::kPriv128, |
| }; |
| |
| } // namespace |
| |
| static_assert(sizeof(Mask<Privilege>) == sizeof(Privilege), |
| "Mask size must be the same as enum"); |
| |
| TEST(Mask, Empty) { |
| constexpr Mask<Privilege> privs; |
| EXPECT_EQ(0u, privs.UncheckedValue()); |
| EXPECT_FALSE(privs & Privilege::kPriv1); |
| EXPECT_FALSE(privs & Privilege::kPriv4); |
| EXPECT_FALSE(privs & Privilege::kPriv8); |
| EXPECT_FALSE(privs & kAllMask); |
| } |
| |
| TEST(Mask, FromOne) { |
| Mask<Privilege> privs = Privilege::kPriv1; |
| EXPECT_EQ(1u, privs.UncheckedValue()); |
| EXPECT_TRUE(privs & Privilege::kPriv1); |
| EXPECT_FALSE(privs & Privilege::kPriv4); |
| EXPECT_FALSE(privs & Privilege::kPriv8); |
| EXPECT_TRUE(privs & kAllMask); |
| } |
| |
| TEST(Mask, FromTwo) { |
| // Not adjacent bits, just because. |
| Mask<Privilege> privs = {Privilege::kPriv1, Privilege::kPriv8}; |
| EXPECT_EQ(9u, privs.UncheckedValue()); |
| EXPECT_TRUE(privs & Privilege::kPriv1); |
| EXPECT_FALSE(privs & Privilege::kPriv4); |
| EXPECT_TRUE(privs & Privilege::kPriv8); |
| EXPECT_TRUE(privs & kAllMask); |
| } |
| |
| TEST(Mask, FromThree) { |
| Mask<Privilege> privs = { |
| Privilege::kPriv1, |
| Privilege::kPriv2, |
| Privilege::kPriv4, |
| }; |
| EXPECT_EQ(7u, privs.UncheckedValue()); |
| } |
| |
| TEST(Mask, FromFour) { |
| Mask<Privilege> privs = { |
| Privilege::kPriv1, |
| Privilege::kPriv2, |
| Privilege::kPriv4, |
| Privilege::kPriv8, |
| }; |
| EXPECT_EQ(15u, privs.UncheckedValue()); |
| } |
| |
| TEST(Mask, FromFive) { |
| Mask<Privilege> privs = { |
| Privilege::kPriv1, Privilege::kPriv2, Privilege::kPriv4, |
| Privilege::kPriv8, Privilege::kPriv16, |
| }; |
| EXPECT_EQ(31u, privs.UncheckedValue()); |
| } |
| |
| TEST(Mask, FromSix) { |
| Mask<Privilege> privs = { |
| Privilege::kPriv1, Privilege::kPriv2, Privilege::kPriv4, |
| Privilege::kPriv8, Privilege::kPriv16, Privilege::kPriv32, |
| }; |
| EXPECT_EQ(63u, privs.UncheckedValue()); |
| } |
| |
| TEST(Mask, FromSeven) { |
| Mask<Privilege> privs = { |
| Privilege::kPriv1, Privilege::kPriv2, Privilege::kPriv4, |
| Privilege::kPriv8, Privilege::kPriv16, Privilege::kPriv32, |
| Privilege::kPriv64, |
| }; |
| EXPECT_EQ(127u, privs.UncheckedValue()); |
| } |
| |
| TEST(Mask, FromEight) { |
| Mask<Privilege> privs = { |
| Privilege::kPriv1, Privilege::kPriv2, Privilege::kPriv4, |
| Privilege::kPriv8, Privilege::kPriv16, Privilege::kPriv32, |
| Privilege::kPriv64, Privilege::kPriv128, |
| }; |
| EXPECT_EQ(255u, privs.UncheckedValue()); |
| } |
| |
| TEST(Mask, FromUnderlying) { |
| auto privs = Mask<Privilege>::FromUnderlyingUnchecked(5); |
| EXPECT_EQ(5u, privs.UncheckedValue()); |
| EXPECT_TRUE(privs & Privilege::kPriv1); |
| EXPECT_TRUE(privs & Privilege::kPriv4); |
| EXPECT_FALSE(privs & Privilege::kPriv8); |
| } |
| |
| TEST(Mask, AssignAndEQ) { |
| Mask<Privilege> source = {Privilege::kPriv1, Privilege::kPriv8}; |
| Mask<Privilege> other = Privilege::kPriv1; |
| Mask<Privilege> dest; |
| dest = source; |
| EXPECT_EQ(9u, dest.UncheckedValue()); |
| EXPECT_EQ(source, dest); |
| EXPECT_NE(other, dest); |
| } |
| |
| TEST(Mask, OrAndAnd) { |
| Mask<Privilege> source = {Privilege::kPriv1, Privilege::kPriv8}; |
| Mask<Privilege> or_result = |
| source | Mask<Privilege>{Privilege::kPriv1, Privilege::kPriv4}; |
| Mask<Privilege> and_result = |
| source & Mask<Privilege>{Privilege::kPriv1, Privilege::kPriv4}; |
| EXPECT_EQ(13u, or_result.UncheckedValue()); |
| EXPECT_EQ(1u, and_result.UncheckedValue()); |
| } |
| |
| TEST(Mask, OrEqualsAndAndEquals) { |
| Mask<Privilege> source_or = {Privilege::kPriv1, Privilege::kPriv8}; |
| Mask<Privilege> source_and = {Privilege::kPriv1, Privilege::kPriv8}; |
| source_or |= {Privilege::kPriv1, Privilege::kPriv4}; |
| source_and &= {Privilege::kPriv1, Privilege::kPriv4}; |
| EXPECT_EQ(13u, source_or.UncheckedValue()); |
| EXPECT_EQ(1u, source_and.UncheckedValue()); |
| } |
| |
| TEST(Mask, Clear) { |
| Mask<Privilege> source = kAllMask; |
| source.Clear({Privilege::kPriv1, Privilege::kPriv4}); |
| EXPECT_EQ(250u, source.UncheckedValue()); |
| } |
| |
| TEST(Mask, TestAll) { |
| Mask<Privilege> source = { |
| Privilege::kPriv1, |
| Privilege::kPriv8, |
| Privilege::kPriv64, |
| }; |
| Mask<Privilege> passes = {Privilege::kPriv1, Privilege::kPriv64}; |
| Mask<Privilege> fails = {Privilege::kPriv1, Privilege::kPriv32}; |
| EXPECT_TRUE(source.TestAll(passes)); |
| EXPECT_FALSE(source.TestAll(fails)); |
| } |
| |
| } // namespace fxcrt |