171 lines
4.7 KiB
C++
171 lines
4.7 KiB
C++
|
|
// 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
|