blob: eeec025fd8202d7857db7f00aa4d3134f67c1c48 [file] [log] [blame] [edit]
/*
* Copyright (C) 2025 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "Test.h"
#include <wtf/EnumSet.h>
#include <wtf/HashSet.h>
namespace TestWebKitAPI {
enum class EnumSetTestFlags : uint8_t {
A,
B,
C,
D = 31,
E = 63,
};
TEST(WTF_EnumSet, EmptySet)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set;
EXPECT_TRUE(set.isEmpty());
EXPECT_FALSE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
EXPECT_FALSE(set.contains(EnumSetTestFlags::D));
EXPECT_FALSE(set.contains(EnumSetTestFlags::E));
}
TEST(WTF_EnumSet, ContainsOneFlag)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set = EnumSetTestFlags::A;
EXPECT_FALSE(set.isEmpty());
EXPECT_TRUE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
EXPECT_FALSE(set.contains(EnumSetTestFlags::D));
EXPECT_FALSE(set.contains(EnumSetTestFlags::E));
}
TEST(WTF_EnumSet, Equal)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set { EnumSetTestFlags::A, EnumSetTestFlags::B };
EXPECT_TRUE((set == EnumSetType { EnumSetTestFlags::A, EnumSetTestFlags::B }));
EXPECT_TRUE((set == EnumSetType { EnumSetTestFlags::B, EnumSetTestFlags::A }));
EXPECT_FALSE(set == EnumSetTestFlags::B);
}
TEST(WTF_EnumSet, NotEqual)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set = EnumSetTestFlags::A;
EXPECT_TRUE(set != EnumSetTestFlags::B);
EXPECT_FALSE(set != EnumSetTestFlags::A);
}
TEST(WTF_EnumSet, Or)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set { EnumSetTestFlags::A, EnumSetTestFlags::B, EnumSetTestFlags::C };
EnumSetType set2 { EnumSetTestFlags::C, EnumSetTestFlags::D };
EXPECT_TRUE(((set | EnumSetTestFlags::A) == EnumSetType { EnumSetTestFlags::A, EnumSetTestFlags::B, EnumSetTestFlags::C }));
EXPECT_TRUE(((set | EnumSetTestFlags::D) == EnumSetType { EnumSetTestFlags::A, EnumSetTestFlags::B, EnumSetTestFlags::C, EnumSetTestFlags::D }));
EXPECT_TRUE(((set | set2) == EnumSetType { EnumSetTestFlags::A, EnumSetTestFlags::B, EnumSetTestFlags::C, EnumSetTestFlags::D }));
}
TEST(WTF_EnumSet, OrAssignment)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set { EnumSetTestFlags::A, EnumSetTestFlags::B, EnumSetTestFlags::C };
set |= { };
EXPECT_TRUE((set == EnumSetType { EnumSetTestFlags::A, EnumSetTestFlags::B, EnumSetTestFlags::C }));
set |= { EnumSetTestFlags::A };
EXPECT_TRUE((set == EnumSetType { EnumSetTestFlags::A, EnumSetTestFlags::B, EnumSetTestFlags::C }));
set |= { EnumSetTestFlags::C, EnumSetTestFlags::D };
EXPECT_TRUE((set == EnumSetType { EnumSetTestFlags::A, EnumSetTestFlags::B, EnumSetTestFlags::C, EnumSetTestFlags::D }));
}
TEST(WTF_EnumSet, Minus)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set { EnumSetTestFlags::A, EnumSetTestFlags::B, EnumSetTestFlags::C };
EXPECT_TRUE(((set - EnumSetTestFlags::A) == EnumSetType { EnumSetTestFlags::B, EnumSetTestFlags::C }));
EXPECT_TRUE(((set - EnumSetTestFlags::D) == EnumSetType { EnumSetTestFlags::A, EnumSetTestFlags::B, EnumSetTestFlags::C }));
EXPECT_TRUE((set - set).isEmpty());
}
TEST(WTF_EnumSet, AddAndRemove)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set;
set.add(EnumSetTestFlags::A);
EXPECT_TRUE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
set.add({ EnumSetTestFlags::B, EnumSetTestFlags::C });
EXPECT_TRUE(set.contains(EnumSetTestFlags::A));
EXPECT_TRUE(set.contains(EnumSetTestFlags::B));
EXPECT_TRUE(set.contains(EnumSetTestFlags::C));
set.remove(EnumSetTestFlags::B);
EXPECT_TRUE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_TRUE(set.contains(EnumSetTestFlags::C));
set.remove({ EnumSetTestFlags::A, EnumSetTestFlags::C });
EXPECT_FALSE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
}
TEST(WTF_EnumSet, Set)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set;
set.set(EnumSetTestFlags::A, true);
EXPECT_TRUE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
set.set({ EnumSetTestFlags::B, EnumSetTestFlags::C }, true);
EXPECT_TRUE(set.contains(EnumSetTestFlags::A));
EXPECT_TRUE(set.contains(EnumSetTestFlags::B));
EXPECT_TRUE(set.contains(EnumSetTestFlags::C));
set.set(EnumSetTestFlags::B, false);
EXPECT_TRUE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_TRUE(set.contains(EnumSetTestFlags::C));
set.set({ EnumSetTestFlags::A, EnumSetTestFlags::C }, false);
EXPECT_FALSE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
}
TEST(WTF_EnumSet, ContainsTwoFlags)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set { EnumSetTestFlags::A, EnumSetTestFlags::B };
EXPECT_FALSE(set.isEmpty());
EXPECT_TRUE(set.contains(EnumSetTestFlags::A));
EXPECT_TRUE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
EXPECT_FALSE(set.contains(EnumSetTestFlags::D));
EXPECT_FALSE(set.contains(EnumSetTestFlags::E));
}
TEST(WTF_EnumSet, ContainsTwoFlags2)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set { EnumSetTestFlags::A, EnumSetTestFlags::D };
EXPECT_FALSE(set.isEmpty());
EXPECT_TRUE(set.contains(EnumSetTestFlags::A));
EXPECT_TRUE(set.contains(EnumSetTestFlags::D));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
EXPECT_FALSE(set.contains(EnumSetTestFlags::E));
}
TEST(WTF_EnumSet, ContainsTwoFlags3)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set { EnumSetTestFlags::D, EnumSetTestFlags::E };
EXPECT_FALSE(set.isEmpty());
EXPECT_TRUE(set.contains(EnumSetTestFlags::D));
EXPECT_TRUE(set.contains(EnumSetTestFlags::E));
EXPECT_FALSE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
}
TEST(WTF_EnumSet, EmptyEnumSetToRawValueToEnumSet)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set;
EXPECT_TRUE(set.isEmpty());
EXPECT_FALSE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
auto set2 = EnumSetType::fromRaw(set.toRaw());
EXPECT_TRUE(set2.isEmpty());
EXPECT_FALSE(set2.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set2.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set2.contains(EnumSetTestFlags::C));
}
TEST(WTF_EnumSet, EnumSetThatContainsOneFlagToRawValueToEnumSet)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set = EnumSetTestFlags::A;
EXPECT_FALSE(set.isEmpty());
EXPECT_TRUE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
EXPECT_FALSE(set.contains(EnumSetTestFlags::D));
EXPECT_FALSE(set.contains(EnumSetTestFlags::E));
auto set2 = EnumSetType::fromRaw(set.toRaw());
EXPECT_FALSE(set2.isEmpty());
EXPECT_TRUE(set2.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set2.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set2.contains(EnumSetTestFlags::C));
EXPECT_FALSE(set2.contains(EnumSetTestFlags::D));
EXPECT_FALSE(set2.contains(EnumSetTestFlags::E));
}
TEST(WTF_EnumSet, EnumSetThatContainsOneFlagToRawValueToEnumSet2)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set = EnumSetTestFlags::E;
EXPECT_FALSE(set.isEmpty());
EXPECT_TRUE(set.contains(EnumSetTestFlags::E));
EXPECT_FALSE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
EXPECT_FALSE(set.contains(EnumSetTestFlags::D));
auto set2 = EnumSetType::fromRaw(set.toRaw());
EXPECT_FALSE(set2.isEmpty());
EXPECT_TRUE(set2.contains(EnumSetTestFlags::E));
EXPECT_FALSE(set2.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set2.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set2.contains(EnumSetTestFlags::C));
EXPECT_FALSE(set2.contains(EnumSetTestFlags::D));
}
TEST(WTF_EnumSet, EnumSetThatContainsTwoFlagsToRawValueToEnumSet)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set { EnumSetTestFlags::A, EnumSetTestFlags::C };
EXPECT_FALSE(set.isEmpty());
EXPECT_TRUE(set.contains(EnumSetTestFlags::A));
EXPECT_TRUE(set.contains(EnumSetTestFlags::C));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
auto set2 = EnumSetType::fromRaw(set.toRaw());
EXPECT_FALSE(set2.isEmpty());
EXPECT_TRUE(set2.contains(EnumSetTestFlags::A));
EXPECT_TRUE(set2.contains(EnumSetTestFlags::C));
EXPECT_FALSE(set2.contains(EnumSetTestFlags::B));
}
TEST(WTF_EnumSet, EnumSetThatContainsTwoFlagsToRawValueToEnumSet2)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set { EnumSetTestFlags::D, EnumSetTestFlags::E };
EXPECT_FALSE(set.isEmpty());
EXPECT_TRUE(set.contains(EnumSetTestFlags::D));
EXPECT_TRUE(set.contains(EnumSetTestFlags::E));
EXPECT_FALSE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
auto set2 = EnumSetType::fromRaw(set.toRaw());
EXPECT_FALSE(set2.isEmpty());
EXPECT_TRUE(set2.contains(EnumSetTestFlags::D));
EXPECT_TRUE(set2.contains(EnumSetTestFlags::E));
EXPECT_FALSE(set2.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set2.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set2.contains(EnumSetTestFlags::C));
}
TEST(WTF_EnumSet, TwoIteratorsIntoSameEnumSet)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set { EnumSetTestFlags::C, EnumSetTestFlags::B };
typename EnumSetType::iterator it1 = set.begin();
typename EnumSetType::iterator it2 = it1;
++it1;
EXPECT_STRONG_ENUM_EQ(EnumSetTestFlags::C, *it1);
EXPECT_STRONG_ENUM_EQ(EnumSetTestFlags::B, *it2);
}
TEST(WTF_EnumSet, IterateOverEnumSetThatContainsTwoFlags)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set { EnumSetTestFlags::A, EnumSetTestFlags::C };
typename EnumSetType::iterator it = set.begin();
typename EnumSetType::iterator end = set.end();
EXPECT_TRUE(it != end);
EXPECT_STRONG_ENUM_EQ(EnumSetTestFlags::A, *it);
++it;
EXPECT_STRONG_ENUM_EQ(EnumSetTestFlags::C, *it);
++it;
EXPECT_TRUE(it == end);
}
TEST(WTF_EnumSet, IterateOverEnumSetThatContainsFlags2)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set { EnumSetTestFlags::D, EnumSetTestFlags::E };
typename EnumSetType::iterator it = set.begin();
typename EnumSetType::iterator end = set.end();
EXPECT_TRUE(it != end);
EXPECT_STRONG_ENUM_EQ(EnumSetTestFlags::D, *it);
++it;
EXPECT_STRONG_ENUM_EQ(EnumSetTestFlags::E, *it);
++it;
EXPECT_TRUE(it == end);
}
TEST(WTF_EnumSet, NextItemAfterLargestIn32BitFlagSet)
{
enum class ThirtyTwoBitFlags : uint32_t {
A = 31,
};
using EnumSetType = EnumSet<ThirtyTwoBitFlags>;
EnumSetType set { ThirtyTwoBitFlags::A };
typename EnumSetType::iterator it = set.begin();
typename EnumSetType::iterator end = set.end();
EXPECT_TRUE(it != end);
++it;
EXPECT_TRUE(it == end);
}
TEST(WTF_EnumSet, NextItemAfterLargestIn64BitFlagSet)
{
enum class SixtyFourBitFlags : uint32_t {
A = 63,
};
using EnumSetType = EnumSet<SixtyFourBitFlags>;
EnumSetType set { SixtyFourBitFlags::A };
typename EnumSetType::iterator it = set.begin();
typename EnumSetType::iterator end = set.end();
EXPECT_TRUE(it != end);
++it;
EXPECT_TRUE(it == end);
}
TEST(WTF_EnumSet, IterationOrderTheSameRegardlessOfInsertionOrder)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set1 = EnumSetTestFlags::C;
set1.add(EnumSetTestFlags::A);
EnumSetType set2 = EnumSetTestFlags::A;
set2.add(EnumSetTestFlags::C);
typename EnumSetType::iterator it1 = set1.begin();
typename EnumSetType::iterator it2 = set2.begin();
EXPECT_TRUE(*it1 == *it2);
++it1;
++it2;
EXPECT_TRUE(*it1 == *it2);
}
TEST(WTF_EnumSet, OperatorAnd)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType a { EnumSetTestFlags::A };
EnumSetType ac { EnumSetTestFlags::A, EnumSetTestFlags::C };
EnumSetType bc { EnumSetTestFlags::B, EnumSetTestFlags::C };
{
auto set = a & ac;
EXPECT_TRUE(!!set);
EXPECT_FALSE(set.isEmpty());
EXPECT_TRUE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
}
{
auto set = a & bc;
EXPECT_FALSE(!!set);
EXPECT_TRUE(set.isEmpty());
EXPECT_FALSE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
}
{
auto set = ac & bc;
EXPECT_TRUE(!!set);
EXPECT_FALSE(set.isEmpty());
EXPECT_FALSE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_TRUE(set.contains(EnumSetTestFlags::C));
}
{
auto set = EnumSetTestFlags::A & bc;
EXPECT_FALSE(!!set);
EXPECT_TRUE(set.isEmpty());
EXPECT_FALSE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
}
{
auto set = EnumSetTestFlags::A & ac;
EXPECT_TRUE(!!set);
EXPECT_FALSE(set.isEmpty());
EXPECT_TRUE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
}
{
auto set = bc & EnumSetTestFlags::A;
EXPECT_FALSE(!!set);
EXPECT_TRUE(set.isEmpty());
EXPECT_FALSE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
}
{
auto set = ac & EnumSetTestFlags::A;
EXPECT_TRUE(!!set);
EXPECT_FALSE(set.isEmpty());
EXPECT_TRUE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
}
}
TEST(WTF_EnumSet, OperatorXor)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType a { EnumSetTestFlags::A };
EnumSetType ac { EnumSetTestFlags::A, EnumSetTestFlags::C };
EnumSetType bc { EnumSetTestFlags::B, EnumSetTestFlags::C };
{
auto set = a ^ ac;
EXPECT_FALSE(set.contains(EnumSetTestFlags::A));
EXPECT_FALSE(set.contains(EnumSetTestFlags::B));
EXPECT_TRUE(set.contains(EnumSetTestFlags::C));
}
{
auto set = a ^ bc;
EXPECT_TRUE(set.contains(EnumSetTestFlags::A));
EXPECT_TRUE(set.contains(EnumSetTestFlags::B));
EXPECT_TRUE(set.contains(EnumSetTestFlags::C));
}
{
auto set = ac ^ bc;
EXPECT_TRUE(set.contains(EnumSetTestFlags::A));
EXPECT_TRUE(set.contains(EnumSetTestFlags::B));
EXPECT_FALSE(set.contains(EnumSetTestFlags::C));
}
}
TEST(WTF_EnumSet, ContainsAny)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set { EnumSetTestFlags::A, EnumSetTestFlags::B };
EXPECT_TRUE(set.containsAny({ EnumSetTestFlags::A }));
EXPECT_TRUE(set.containsAny({ EnumSetTestFlags::B }));
EXPECT_FALSE(set.containsAny({ EnumSetTestFlags::C }));
EXPECT_FALSE(set.containsAny({ EnumSetTestFlags::C, EnumSetTestFlags::D }));
EXPECT_TRUE(set.containsAny({ EnumSetTestFlags::A, EnumSetTestFlags::B }));
EXPECT_TRUE(set.containsAny({ EnumSetTestFlags::B, EnumSetTestFlags::C }));
EXPECT_TRUE(set.containsAny({ EnumSetTestFlags::A, EnumSetTestFlags::C }));
EXPECT_TRUE(set.containsAny({ EnumSetTestFlags::A, EnumSetTestFlags::B, EnumSetTestFlags::C }));
}
TEST(WTF_EnumSet, ContainsAll)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set { EnumSetTestFlags::A, EnumSetTestFlags::B };
EXPECT_TRUE(set.containsAll({ EnumSetTestFlags::A }));
EXPECT_TRUE(set.containsAll({ EnumSetTestFlags::B }));
EXPECT_FALSE(set.containsAll({ EnumSetTestFlags::C }));
EXPECT_FALSE(set.containsAll({ EnumSetTestFlags::C, EnumSetTestFlags::D }));
EXPECT_TRUE(set.containsAll({ EnumSetTestFlags::A, EnumSetTestFlags::B }));
EXPECT_FALSE(set.containsAll({ EnumSetTestFlags::B, EnumSetTestFlags::C }));
EXPECT_FALSE(set.containsAll({ EnumSetTestFlags::A, EnumSetTestFlags::C }));
EXPECT_FALSE(set.containsAll({ EnumSetTestFlags::A, EnumSetTestFlags::B, EnumSetTestFlags::C }));
}
TEST(WTF_EnumSet, ToSingleValue)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set { EnumSetTestFlags::D };
EXPECT_TRUE(set.toSingleValue());
EXPECT_TRUE(set.toSingleValue().value() == EnumSetTestFlags::D);
set.add(EnumSetTestFlags::A);
EXPECT_FALSE(set.toSingleValue());
set.remove(EnumSetTestFlags::D);
EXPECT_TRUE(set.toSingleValue());
EXPECT_TRUE(set.toSingleValue().value() == EnumSetTestFlags::A);
set = { };
EXPECT_FALSE(set.toSingleValue());
}
TEST(WTF_EnumSet, Size)
{
using EnumSetType = EnumSet<EnumSetTestFlags>;
EnumSetType set;
EXPECT_EQ(set.size(), 0u);
set.add({ EnumSetTestFlags::A, EnumSetTestFlags::D });
EXPECT_EQ(set.size(), 2u);
set.remove(EnumSetTestFlags::A);
EXPECT_EQ(set.size(), 1u);
}
TEST(WTF_EnumSet, StorageSize)
{
{
enum class Enum : uint8_t {
A,
};
EXPECT_EQ(sizeof(EnumSet<Enum>::StorageType), 8u);
}
{
enum class Enum : uint8_t {
A,
HighestEnumValue = A
};
EXPECT_EQ(sizeof(EnumSet<Enum>::StorageType), 1u);
}
{
enum class Enum : uint8_t {
A = 7,
HighestEnumValue = A
};
EXPECT_EQ(sizeof(EnumSet<Enum>::StorageType), 1u);
}
{
enum class Enum : uint8_t {
A = 8,
HighestEnumValue = A
};
EXPECT_EQ(sizeof(EnumSet<Enum>::StorageType), 2u);
}
{
enum class Enum : uint8_t {
A = 15,
HighestEnumValue = A
};
EXPECT_EQ(sizeof(EnumSet<Enum>::StorageType), 2u);
}
{
enum class Enum : uint8_t {
A = 16,
HighestEnumValue = A
};
EXPECT_EQ(sizeof(EnumSet<Enum>::StorageType), 4u);
}
{
enum class Enum : uint8_t {
A = 31,
HighestEnumValue = A
};
EXPECT_EQ(sizeof(EnumSet<Enum>::StorageType), 4u);
}
{
enum class Enum : uint8_t {
A = 32,
HighestEnumValue = A
};
EXPECT_EQ(sizeof(EnumSet<Enum>::StorageType), 8u);
}
{
enum class Enum : uint8_t {
A = 63,
HighestEnumValue = A
};
EXPECT_EQ(sizeof(EnumSet<Enum>::StorageType), 8u);
}
}
} // namespace TestWebKitAPI