/*
 * Copyright (C) 2020-2023 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 <wtf/BitSet.h>

namespace TestWebKitAPI {

constexpr size_t size = 128;
constexpr size_t smallSize = 9;
constexpr size_t zeroSize = 0;

static constexpr bool expectedBits1[size] = {
    false, false, true,  false,  false, false, false, false,
    false, false, false, false,  false, false, false, true,
    false, true,  false, false,  false, false, true,  false,
    false, false, true,  false,  false, false, true,  true,
    true,  false, false, false,  false, true,  false, false,
    true,  false, false, false,  false, true,  false, true,
    false, false, false, false,  false, true,  true,  false,
    false, true,  false, false,  false, true,  true,  true,
    false, false, true,  false,  true,  false, false, false,
    false, false, true,  false,  true,  false, false, true,
    true,  false, false, false,  true,  false, true,  false,
    false, false, false, false,  true,  false, true,  true,
    false, false, false, false,  true,  true,  false, false,
    false, true,  false, false,  true,  true,  false, true,
    false, true,  false, false,  true,  true,  true,  false,
    false, false, true,  false,  true,  true,  true,  true,
};

static constexpr bool expectedBits2[size] = {
    false, true,  false, true,   false, false, false, false,
    false, false, false, true,   false, false, false, true,
    false, false, false, true,   false, false, true,  false,
    false, false, false, true,   false, false, true,  true,
    true,  false, false, true,   false, true,  false, false,
    false, false, false, true,   false, true,  false, true,
    false, false, false, true,   false, true,  true,  false,
    false, false, true,  true,   false, true,  true,  true,
    false, true,  false, true,   true,  false, false, false,
    false, true,  false, true,   true,  false, false, true,
    false, false, false, true,   true,  false, true,  false,
    false, false, true,  true,   true,  false, true,  true,
    true,  false, false, true,   true,  true,  false, false,
    false, false, true,  true,   true,  true,  false, true,
    true,  false, false, true,   true,  true,  true,  false,
    false, true,  false, true,   true,  true,  true,  true,
};

static constexpr bool expectedSmallBits1[smallSize] = {
    false, true, true,  false,  true,  false, false, true,
    true,
};

static constexpr bool expectedSmallBits2[smallSize] = {
    true,  true, false, false,  false, false, true,  true,
    false,
};

constexpr size_t countBits(const bool boolArray[], size_t size)
{
    size_t result = 0;
    for (size_t i = 0; i < size; ++i) {
        if (boolArray[i])
            result++;
    }
    return result;
}

constexpr size_t expectedNumberOfSetBits1 = countBits(expectedBits1, size);
constexpr size_t expectedNumberOfSetBits2 = countBits(expectedBits2, size);

#define DECLARE_BITMAPS_FOR_TEST() \
    WTF::BitSet<size, WordType> bitSetZeroes; \
    WTF::BitSet<size, WordType> bitSet1; /* Will hold values specified in expectedBits1. */ \
    WTF::BitSet<size, WordType> bitSet2; /* Will hold values specified in expectedBits2. */ \
    WTF::BitSet<size, WordType> bitSet2Clone; /* Same as bitSet2. */ \
    WTF::BitSet<size, WordType> bitSetOnes; \
    WTF::BitSet<smallSize, WordType> smallBitSetZeroes; \
    WTF::BitSet<smallSize, WordType> smallBitSetOnes; \
    WTF::BitSet<smallSize, WordType> smallBitSet1; /* Will hold values specified in expectedSmallBits1. */ \
    WTF::BitSet<smallSize, WordType> smallBitSet2; /* Will hold values specified in expectedSmallBits2. */ \
    UNUSED_VARIABLE(bitSetZeroes); \
    UNUSED_VARIABLE(bitSet1); \
    UNUSED_VARIABLE(bitSet2); \
    UNUSED_VARIABLE(bitSet2Clone); \
    UNUSED_VARIABLE(bitSetOnes); \
    UNUSED_VARIABLE(smallBitSetZeroes); \
    UNUSED_VARIABLE(smallBitSetOnes); \
    UNUSED_VARIABLE(smallBitSet1); \
    UNUSED_VARIABLE(smallBitSet2);

#define DECLARE_AND_INIT_BITMAPS_FOR_TEST() \
    DECLARE_BITMAPS_FOR_TEST() \
    for (size_t i = 0; i < size; ++i) { \
        bitSet1.set(i, expectedBits1[i]); \
        bitSet2.set(i, expectedBits2[i]); \
        bitSet2Clone.set(i, expectedBits2[i]); \
        bitSetOnes.set(i); \
    } \
    for (size_t i = 0; i < smallSize; ++i) { \
        smallBitSet1.set(i, expectedSmallBits1[i]); \
        smallBitSet2.set(i, expectedSmallBits2[i]); \
        smallBitSetOnes.set(i); \
    }

template<typename WordType>
void testBitSetSize()
{
    DECLARE_BITMAPS_FOR_TEST();

    auto verifySize = [=] (auto& bitSet, size_t expectedSize, size_t notExpectedSize) {
        EXPECT_EQ(bitSet.size(), expectedSize);
        EXPECT_NE(bitSet.size(), notExpectedSize);
    };

    verifySize(bitSetZeroes, size, smallSize);
    verifySize(bitSet1, size, smallSize);
    verifySize(bitSet2, size, smallSize);
    verifySize(bitSet2Clone, size, smallSize);
    verifySize(bitSetOnes, size, smallSize);
    verifySize(smallBitSetZeroes, smallSize, size);
    verifySize(smallBitSetOnes, smallSize, size);
}

template<typename WordType>
void testBitSetConstructedEmpty()
{
    DECLARE_BITMAPS_FOR_TEST();

    // Verify that the default constructor initializes all bits to 0.
    auto verifyIsEmpty = [=] (const auto& bitSet) {
        EXPECT_TRUE(bitSet.isEmpty());
        EXPECT_EQ(bitSet.count(), zeroSize);
        for (size_t i = 0; i < bitSet.size(); ++i)
            EXPECT_FALSE(bitSet.get(i));
    };

    verifyIsEmpty(bitSetZeroes);
    verifyIsEmpty(bitSet1);
    verifyIsEmpty(bitSet2);
    verifyIsEmpty(bitSet2Clone);
    verifyIsEmpty(bitSetOnes);
    verifyIsEmpty(smallBitSetZeroes);
    verifyIsEmpty(smallBitSetOnes);
}

template<typename WordType>
void testBitSetSetGet()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    auto verifyIsEmpty = [=] (const auto& bitSet) {
        EXPECT_TRUE(bitSet.isEmpty());
        EXPECT_EQ(bitSet.count(), zeroSize);
        for (size_t i = 0; i < bitSet.size(); ++i)
            EXPECT_FALSE(bitSet.get(i));
    };

    for (size_t i = 0; i < size; ++i)
        EXPECT_EQ(bitSet1.get(i), expectedBits1[i]);

    for (size_t i = 0; i < size; ++i) {
        EXPECT_EQ(bitSet2.get(i), expectedBits2[i]);
        EXPECT_EQ(bitSet2Clone.get(i), expectedBits2[i]);
    }
    for (size_t i = 0; i < size; ++i)
        EXPECT_EQ(bitSet2.get(i), bitSet2Clone.get(i));

    for (size_t i = 0; i < size; ++i)
        EXPECT_TRUE(bitSetOnes.get(i));

    for (size_t i = 0; i < smallSize; ++i)
        EXPECT_TRUE(smallBitSetOnes.get(i));

    // Verify that there is no out of bounds write from the above set operations.
    verifyIsEmpty(bitSetZeroes);
    verifyIsEmpty(smallBitSetZeroes);
}

template<typename WordType>
void testBitSetTestAndSet()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    ASSERT_FALSE(bitSet1.isFull());
    for (size_t i = 0; i < size; ++i)
        ASSERT_EQ(bitSet1.get(i), expectedBits1[i]);
    for (size_t i = 0; i < size; ++i)
        ASSERT_EQ(bitSet1.testAndSet(i), expectedBits1[i]);
    ASSERT_TRUE(bitSet1.isFull());

    ASSERT_FALSE(smallBitSetZeroes.isFull());
    ASSERT_TRUE(smallBitSetZeroes.isEmpty());
    for (size_t i = 0; i < smallSize; ++i)
        ASSERT_FALSE(smallBitSetZeroes.testAndSet(i));
    ASSERT_TRUE(smallBitSetZeroes.isFull());
}

template<typename WordType>
void testBitSetTestAndClear()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    ASSERT_FALSE(bitSet1.isEmpty());
    for (size_t i = 0; i < size; ++i)
        ASSERT_EQ(bitSet1.get(i), expectedBits1[i]);
    for (size_t i = 0; i < size; ++i)
        ASSERT_EQ(bitSet1.testAndClear(i), expectedBits1[i]);
    ASSERT_TRUE(bitSet1.isEmpty());

    ASSERT_FALSE(smallBitSetOnes.isEmpty());
    ASSERT_TRUE(smallBitSetOnes.isFull());
    for (size_t i = 0; i < smallSize; ++i)
        ASSERT_TRUE(smallBitSetOnes.testAndClear(i));
    ASSERT_TRUE(smallBitSetOnes.isEmpty());
}

template<typename WordType>
void testBitSetConcurrentTestAndSet()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    // FIXME: the following does not test the concurrent part. It only ensures that
    // the TestAndSet part of the operation is working.
    ASSERT_FALSE(bitSet1.isFull());
    for (size_t i = 0; i < size; ++i)
        ASSERT_EQ(bitSet1.get(i), expectedBits1[i]);
    for (size_t i = 0; i < size; ++i)
        ASSERT_EQ(bitSet1.concurrentTestAndSet(i), expectedBits1[i]);
    ASSERT_TRUE(bitSet1.isFull());

    ASSERT_FALSE(smallBitSetZeroes.isFull());
    ASSERT_TRUE(smallBitSetZeroes.isEmpty());
    for (size_t i = 0; i < smallSize; ++i)
        ASSERT_FALSE(smallBitSetZeroes.concurrentTestAndSet(i));
    ASSERT_TRUE(smallBitSetZeroes.isFull());
}

template<typename WordType>
void testBitSetConcurrentTestAndClear()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    // FIXME: the following does not test the concurrent part. It only ensures that
    // the TestAndClear part of the operation is working.
    ASSERT_FALSE(bitSet1.isEmpty());
    for (size_t i = 0; i < size; ++i)
        ASSERT_EQ(bitSet1.get(i), expectedBits1[i]);
    for (size_t i = 0; i < size; ++i)
        ASSERT_EQ(bitSet1.concurrentTestAndClear(i), expectedBits1[i]);
    ASSERT_TRUE(bitSet1.isEmpty());

    ASSERT_FALSE(smallBitSetOnes.isEmpty());
    ASSERT_TRUE(smallBitSetOnes.isFull());
    for (size_t i = 0; i < smallSize; ++i)
        ASSERT_TRUE(smallBitSetOnes.concurrentTestAndClear(i));
    ASSERT_TRUE(smallBitSetOnes.isEmpty());
}

template<typename WordType>
void testBitSetClear()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    ASSERT_TRUE(bitSetOnes.isFull());
    for (size_t i = 0; i < size; ++i) {
        if (!expectedBits1[i])
            bitSetOnes.clear(i);
    }
    ASSERT_EQ(bitSetOnes, bitSet1);
}

template<typename WordType>
void testBitSetClearAll()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    auto verifyIsEmpty = [=] (const auto& bitSet) {
        EXPECT_TRUE(bitSet.isEmpty());
        EXPECT_EQ(bitSet.count(), zeroSize);
        for (size_t i = 0; i < bitSet.size(); ++i)
            EXPECT_FALSE(bitSet.get(i));
    };

    auto verifyIsFull = [=] (const auto& bitSet) {
        EXPECT_TRUE(bitSet.isFull());
        for (size_t i = 0; i < bitSet.size(); ++i)
            EXPECT_TRUE(bitSet.get(i));
    };

    EXPECT_FALSE(bitSet1.isEmpty());
    bitSet1.clearAll();
    verifyIsEmpty(bitSet1);
    verifyIsFull(bitSetOnes);
    verifyIsFull(smallBitSetOnes);

    EXPECT_FALSE(bitSet2.isEmpty());
    bitSet2.clearAll();
    verifyIsEmpty(bitSet1);
    verifyIsEmpty(bitSet2);
    verifyIsFull(bitSetOnes);
    verifyIsFull(smallBitSetOnes);

    EXPECT_FALSE(bitSet2Clone.isEmpty());
    bitSet2Clone.clearAll();
    verifyIsEmpty(bitSet1);
    verifyIsEmpty(bitSet2);
    verifyIsEmpty(bitSet2Clone);
    verifyIsFull(bitSetOnes);
    verifyIsFull(smallBitSetOnes);
}

template<typename WordType>
void testBitSetInvert()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    auto verifyInvert = [=] (auto& bitSet) {
        ASSERT_TRUE(bitSet.isFull());
        ASSERT_FALSE(bitSet.isEmpty());
        bitSet.invert();
        ASSERT_FALSE(bitSet.isFull());
        ASSERT_TRUE(bitSet.isEmpty());
        bitSet.invert();
        ASSERT_TRUE(bitSet.isFull());
        ASSERT_FALSE(bitSet.isEmpty());
    };

    verifyInvert(bitSetOnes);
    verifyInvert(smallBitSetOnes);

    for (size_t i = 0; i < size; ++i)
        ASSERT_EQ(bitSet1.get(i), expectedBits1[i]);
    bitSet1.invert();
    for (size_t i = 0; i < size; ++i)
        ASSERT_EQ(bitSet1.get(i), !expectedBits1[i]);
    bitSet1.invert();
    for (size_t i = 0; i < size; ++i)
        ASSERT_EQ(bitSet1.get(i), expectedBits1[i]);
}

template<typename WordType>
void testBitSetFindRunOfZeros()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    const int64_t bitSet1RunsOfZeros[15] = {
        0, 0, 0, 3, 3,
        3, 3, 3, 3, 3,
        3, 3, 3, -1, -1
    };

    const int64_t bitSet2RunsOfZeros[15] = {
        0, 0, 4, 4, 4,
        4, 4, 4, -1, -1,
        -1, -1, -1, -1, -1,
    };

    WTF::BitSet<smallSize, WordType> smallTemp;
    smallTemp.set(1, true); // bits low to high are: 0100 0000 0

    const int64_t smallTempRunsOfZeros[15] = {
        0, 0, 2, 2, 2,
        2, 2, 2, -1, -1,
        -1, -1, -1, -1, -1
    };

    for (size_t runLength = 0; runLength < 15; ++runLength) {
        ASSERT_EQ(bitSetZeroes.findRunOfZeros(runLength), 0ll);
        ASSERT_EQ(bitSet1.findRunOfZeros(runLength), bitSet1RunsOfZeros[runLength]);
        ASSERT_EQ(bitSet2.findRunOfZeros(runLength), bitSet2RunsOfZeros[runLength]);
        ASSERT_EQ(bitSetOnes.findRunOfZeros(runLength), -1ll);

        if (runLength <= smallSize)
            ASSERT_EQ(smallBitSetZeroes.findRunOfZeros(runLength), 0ll);
        else
            ASSERT_EQ(smallBitSetZeroes.findRunOfZeros(runLength), -1ll);

        ASSERT_EQ(smallBitSetOnes.findRunOfZeros(runLength), -1ll);

        ASSERT_EQ(smallTemp.findRunOfZeros(runLength), smallTempRunsOfZeros[runLength]);
    }
}

template<typename WordType>
void testBitSetCount()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    EXPECT_EQ(bitSetZeroes.count(), zeroSize);
    EXPECT_EQ(bitSet1.count(), expectedNumberOfSetBits1);
    EXPECT_EQ(bitSet2.count(), expectedNumberOfSetBits2);
    EXPECT_EQ(bitSet2Clone.count(), expectedNumberOfSetBits2);
    EXPECT_EQ(bitSetOnes.count(), size);
    EXPECT_EQ(smallBitSetZeroes.count(), zeroSize);
    EXPECT_EQ(smallBitSetOnes.count(), smallSize);
}

template<typename WordType>
void testBitSetCountAfterSetAll()
{
    WTF::BitSet<9, WordType> smallBitSet;
    smallBitSet.setAll();
    EXPECT_EQ(smallBitSet.count(), 9ull);

    WTF::BitSet<32, WordType> completeBitSet;
    completeBitSet.setAll();
    EXPECT_EQ(completeBitSet.count(), 32ull);

    WTF::BitSet<1008, WordType> largeBitSet;
    largeBitSet.setAll();
    EXPECT_EQ(largeBitSet.count(), 1008ull);
}

template<typename WordType>
void testBitSetIsEmpty()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    EXPECT_TRUE(bitSetZeroes.isEmpty());
    EXPECT_FALSE(bitSet1.isEmpty());
    EXPECT_FALSE(bitSet2.isEmpty());
    EXPECT_FALSE(bitSet2Clone.isEmpty());
    EXPECT_FALSE(bitSetOnes.isEmpty());
    EXPECT_TRUE(smallBitSetZeroes.isEmpty());
    EXPECT_FALSE(smallBitSetOnes.isEmpty());

    auto verifyIsEmpty = [=] (const auto& bitSet) {
        EXPECT_TRUE(bitSet.isEmpty());
        EXPECT_EQ(bitSet.count(), zeroSize);
        for (size_t i = 0; i < bitSet.size(); ++i)
            EXPECT_FALSE(bitSet.get(i));
    };

    verifyIsEmpty(bitSetZeroes);
    verifyIsEmpty(smallBitSetZeroes);
}

template<typename WordType>
void testBitSetIsFull()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    EXPECT_FALSE(bitSetZeroes.isFull());
    EXPECT_FALSE(bitSet1.isFull());
    EXPECT_FALSE(bitSet2.isFull());
    EXPECT_FALSE(bitSet2Clone.isFull());
    EXPECT_TRUE(bitSetOnes.isFull());
    EXPECT_FALSE(smallBitSetZeroes.isFull());
    EXPECT_TRUE(smallBitSetOnes.isFull());

    auto verifyIsFull = [=] (auto& bitSet) {
        EXPECT_TRUE(bitSet.isFull());
        for (size_t i = 0; i < bitSet.size(); ++i)
            EXPECT_TRUE(bitSet.get(i));
    };

    verifyIsFull(bitSetOnes);
    verifyIsFull(smallBitSetOnes);
}

template<typename WordType>
void testBitSetMerge()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    ASSERT_TRUE(bitSetZeroes.isEmpty());
    ASSERT_EQ(bitSet2, bitSet2Clone);
    bitSet2.merge(bitSetZeroes);
    ASSERT_EQ(bitSet2, bitSet2Clone);

    ASSERT_NE(bitSet1, bitSet2);
    ASSERT_NE(bitSet1, bitSet2Clone);
    ASSERT_EQ(bitSet2, bitSet2Clone);
    bitSet2Clone.merge(bitSet1);
    ASSERT_NE(bitSet2, bitSet2Clone);
    for (size_t i = 0; i < size; ++i) {
        bool expectedBit = expectedBits2[i] | expectedBits1[i];
        ASSERT_EQ(bitSet2Clone.get(i), expectedBit);
    }

    ASSERT_TRUE(bitSetOnes.isFull());
    ASSERT_TRUE(bitSetZeroes.isEmpty());
    bitSetOnes.merge(bitSetZeroes);
    ASSERT_TRUE(bitSetOnes.isFull());
    ASSERT_TRUE(bitSetZeroes.isEmpty());

    bitSetZeroes.merge(bitSet1);
    ASSERT_EQ(bitSetZeroes, bitSet1);

    bitSet1.merge(bitSetOnes);
    ASSERT_EQ(bitSet1, bitSetOnes);

    ASSERT_TRUE(smallBitSetZeroes.isEmpty());
    ASSERT_TRUE(smallBitSetOnes.isFull());
    smallBitSetZeroes.merge(smallBitSetOnes);
    ASSERT_FALSE(smallBitSetZeroes.isEmpty());
    ASSERT_TRUE(smallBitSetZeroes.isFull());
    ASSERT_TRUE(smallBitSetOnes.isFull());

    smallBitSetZeroes.clearAll();
    ASSERT_TRUE(smallBitSetZeroes.isEmpty());
    ASSERT_TRUE(smallBitSetOnes.isFull());
    smallBitSetOnes.merge(smallBitSetZeroes);
    ASSERT_TRUE(smallBitSetOnes.isFull());
    ASSERT_TRUE(smallBitSetZeroes.isEmpty());
}

template<typename WordType>
void testBitSetFilter()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    ASSERT_TRUE(bitSetOnes.isFull());
    ASSERT_EQ(bitSet2, bitSet2Clone);
    bitSet2.filter(bitSetOnes);
    ASSERT_EQ(bitSet2, bitSet2Clone);

    ASSERT_NE(bitSet1, bitSet2);
    ASSERT_NE(bitSet1, bitSet2Clone);
    ASSERT_EQ(bitSet2, bitSet2Clone);
    bitSet2Clone.filter(bitSet1);
    ASSERT_NE(bitSet2, bitSet2Clone);
    for (size_t i = 0; i < size; ++i) {
        bool expectedBit = expectedBits2[i] & expectedBits1[i];
        ASSERT_EQ(bitSet2Clone.get(i), expectedBit);
    }

    ASSERT_TRUE(bitSetZeroes.isEmpty());
    bitSet2.filter(bitSetZeroes);
    ASSERT_EQ(bitSet2, bitSetZeroes);

    ASSERT_TRUE(bitSetZeroes.isEmpty());
    bitSetZeroes.filter(bitSet1);
    ASSERT_TRUE(bitSetZeroes.isEmpty());

    ASSERT_TRUE(bitSetOnes.isFull());
    bitSetOnes.filter(bitSet1);
    ASSERT_EQ(bitSetOnes, bitSet1);

    ASSERT_TRUE(smallBitSetZeroes.isEmpty());
    ASSERT_TRUE(smallBitSetOnes.isFull());
    smallBitSetZeroes.filter(smallBitSetOnes);
    ASSERT_TRUE(smallBitSetZeroes.isEmpty());
    ASSERT_FALSE(smallBitSetZeroes.isFull());
    ASSERT_TRUE(smallBitSetOnes.isFull());

    smallBitSetOnes.filter(smallBitSetZeroes);
    ASSERT_FALSE(smallBitSetOnes.isFull());
    ASSERT_TRUE(smallBitSetOnes.isEmpty());
    ASSERT_TRUE(smallBitSetZeroes.isEmpty());
}

template<typename WordType>
void testBitSetExclude()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    ASSERT_TRUE(bitSetZeroes.isEmpty());
    ASSERT_EQ(bitSet2, bitSet2Clone);
    bitSet2.exclude(bitSetZeroes);
    ASSERT_EQ(bitSet2, bitSet2Clone);

    ASSERT_NE(bitSet1, bitSet2);
    ASSERT_NE(bitSet1, bitSet2Clone);
    ASSERT_EQ(bitSet2, bitSet2Clone);
    bitSet2Clone.exclude(bitSet1);
    ASSERT_NE(bitSet2, bitSet2Clone);
    for (size_t i = 0; i < size; ++i) {
        bool expectedBit = expectedBits2[i] & !expectedBits1[i];
        ASSERT_EQ(bitSet2Clone.get(i), expectedBit);
    }

    ASSERT_TRUE(bitSetZeroes.isEmpty());
    ASSERT_TRUE(bitSetOnes.isFull());
    bitSet2.exclude(bitSetOnes);
    ASSERT_EQ(bitSet2, bitSetZeroes);

    ASSERT_TRUE(bitSetOnes.isFull());
    bitSetOnes.exclude(bitSet1);
    bitSet1.invert();
    ASSERT_EQ(bitSetOnes, bitSet1);

    ASSERT_TRUE(smallBitSetZeroes.isEmpty());
    ASSERT_TRUE(smallBitSetOnes.isFull());
    smallBitSetZeroes.exclude(smallBitSetOnes);
    ASSERT_TRUE(smallBitSetZeroes.isEmpty());
    ASSERT_FALSE(smallBitSetZeroes.isFull());
    ASSERT_TRUE(smallBitSetOnes.isFull());

    smallBitSetOnes.exclude(smallBitSetZeroes);
    ASSERT_TRUE(smallBitSetOnes.isFull());
    ASSERT_TRUE(smallBitSetZeroes.isEmpty());

    smallBitSetOnes.exclude(smallBitSetOnes);
    ASSERT_FALSE(smallBitSetOnes.isFull());
    ASSERT_TRUE(smallBitSetOnes.isEmpty());
}

template<typename WordType>
void testBitSetConcurrentFilter()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    // FIXME: the following does not test the concurrent part. It only ensures that
    // the Filter part of the operation is working.
    ASSERT_TRUE(bitSetOnes.isFull());
    ASSERT_EQ(bitSet2, bitSet2Clone);
    bitSet2.concurrentFilter(bitSetOnes);
    ASSERT_EQ(bitSet2, bitSet2Clone);

    ASSERT_NE(bitSet1, bitSet2);
    ASSERT_NE(bitSet1, bitSet2Clone);
    ASSERT_EQ(bitSet2, bitSet2Clone);
    bitSet2Clone.concurrentFilter(bitSet1);
    ASSERT_NE(bitSet2, bitSet2Clone);
    for (size_t i = 0; i < size; ++i) {
        bool expectedBit = expectedBits2[i] & expectedBits1[i];
        ASSERT_EQ(bitSet2Clone.get(i), expectedBit);
    }

    ASSERT_TRUE(bitSetZeroes.isEmpty());
    bitSet2.concurrentFilter(bitSetZeroes);
    ASSERT_EQ(bitSet2, bitSetZeroes);

    ASSERT_TRUE(bitSetZeroes.isEmpty());
    bitSetZeroes.concurrentFilter(bitSet1);
    ASSERT_TRUE(bitSetZeroes.isEmpty());

    ASSERT_TRUE(bitSetOnes.isFull());
    bitSetOnes.concurrentFilter(bitSet1);
    ASSERT_EQ(bitSetOnes, bitSet1);

    ASSERT_TRUE(smallBitSetZeroes.isEmpty());
    ASSERT_TRUE(smallBitSetOnes.isFull());
    smallBitSetZeroes.concurrentFilter(smallBitSetOnes);
    ASSERT_TRUE(smallBitSetZeroes.isEmpty());
    ASSERT_FALSE(smallBitSetZeroes.isFull());
    ASSERT_TRUE(smallBitSetOnes.isFull());

    smallBitSetOnes.concurrentFilter(smallBitSetZeroes);
    ASSERT_FALSE(smallBitSetOnes.isFull());
    ASSERT_TRUE(smallBitSetOnes.isEmpty());
    ASSERT_TRUE(smallBitSetZeroes.isEmpty());
}

template<typename WordType>
void testBitSetSubsumes()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    ASSERT_TRUE(bitSetZeroes.isEmpty());
    ASSERT_TRUE(bitSetOnes.isFull());
    ASSERT_EQ(bitSet2, bitSet2Clone);

    ASSERT_TRUE(bitSetZeroes.subsumes(bitSetZeroes));
    ASSERT_FALSE(bitSetZeroes.subsumes(bitSet1));
    ASSERT_FALSE(bitSetZeroes.subsumes(bitSet2));
    ASSERT_FALSE(bitSetZeroes.subsumes(bitSet2Clone));
    ASSERT_FALSE(bitSetZeroes.subsumes(bitSetOnes));

    ASSERT_TRUE(bitSet1.subsumes(bitSetZeroes));
    ASSERT_TRUE(bitSet1.subsumes(bitSet1));
    ASSERT_FALSE(bitSet1.subsumes(bitSet2));
    ASSERT_FALSE(bitSet1.subsumes(bitSet2Clone));
    ASSERT_FALSE(bitSet1.subsumes(bitSetOnes));

    ASSERT_TRUE(bitSet2.subsumes(bitSetZeroes));
    ASSERT_FALSE(bitSet2.subsumes(bitSet1));
    ASSERT_TRUE(bitSet2.subsumes(bitSet2));
    ASSERT_TRUE(bitSet2.subsumes(bitSet2Clone));
    ASSERT_FALSE(bitSet2.subsumes(bitSetOnes));

    ASSERT_TRUE(bitSet2Clone.subsumes(bitSetZeroes));
    ASSERT_FALSE(bitSet2Clone.subsumes(bitSet1));
    ASSERT_TRUE(bitSet2Clone.subsumes(bitSet2));
    ASSERT_TRUE(bitSet2Clone.subsumes(bitSet2Clone));
    ASSERT_FALSE(bitSet2Clone.subsumes(bitSetOnes));

    ASSERT_TRUE(bitSetOnes.subsumes(bitSetZeroes));
    ASSERT_TRUE(bitSetOnes.subsumes(bitSet1));
    ASSERT_TRUE(bitSetOnes.subsumes(bitSet2));
    ASSERT_TRUE(bitSetOnes.subsumes(bitSet2Clone));
    ASSERT_TRUE(bitSetOnes.subsumes(bitSetOnes));

    ASSERT_TRUE(smallBitSetOnes.subsumes(smallBitSetOnes));
    ASSERT_TRUE(smallBitSetOnes.subsumes(smallBitSetZeroes));

    ASSERT_FALSE(smallBitSetZeroes.subsumes(smallBitSetOnes));
    ASSERT_TRUE(smallBitSetZeroes.subsumes(smallBitSetZeroes));
}

template<typename WordType>
void testBitSetForEachSetBit()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    size_t count = 0;
    ASSERT_TRUE(bitSetZeroes.isEmpty());
    bitSetZeroes.forEachSetBit([&] (size_t i) {
        constexpr bool notReached = false;
        ASSERT_TRUE(notReached);
        count++;
    });
    ASSERT_EQ(count, zeroSize);

    count = 0;
    bitSet1.forEachSetBit([&] (size_t i) {
        ASSERT_TRUE(bitSet1.get(i));
        ASSERT_EQ(bitSet1.get(i), expectedBits1[i]);
        count++;
    });
    ASSERT_EQ(count, expectedNumberOfSetBits1);

    count = 0;
    ASSERT_TRUE(bitSetOnes.isFull());
    bitSetOnes.forEachSetBit([&] (size_t i) {
        ASSERT_TRUE(bitSetOnes.get(i));
        count++;
    });
    ASSERT_EQ(count, size);

    count = 0;
    ASSERT_TRUE(smallBitSetZeroes.isEmpty());
    smallBitSetZeroes.forEachSetBit([&] (size_t i) {
        constexpr bool notReached = false;
        ASSERT_TRUE(notReached);
        count++;
    });
    ASSERT_EQ(count, zeroSize);

    count = 0;
    ASSERT_TRUE(smallBitSetOnes.isFull());
    smallBitSetOnes.forEachSetBit([&] (size_t i) {
        ASSERT_TRUE(smallBitSetOnes.get(i));
        count++;
    });
    ASSERT_EQ(count, smallSize);
}

template<typename WordType>
void testBitSetForEachSetBitWithStartIndex()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    size_t count = 0;
    ASSERT_TRUE(bitSetZeroes.isEmpty());
    bitSetZeroes.forEachSetBit(0, [&](size_t i) {
        constexpr bool notReached = false;
        ASSERT_TRUE(notReached);
        count++;
    });
    ASSERT_EQ(count, zeroSize);

    bitSetZeroes.forEachSetBit(10, [&](size_t i) {
        constexpr bool notReached = false;
        ASSERT_TRUE(notReached);
        count++;
    });
    ASSERT_EQ(count, zeroSize);

    count = 0;
    bitSet1.forEachSetBit(0, [&](size_t i) {
        ASSERT_TRUE(bitSet1.get(i));
        ASSERT_EQ(bitSet1.get(i), expectedBits1[i]);
        count++;
    });
    ASSERT_EQ(count, expectedNumberOfSetBits1);

    count = 0;
    bitSet1.forEachSetBit(2, [&](size_t i) {
        ASSERT_TRUE(bitSet1.get(i));
        ASSERT_EQ(bitSet1.get(i), expectedBits1[i]);
        count++;
    });
    ASSERT_EQ(count, expectedNumberOfSetBits1);

    count = 0;
    bitSet1.forEachSetBit(3, [&](size_t i) {
        ASSERT_TRUE(bitSet1.get(i));
        ASSERT_EQ(bitSet1.get(i), expectedBits1[i]);
        count++;
    });
    ASSERT_EQ(count, expectedNumberOfSetBits1 - 1);

    count = 0;
    bitSet1.forEachSetBit(16, [&](size_t i) {
        ASSERT_TRUE(bitSet1.get(i));
        ASSERT_EQ(bitSet1.get(i), expectedBits1[i]);
        count++;
    });
    ASSERT_EQ(count, expectedNumberOfSetBits1 - 2);

    count = 0;
    bitSet1.forEachSetBit(125, [&](size_t i) {
        ASSERT_TRUE(bitSet1.get(i));
        ASSERT_EQ(bitSet1.get(i), expectedBits1[i]);
        count++;
    });
    ASSERT_EQ(count, 3U);
}

template<typename WordType>
void testBitSetFindBit()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    auto findExpectedBit = [=] (auto expectedBits, size_t startIndex, bool value) -> size_t {
        for (auto index = startIndex; index < size; ++index) {
            if (expectedBits[index] == value)
                return index;
        }
        return startIndex;
    };

    for (size_t i = 1, lastIndex = 1; i < size; lastIndex = i, i += lastIndex) {
        ASSERT_EQ(bitSet1.findBit(i, true), findExpectedBit(expectedBits1, i, true));
        ASSERT_EQ(bitSet1.findBit(i, false), findExpectedBit(expectedBits1, i, false));
        ASSERT_EQ(bitSet2.findBit(i, true), findExpectedBit(expectedBits2, i, true));
        ASSERT_EQ(bitSet2.findBit(i, false), findExpectedBit(expectedBits2, i, false));

        ASSERT_EQ(bitSet2.findBit(i, true), bitSet2Clone.findBit(i, true));
        ASSERT_EQ(bitSet2.findBit(i, false), bitSet2Clone.findBit(i, false));
    }

    ASSERT_EQ(bitSetZeroes.findBit(0, false), zeroSize);
    ASSERT_EQ(bitSetZeroes.findBit(10, false), static_cast<size_t>(10));
    ASSERT_EQ(bitSetZeroes.findBit(size - 1, false), size-1);
    ASSERT_EQ(bitSetZeroes.findBit(size, false), size);
    ASSERT_EQ(bitSetZeroes.findBit(size + 1, false), size);

    ASSERT_EQ(bitSetZeroes.findBit(0, true), size);
    ASSERT_EQ(bitSetZeroes.findBit(10, true), size);
    ASSERT_EQ(bitSetZeroes.findBit(size - 1, true), size);
    ASSERT_EQ(bitSetZeroes.findBit(size, true), size);
    ASSERT_EQ(bitSetZeroes.findBit(size + 1, true), size);

    ASSERT_EQ(bitSetOnes.findBit(0, false), size);
    ASSERT_EQ(bitSetOnes.findBit(10, false), size);
    ASSERT_EQ(bitSetOnes.findBit(size - 1, false), size);
    ASSERT_EQ(bitSetOnes.findBit(size, false), size);
    ASSERT_EQ(bitSetOnes.findBit(size + 1, false), size);

    ASSERT_EQ(bitSetOnes.findBit(0, true), zeroSize);
    ASSERT_EQ(bitSetOnes.findBit(10, true), static_cast<size_t>(10));
    ASSERT_EQ(bitSetOnes.findBit(size - 1, true), size-1);
    ASSERT_EQ(bitSetOnes.findBit(size, true), size);
    ASSERT_EQ(bitSetOnes.findBit(size + 1, true), size);
}

template<typename WordType>
void testBitSetIteration()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    auto computeSetBitsCount = [=] (auto& bitSet) -> size_t {
        size_t count = 0;
        for (auto bitIndex : bitSet) {
            UNUSED_PARAM(bitIndex);
            count++;
        }
        return count;
    };

    EXPECT_EQ(computeSetBitsCount(bitSetZeroes), zeroSize);
    EXPECT_EQ(computeSetBitsCount(bitSet1), expectedNumberOfSetBits1);
    EXPECT_EQ(computeSetBitsCount(bitSet2), expectedNumberOfSetBits2);
    EXPECT_EQ(computeSetBitsCount(bitSet2Clone), expectedNumberOfSetBits2);
    EXPECT_EQ(computeSetBitsCount(bitSetOnes), size);
    EXPECT_EQ(computeSetBitsCount(smallBitSetZeroes), zeroSize);
    EXPECT_EQ(computeSetBitsCount(smallBitSetOnes), smallSize);

    auto verifySetBits = [=] (auto& bitSet, auto& expectedBits) {
        for (auto bitIndex : bitSet) {
            EXPECT_TRUE(bitSet.get(bitIndex));
            EXPECT_EQ(bitSet.get(bitIndex), expectedBits[bitIndex]);
        }
    };

    verifySetBits(bitSet1, expectedBits1);
    verifySetBits(bitSet2, expectedBits2);
    verifySetBits(bitSet2Clone, expectedBits2);

    auto verifyBitsAllSet = [=] (auto& bitSet) {
        size_t lastBitIndex = 0;
        for (auto bitIndex : bitSet) {
            EXPECT_TRUE(bitSet.get(bitIndex));
            if (bitIndex)
                EXPECT_EQ(bitIndex, lastBitIndex + 1);
            lastBitIndex = bitIndex;
        }
    };

    verifyBitsAllSet(bitSetOnes);
    verifyBitsAllSet(smallBitSetOnes);
}

template<typename WordType>
void testBitSetMergeAndClear()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    WTF::BitSet<size, WordType> temp;
    WTF::BitSet<size, WordType> savedBitSet1;

    ASSERT_FALSE(bitSet2.isEmpty());

    savedBitSet1.merge(bitSet1);
    ASSERT_EQ(savedBitSet1, bitSet1);

    ASSERT_NE(bitSet1, bitSet2);
    ASSERT_NE(bitSet1, bitSet2Clone);
    ASSERT_EQ(bitSet2Clone, bitSet2);
    bitSet1.mergeAndClear(bitSet2Clone);
    ASSERT_NE(bitSet1, bitSet2);
    ASSERT_NE(bitSet1, savedBitSet1);
    ASSERT_TRUE(bitSet2Clone.isEmpty());
    for (size_t i = 0; i < size; ++i) {
        bool expectedBit = expectedBits1[i] | expectedBits2[i];
        ASSERT_EQ(bitSet1.get(i), expectedBit);
    }

    bitSet2Clone.merge(bitSet2); // restore bitSet2Clone
    ASSERT_EQ(bitSet2Clone, bitSet2);

    ASSERT_TRUE(temp.isEmpty());
    temp.mergeAndClear(bitSet2Clone);
    ASSERT_FALSE(temp.isEmpty());
    ASSERT_EQ(temp, bitSet2);
    ASSERT_TRUE(bitSet2Clone.isEmpty());

    WTF::BitSet<size, WordType> savedBitSetOnes;
    savedBitSetOnes.merge(bitSetOnes);

    temp.clearAll();
    ASSERT_TRUE(temp.isEmpty());
    ASSERT_FALSE(temp.isFull());
    ASSERT_FALSE(bitSetOnes.isEmpty());
    ASSERT_TRUE(bitSetOnes.isFull());
    temp.mergeAndClear(bitSetOnes);
    ASSERT_FALSE(temp.isEmpty());
    ASSERT_TRUE(temp.isFull());
    ASSERT_TRUE(bitSetOnes.isEmpty());
    ASSERT_FALSE(bitSetOnes.isFull());

    bitSet2Clone.merge(bitSet2); // restore bitSet2Clone
    ASSERT_EQ(bitSet2Clone, bitSet2);
    bitSetOnes.merge(savedBitSetOnes); // restore bitSetOnes
    ASSERT_TRUE(bitSetOnes.isFull());

    ASSERT_TRUE(temp.isFull());
    temp.mergeAndClear(bitSet2Clone);
    ASSERT_TRUE(temp.isFull());
    ASSERT_EQ(temp, bitSetOnes);
    ASSERT_TRUE(bitSet2Clone.isEmpty());

    WTF::BitSet<smallSize, WordType> smallTemp;

    smallTemp.merge(smallBitSetOnes);
    ASSERT_TRUE(smallTemp.isFull());
    ASSERT_TRUE(smallBitSetZeroes.isEmpty());
    smallTemp.mergeAndClear(smallBitSetZeroes);
    ASSERT_TRUE(smallTemp.isFull());
    ASSERT_FALSE(smallTemp.isEmpty());
    ASSERT_TRUE(smallBitSetZeroes.isEmpty());

    smallTemp.clearAll();
    ASSERT_TRUE(smallBitSetOnes.isFull());
    ASSERT_TRUE(smallTemp.isEmpty());
    smallTemp.mergeAndClear(smallBitSetOnes);
    ASSERT_TRUE(smallTemp.isFull());
    ASSERT_TRUE(smallBitSetOnes.isEmpty());
}

template<typename WordType>
void testBitSetSetAndClear()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    WTF::BitSet<size, WordType> temp;
    WTF::BitSet<size, WordType> savedBitSet1;

    ASSERT_FALSE(bitSet2.isEmpty());

    savedBitSet1.merge(bitSet1);
    ASSERT_EQ(savedBitSet1, bitSet1);

    ASSERT_NE(bitSet1, bitSet2);
    ASSERT_NE(bitSet1, bitSet2Clone);
    ASSERT_EQ(bitSet2Clone, bitSet2);
    bitSet1.setAndClear(bitSet2Clone);
    ASSERT_EQ(bitSet1, bitSet2);
    ASSERT_NE(bitSet1, savedBitSet1);
    ASSERT_TRUE(bitSet2Clone.isEmpty());

    bitSet2Clone.merge(bitSet2); // restore bitSet2Clone
    ASSERT_EQ(bitSet2Clone, bitSet2);

    ASSERT_TRUE(temp.isEmpty());
    temp.setAndClear(bitSet2Clone);
    ASSERT_FALSE(temp.isEmpty());
    ASSERT_EQ(temp, bitSet2);
    ASSERT_TRUE(bitSet2Clone.isEmpty());

    temp.clearAll();
    ASSERT_TRUE(temp.isEmpty());
    ASSERT_FALSE(temp.isFull());
    ASSERT_FALSE(bitSetOnes.isEmpty());
    ASSERT_TRUE(bitSetOnes.isFull());
    temp.setAndClear(bitSetOnes);
    ASSERT_FALSE(temp.isEmpty());
    ASSERT_TRUE(temp.isFull());
    ASSERT_TRUE(bitSetOnes.isEmpty());
    ASSERT_FALSE(bitSetOnes.isFull());

    bitSet2Clone.merge(bitSet2); // restore bitSet2Clone
    ASSERT_EQ(bitSet2Clone, bitSet2);

    ASSERT_TRUE(temp.isFull());
    temp.setAndClear(bitSet2Clone);
    ASSERT_FALSE(temp.isFull());
    ASSERT_EQ(temp, bitSet2);
    ASSERT_TRUE(bitSet2Clone.isEmpty());

    WTF::BitSet<smallSize, WordType> smallTemp;

    smallTemp.merge(smallBitSetOnes);
    ASSERT_TRUE(smallTemp.isFull());
    ASSERT_TRUE(smallBitSetZeroes.isEmpty());
    smallTemp.setAndClear(smallBitSetZeroes);
    ASSERT_TRUE(smallTemp.isEmpty());
    ASSERT_TRUE(smallBitSetZeroes.isEmpty());

    ASSERT_TRUE(smallBitSetOnes.isFull());
    ASSERT_TRUE(smallTemp.isEmpty());
    smallTemp.setAndClear(smallBitSetOnes);
    ASSERT_TRUE(smallTemp.isFull());
    ASSERT_TRUE(smallBitSetOnes.isEmpty());
}

template<typename BitSet>
void testBitSetSetEachNthBitImpl(size_t size, size_t wordSize, const BitSet& zeroes, const BitSet& ones)
{
    BitSet temp;

    EXPECT_TRUE(temp == zeroes);
    temp.setEachNthBit(1);
    EXPECT_TRUE(temp == ones);

    size_t nValues[] = { 1, 2, wordSize / 2, wordSize - 1, wordSize, size / 2, size - 1, size };
    size_t nValuesCount = sizeof(nValues) / sizeof(nValues[0]);

    size_t startEndValues[] = { 0, 1, 2, wordSize / 2, wordSize - 1, wordSize, size / 2, size - 1, size };
    constexpr size_t numberOfStartEndValues = sizeof(startEndValues) / sizeof(startEndValues[0]);

    for (size_t start = 0; start < numberOfStartEndValues; ++start) {
        for (size_t end = start; end < numberOfStartEndValues; ++end) {
            size_t startIndex = startEndValues[start];
            size_t endIndex = startEndValues[end];
            if (endIndex < startIndex)
                continue;
            if (startIndex > size)
                continue;
            if (endIndex > size)
                continue;

            for (size_t j = 0; j < nValuesCount; ++j) {
                size_t n = nValues[j];
                temp.clearAll();
                temp.setEachNthBit(n, startIndex, endIndex);

                for (size_t i = 0; i < startIndex; ++i)
                    EXPECT_FALSE(temp.get(i));

                size_t count = 0;
                for (size_t i = startIndex; i < endIndex; ++i) {
                    bool expected = !count;
                    EXPECT_TRUE(temp.get(i) == expected);
                    count++;
                    count = count % n;
                }

                for (size_t i = endIndex; i < size; ++i)
                    EXPECT_FALSE(temp.get(i));
            }
        }
    }
}

template<typename WordType>
void testBitSetSetEachNthBit()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();
    constexpr size_t wordSize = sizeof(WordType) * 8;
    testBitSetSetEachNthBitImpl(size, wordSize, bitSetZeroes, bitSetOnes);
    testBitSetSetEachNthBitImpl(smallSize, wordSize, smallBitSetZeroes, smallBitSetOnes);
}

template<typename WordType>
void testBitSetOperatorEqual()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    EXPECT_TRUE(bitSetZeroes == bitSetZeroes);
    EXPECT_FALSE(bitSetZeroes == bitSet1);
    EXPECT_TRUE(bitSet1 == bitSet1);
    EXPECT_FALSE(bitSet1 == bitSet2);
    EXPECT_FALSE(bitSet1 == bitSet2Clone);
    EXPECT_TRUE(bitSet2 == bitSet2Clone);
    EXPECT_FALSE(bitSetOnes == bitSet1);
    EXPECT_FALSE(smallBitSetZeroes == smallBitSetOnes);
}

template<typename WordType>
void testBitSetOperatorNotEqual()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    EXPECT_FALSE(bitSetZeroes != bitSetZeroes);
    EXPECT_TRUE(bitSetZeroes != bitSet1);
    EXPECT_FALSE(bitSet1 != bitSet1);
    EXPECT_TRUE(bitSet1 != bitSet2);
    EXPECT_TRUE(bitSet1 != bitSet2Clone);
    EXPECT_FALSE(bitSet2 != bitSet2Clone);
    EXPECT_TRUE(bitSetOnes != bitSet1);
    EXPECT_TRUE(smallBitSetZeroes != smallBitSetOnes);
}

template<typename BitSet>
void testBitSetOperatorAssignmentImpl(const BitSet& bitSet1, const BitSet& bitSet2, const BitSet& zeroes, const BitSet& ones)
{
    BitSet temp;
    BitSet temp2;
    EXPECT_TRUE(temp.isEmpty());
    EXPECT_TRUE(temp2.isEmpty());

    EXPECT_TRUE(temp == zeroes);
    EXPECT_TRUE(temp != bitSet1);
    temp = bitSet1;
    EXPECT_TRUE(temp != zeroes);
    EXPECT_TRUE(temp == bitSet1);

    EXPECT_TRUE(temp != bitSet2);
    temp = bitSet2;
    EXPECT_TRUE(temp == bitSet2);
    EXPECT_TRUE(temp != bitSet1);

    temp.clearAll();
    temp2.clearAll();
    for (size_t i = 0; i < bitSet1.size(); ++i)
        temp.set(i, bitSet1.get(i));

    EXPECT_TRUE(temp == bitSet1);
    EXPECT_TRUE(temp2.isEmpty());
    EXPECT_TRUE(temp2 != bitSet1);
    temp2 = temp;
    EXPECT_TRUE(temp2 == bitSet1);
}

template<typename WordType>
void testBitSetOperatorAssignment()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();
    testBitSetOperatorAssignmentImpl(bitSet1, bitSet2, bitSetZeroes, bitSetOnes);
    testBitSetOperatorAssignmentImpl(smallBitSet1, smallBitSet2, smallBitSetZeroes, smallBitSetOnes);
}

template<typename BitSet>
void testBitSetOperatorBitOrAssignmentImpl(size_t size, const BitSet& bitSet1, const BitSet& bitSet2, const BitSet& zeroes, const BitSet& ones)
{
    BitSet temp;
    BitSet temp1;

    // 0 | 0
    EXPECT_TRUE(temp == zeroes);
    EXPECT_TRUE(temp != ones);
    temp |= zeroes;
    EXPECT_TRUE(temp == zeroes);
    EXPECT_TRUE(temp != ones);

    // 0 | 1
    EXPECT_TRUE(temp == zeroes);
    EXPECT_TRUE(temp != ones);
    temp |= ones;
    EXPECT_TRUE(temp != zeroes);
    EXPECT_TRUE(temp == ones);

    // 1 | 0
    EXPECT_TRUE(temp != zeroes);
    EXPECT_TRUE(temp == ones);
    temp |= zeroes;
    EXPECT_TRUE(temp != zeroes);
    EXPECT_TRUE(temp == ones);

    // 1 | 1
    EXPECT_TRUE(temp != zeroes);
    EXPECT_TRUE(temp == ones);
    temp |= ones;
    EXPECT_TRUE(temp != zeroes);
    EXPECT_TRUE(temp == ones);

    temp = zeroes;
    EXPECT_TRUE(temp.isEmpty());
    EXPECT_TRUE(temp != bitSet1);
    temp |= bitSet1;
    EXPECT_TRUE(temp == bitSet1);

    temp |= bitSet2;
    for (size_t i = 0; i < size; ++i)
        EXPECT_EQ(temp.get(i), bitSet1.get(i) || bitSet2.get(i));

    temp1 = temp;
    EXPECT_TRUE(temp1 == temp);

    temp |= zeroes;
    EXPECT_TRUE(temp == temp1);
    EXPECT_TRUE(temp != zeroes);

    temp |= ones;
    EXPECT_TRUE(temp != temp1);
    EXPECT_TRUE(temp == ones);
}

template<typename WordType>
void testBitSetOperatorBitOrAssignment()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();
    testBitSetOperatorBitOrAssignmentImpl(size, bitSet1, bitSet2, bitSetZeroes, bitSetOnes);
    testBitSetOperatorBitOrAssignmentImpl(smallSize, smallBitSet1, smallBitSet2, smallBitSetZeroes, smallBitSetOnes);
}

template<typename BitSet>
void testBitSetOperatorBitAndAssignmentImpl(size_t size, const BitSet& bitSet1, const BitSet& bitSet2, const BitSet& zeroes, const BitSet& ones)
{
    BitSet temp;
    BitSet temp1;

    // 0 & 0
    temp = zeroes;
    EXPECT_TRUE(temp == zeroes);
    EXPECT_TRUE(temp != ones);
    temp &= zeroes;
    EXPECT_TRUE(temp == zeroes);
    EXPECT_TRUE(temp != ones);

    // 0 & 1
    temp = zeroes;
    EXPECT_TRUE(temp == zeroes);
    EXPECT_TRUE(temp != ones);
    temp &= ones;
    EXPECT_TRUE(temp == zeroes);
    EXPECT_TRUE(temp != ones);

    // 1 & 0
    temp = ones;
    EXPECT_TRUE(temp != zeroes);
    EXPECT_TRUE(temp == ones);
    temp &= zeroes;
    EXPECT_TRUE(temp == zeroes);
    EXPECT_TRUE(temp != ones);

    // 1 & 1
    temp = ones;
    EXPECT_TRUE(temp != zeroes);
    EXPECT_TRUE(temp == ones);
    temp &= ones;
    EXPECT_TRUE(temp != zeroes);
    EXPECT_TRUE(temp == ones);

    temp = ones;
    EXPECT_TRUE(temp == ones);
    EXPECT_TRUE(temp != bitSet1);
    temp &= bitSet1;
    EXPECT_TRUE(temp == bitSet1);

    temp &= bitSet2;
    for (size_t i = 0; i < size; ++i)
        EXPECT_EQ(temp.get(i), bitSet1.get(i) && bitSet2.get(i));

    EXPECT_TRUE(!temp.isEmpty());
    temp1 = temp;
    EXPECT_TRUE(temp1 == temp);

    temp &= zeroes;
    EXPECT_TRUE(temp != temp1);
    EXPECT_TRUE(temp == zeroes);

    temp = temp1;
    temp &= ones;
    EXPECT_TRUE(temp == temp1);
    EXPECT_TRUE(temp != ones);
}

template<typename WordType>
void testBitSetOperatorBitAndAssignment()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();
    testBitSetOperatorBitAndAssignmentImpl(size, bitSet1, bitSet2, bitSetZeroes, bitSetOnes);
    testBitSetOperatorBitAndAssignmentImpl(smallSize, smallBitSet1, smallBitSet2, smallBitSetZeroes, smallBitSetOnes);
}

template<typename BitSet>
void testBitSetOperatorBitXorAssignmentImpl(size_t size, const BitSet& bitSet1, const BitSet& bitSet2, const BitSet& zeroes, const BitSet& ones)
{
    BitSet temp;
    BitSet temp1;

    // 0 ^ 0
    temp = zeroes;
    EXPECT_TRUE(temp == zeroes);
    EXPECT_TRUE(temp != ones);
    temp ^= zeroes;
    EXPECT_TRUE(temp == zeroes);
    EXPECT_TRUE(temp != ones);

    // 0 ^ 1
    temp = zeroes;
    EXPECT_TRUE(temp == zeroes);
    EXPECT_TRUE(temp != ones);
    temp ^= ones;
    EXPECT_TRUE(temp != zeroes);
    EXPECT_TRUE(temp == ones);

    // 1 ^ 0
    temp = ones;
    EXPECT_TRUE(temp != zeroes);
    EXPECT_TRUE(temp == ones);
    temp ^= zeroes;
    EXPECT_TRUE(temp != zeroes);
    EXPECT_TRUE(temp == ones);

    // 1 ^ 1
    temp = ones;
    EXPECT_TRUE(temp != zeroes);
    EXPECT_TRUE(temp == ones);
    temp ^= ones;
    EXPECT_TRUE(temp == zeroes);
    EXPECT_TRUE(temp != ones);

    temp.clearAll();
    EXPECT_TRUE(temp.isEmpty());
    EXPECT_TRUE(temp != bitSet1);
    temp ^= bitSet1;
    EXPECT_TRUE(temp == bitSet1);

    temp ^= bitSet2;
    for (size_t i = 0; i < size; ++i)
        EXPECT_EQ(temp.get(i), bitSet1.get(i) ^ bitSet2.get(i));

    temp1 = temp;
    EXPECT_TRUE(temp1 == temp);

    temp ^= zeroes;
    EXPECT_TRUE(temp == temp1);
    EXPECT_TRUE(temp != zeroes);

    temp ^= ones;
    EXPECT_TRUE(temp != temp1);
    EXPECT_TRUE(temp != ones);
    temp1.invert();
    EXPECT_TRUE(temp == temp1);
    EXPECT_TRUE(temp != ones);
}

template<typename WordType>
void testBitSetOperatorBitXorAssignment()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();
    testBitSetOperatorBitXorAssignmentImpl(size, bitSet1, bitSet2, bitSetZeroes, bitSetOnes);
    testBitSetOperatorBitXorAssignmentImpl(smallSize, smallBitSet1, smallBitSet2, smallBitSetZeroes, smallBitSetOnes);
}

template<typename WordType>
void testBitSetHash()
{
    DECLARE_AND_INIT_BITMAPS_FOR_TEST();

    constexpr unsigned wordSize = sizeof(WordType) * 8;
    constexpr size_t words = (size + wordSize - 1) / wordSize;

    auto expectedBitSetZeroesHash = [=] () -> unsigned {
        unsigned result = 0;
        WordType zeroWord = 0;
        for (size_t i = 0; i < words; ++i)
            result ^= IntHash<WordType>::hash(zeroWord);
        return result;
    };

    auto expectedBitSetOnesHash = [=] () -> unsigned {
        unsigned result = 0;
        WordType filledWord = static_cast<WordType>(-1);
        for (size_t i = 0; i < words; ++i)
            result ^= IntHash<WordType>::hash(filledWord);
        return result;
    };

    ASSERT_EQ(bitSetZeroes.hash(), expectedBitSetZeroesHash());
    ASSERT_EQ(bitSetOnes.hash(), expectedBitSetOnesHash());

    auto expectedHash = [=] (auto expectedBits, size_t size) {
        unsigned result = 0;
        for (size_t i = 0; i < size;) {
            WordType word = 0;
            for (size_t j = 0; j < wordSize && i < size; ++i, ++j)
                word |= static_cast<WordType>(!!expectedBits[i]) << j;
            result ^= IntHash<WordType>::hash(word);
        }
        return result;
    };

    ASSERT_EQ(bitSet1.hash(), expectedHash(expectedBits1, size));
    ASSERT_EQ(bitSet2.hash(), expectedHash(expectedBits2, size));

    static constexpr bool expectedSmallBits[smallSize] = {
        true,  false, false, true,  false,  false, false, true,
        true,
    };
    WTF::BitSet<smallSize, WordType> temp1;
    WTF::BitSet<smallSize, WordType> temp2;

    auto initTemp = [&] (auto& bitSet) {
        for (size_t i = 0; i < smallSize; ++i)
            bitSet.set(i, expectedSmallBits[i]);
    };

    initTemp(temp1);
    ASSERT_EQ(temp1.hash(), expectedHash(expectedSmallBits, smallSize));

    temp2.invert();
    initTemp(temp2);
    ASSERT_EQ(temp2.hash(), expectedHash(expectedSmallBits, smallSize));
    ASSERT_EQ(temp2.hash(), temp1.hash());
}

TEST(WTF_BitSet, Size_uint32_t) { testBitSetSize<uint32_t>(); }
TEST(WTF_BitSet, ConstructedEmpty_uint32_t) { testBitSetConstructedEmpty<uint32_t>(); }
TEST(WTF_BitSet, SetGet_uint32_t) { testBitSetSetGet<uint32_t>(); }
TEST(WTF_BitSet, TestAndSet_uint32_t) { testBitSetTestAndSet<uint32_t>(); }
TEST(WTF_BitSet, TestAndClear_uint32_t) { testBitSetTestAndClear<uint32_t>(); }
TEST(WTF_BitSet, ConcurrentTestAndSet_uint32_t) { testBitSetConcurrentTestAndSet<uint32_t>(); }
TEST(WTF_BitSet, ConcurrentTestAndClear_uint32_t) { testBitSetConcurrentTestAndClear<uint32_t>(); }
TEST(WTF_BitSet, Clear_uint32_t) { testBitSetClear<uint32_t>(); }
TEST(WTF_BitSet, ClearAll_uint32_t) { testBitSetClearAll<uint32_t>(); }
TEST(WTF_BitSet, Invert_uint32_t) { testBitSetInvert<uint32_t>(); }
TEST(WTF_BitSet, FindRunOfZeros_uint32_t) { testBitSetFindRunOfZeros<uint32_t>(); }
TEST(WTF_BitSet, Count_uint32_t) { testBitSetCount<uint32_t>(); }
TEST(WTF_BitSet, CountAfterSetAll_uint32_t) { testBitSetCountAfterSetAll<uint32_t>(); }
TEST(WTF_BitSet, IsEmpty_uint32_t) { testBitSetIsEmpty<uint32_t>(); }
TEST(WTF_BitSet, IsFull_uint32_t) { testBitSetIsFull<uint32_t>(); }
TEST(WTF_BitSet, Merge_uint32_t) { testBitSetMerge<uint32_t>(); }
TEST(WTF_BitSet, Filter_uint32_t) { testBitSetFilter<uint32_t>(); }
TEST(WTF_BitSet, Exclude_uint32_t) { testBitSetExclude<uint32_t>(); }
TEST(WTF_BitSet, ConcurrentFilter_uint32_t) { testBitSetConcurrentFilter<uint32_t>(); }
TEST(WTF_BitSet, Subsumes_uint32_t) { testBitSetSubsumes<uint32_t>(); }
TEST(WTF_BitSet, ForEachSetBit_uint32_t) { testBitSetForEachSetBit<uint32_t>(); }
TEST(WTF_BitSet, ForEachSetBitWithStartIndex_uint32_t) { testBitSetForEachSetBitWithStartIndex<uint32_t>(); }
TEST(WTF_BitSet, FindBit_uint32_t) { testBitSetFindBit<uint32_t>(); }
TEST(WTF_BitSet, Iteration_uint32_t) { testBitSetIteration<uint32_t>(); }
TEST(WTF_BitSet, MergeAndClear_uint32_t) { testBitSetMergeAndClear<uint32_t>(); }
TEST(WTF_BitSet, SetAndClear_uint32_t) { testBitSetSetAndClear<uint32_t>(); }
TEST(WTF_BitSet, SetEachNthBit_uint32_t) { testBitSetSetEachNthBit<uint32_t>(); }
TEST(WTF_BitSet, OperatorEqualAccess_uint32_t) { testBitSetOperatorEqual<uint32_t>(); }
TEST(WTF_BitSet, OperatorNotEqualAccess_uint32_t) { testBitSetOperatorNotEqual<uint32_t>(); }
TEST(WTF_BitSet, OperatorAssignment_uint32_t) { testBitSetOperatorAssignment<uint32_t>(); }
TEST(WTF_BitSet, OperatorBitOrAssignment_uint32_t) { testBitSetOperatorBitOrAssignment<uint32_t>(); }
TEST(WTF_BitSet, OperatorBitAndAssignment_uint32_t) { testBitSetOperatorBitAndAssignment<uint32_t>(); }
TEST(WTF_BitSet, OperatorBitXorAssignment_uint32_t) { testBitSetOperatorBitXorAssignment<uint32_t>(); }
TEST(WTF_BitSet, Hash_uint32_t) { testBitSetHash<uint32_t>(); }

#if CPU(REGISTER64)

TEST(WTF_BitSet, Size_uint64_t) { testBitSetSize<uint64_t>(); }
TEST(WTF_BitSet, ConstructedEmpty_uint64_t) { testBitSetConstructedEmpty<uint64_t>(); }
TEST(WTF_BitSet, SetGet_uint64_t) { testBitSetSetGet<uint64_t>(); }
TEST(WTF_BitSet, TestAndSet_uint64_t) { testBitSetTestAndSet<uint64_t>(); }
TEST(WTF_BitSet, TestAndClear_uint64_t) { testBitSetTestAndClear<uint64_t>(); }
TEST(WTF_BitSet, ConcurrentTestAndSet_uint64_t) { testBitSetConcurrentTestAndSet<uint64_t>(); }
TEST(WTF_BitSet, ConcurrentTestAndClear_uint64_t) { testBitSetConcurrentTestAndClear<uint64_t>(); }
TEST(WTF_BitSet, Clear_uint64_t) { testBitSetClear<uint64_t>(); }
TEST(WTF_BitSet, ClearAll_uint64_t) { testBitSetClearAll<uint64_t>(); }
TEST(WTF_BitSet, Invert_uint64_t) { testBitSetInvert<uint64_t>(); }
TEST(WTF_BitSet, FindRunOfZeros_uint64_t) { testBitSetFindRunOfZeros<uint64_t>(); }
TEST(WTF_BitSet, Count_uint64_t) { testBitSetCount<uint64_t>(); }
TEST(WTF_BitSet, CountAfterSetAll_uint64_t) { testBitSetCountAfterSetAll<uint64_t>(); }
TEST(WTF_BitSet, IsEmpty_uint64_t) { testBitSetIsEmpty<uint64_t>(); }
TEST(WTF_BitSet, IsFull_uint64_t) { testBitSetIsFull<uint64_t>(); }
TEST(WTF_BitSet, Merge_uint64_t) { testBitSetMerge<uint64_t>(); }
TEST(WTF_BitSet, Filter_uint64_t) { testBitSetFilter<uint64_t>(); }
TEST(WTF_BitSet, Exclude_uint64_t) { testBitSetExclude<uint64_t>(); }
TEST(WTF_BitSet, ConcurrentFilter_uint64_t) { testBitSetConcurrentFilter<uint64_t>(); }
TEST(WTF_BitSet, Subsumes_uint64_t) { testBitSetSubsumes<uint64_t>(); }
TEST(WTF_BitSet, ForEachSetBit_uint64_t) { testBitSetForEachSetBit<uint64_t>(); }
TEST(WTF_BitSet, ForEachSetBitWithStartIndex_uint64_t) { testBitSetForEachSetBitWithStartIndex<uint64_t>(); }
TEST(WTF_BitSet, FindBit_uint64_t) { testBitSetFindBit<uint64_t>(); }
TEST(WTF_BitSet, Iteration_uint64_t) { testBitSetIteration<uint64_t>(); }
TEST(WTF_BitSet, MergeAndClear_uint64_t) { testBitSetMergeAndClear<uint64_t>(); }
TEST(WTF_BitSet, SetAndClear_uint64_t) { testBitSetSetAndClear<uint64_t>(); }
TEST(WTF_BitSet, SetEachNthBit_uint64_t) { testBitSetSetEachNthBit<uint64_t>(); }
TEST(WTF_BitSet, OperatorEqualAccess_uint64_t) { testBitSetOperatorEqual<uint64_t>(); }
TEST(WTF_BitSet, OperatorNotEqualAccess_uint64_t) { testBitSetOperatorNotEqual<uint64_t>(); }
TEST(WTF_BitSet, OperatorAssignment_uint64_t) { testBitSetOperatorAssignment<uint64_t>(); }
TEST(WTF_BitSet, OperatorBitOrAssignment_uint64_t) { testBitSetOperatorBitOrAssignment<uint64_t>(); }
TEST(WTF_BitSet, OperatorBitAndAssignment_uint64_t) { testBitSetOperatorBitAndAssignment<uint64_t>(); }
TEST(WTF_BitSet, OperatorBitXorAssignment_uint64_t) { testBitSetOperatorBitXorAssignment<uint64_t>(); }
TEST(WTF_BitSet, Hash_uint64_t) { testBitSetHash<uint64_t>(); }

#endif // CPU(REGISTER64)

} // namespace TestWebKitAPI
