#include <hei_user_defines.hpp>
#include <util/hei_bit_string.hpp>

#include "gtest/gtest.h"

using namespace libhei;

static constexpr uint32_t UINT8_BIT_LEN  = (sizeof(uint8_t) * 8);
static constexpr uint32_t UINT64_BIT_LEN = (sizeof(uint64_t) * 8);

// setBit()
// clearBit()
// setAll()
// clearAll()
// isBitSet()
// getSetCount()
// isZero()
TEST(BitStringTest, TestSet1)
{
    BitStringBuffer bs(UINT64_BIT_LEN);
    uint32_t i;

    // set all bits in ascending order
    for (i = 0; i < UINT64_BIT_LEN; i++)
    {
        // Make sure bit gets set and set count
        // is increasing
        bs.setBit(i);
        ASSERT_TRUE(bs.isBitSet(i));
        ASSERT_EQ(bs.getSetCount(), i + 1);
    }
    // all bits should be set at this point
    ASSERT_EQ(bs.getFieldRight(0, 64), UINT64_MAX);
    ASSERT_EQ(bs.getFieldLeft(0, 64), UINT64_MAX);

    // test clearAll(), setAll()
    bs.clearAll();
    ASSERT_TRUE(bs.isZero());
    bs.setAll();
    ASSERT_EQ(bs.getSetCount(), UINT64_BIT_LEN);

    // clear all bits in descending order
    for (i = UINT64_BIT_LEN; 0 != i; i--)
    {
        // make sure bit gets cleared and set count
        // is decreasing
        ASSERT_EQ(bs.getSetCount(), i);
        bs.clearBit(i - 1);
        ASSERT_FALSE(bs.isBitSet(i - 1));
    }
    // all bits should be clear at this point
    ASSERT_EQ(bs.getSetCount(), 0u);
    ASSERT_EQ(bs.getFieldRight(0, 64), 0u);
    ASSERT_EQ(bs.getFieldLeft(0, 64), 0u);
    ASSERT_TRUE(bs.isZero());
}

// setPattern()
TEST(BitStringTest, TestSet2)
{
    BitStringBuffer bs(UINT64_BIT_LEN);
    uint64_t field = 0xaaaaaaaaaaaaaaaa;

    bs.setPattern(field);
    ASSERT_EQ(field, bs.getFieldRight(0, 64));
    ASSERT_EQ(field, bs.getFieldLeft(0, 64));

    bs.clearAll();
    ASSERT_TRUE(bs.isZero());

    bs.setPattern(0xaa, 8);
    ASSERT_EQ(field, bs.getFieldRight(0, 64));
    ASSERT_EQ(field, bs.getFieldLeft(0, 64));

    bs.clearAll();
    ASSERT_TRUE(bs.isZero());

    bs.setPattern(0, 64, 0xaaaa, 16);
    ASSERT_EQ(field, bs.getFieldRight(0, 64));
    ASSERT_EQ(field, bs.getFieldLeft(0, 64));
}

// setString()
TEST(BitStringTest, TestSet3)
{
    BitStringBuffer bsb_dest(64);
    BitStringBuffer bsb_src(64);

    bsb_dest.clearAll();
    ASSERT_TRUE(bsb_dest.isZero());

    bsb_src.setAll();
    ASSERT_EQ(64u, bsb_src.getSetCount());

    bsb_dest.setString(bsb_src);
    ASSERT_FALSE(bsb_dest.isZero());
    ASSERT_EQ(bsb_dest.getFieldRight(0, 64), bsb_src.getFieldRight(0, 64));
    ASSERT_EQ(bsb_dest.getFieldLeft(0, 64), bsb_src.getFieldLeft(0, 64));
}

// maskString()
TEST(BitStringTest, TestSet4)
{
    BitStringBuffer bsb(64);
    bsb.setAll();
    ASSERT_EQ(64u, bsb.getSetCount());

    BitStringBuffer bsb_mask(64);
    bsb_mask.setFieldRight(0, 64, 0xaaaaaaaaaaaaaaaa);

    bsb.maskString(bsb_mask);
    ASSERT_EQ(bsb.getFieldRight(0, 64), 0x5555555555555555u);
}

// setFieldRight()
// setFieldLeft()
// getFielRight()
// getFieldLeft()
TEST(BitStringTest, TestSet5)
{
    uint64_t field = 0x1234567890abcdef;
    BitStringBuffer bsb(64);

    // set bitstring to low end of field
    bsb.setFieldRight(0, 32, field);
    ASSERT_EQ(field << 32, bsb.getFieldLeft(0, 32));

    // set bitstring to high end of field
    bsb.setFieldLeft(0, 32, field);
    ASSERT_EQ(field >> 32, bsb.getFieldRight(0, 32));

    // increasing offset
    for (uint32_t i = 0; i < UINT64_BIT_LEN; i++)
    {
        // increasing length
        for (uint32_t j = 1; j <= UINT64_BIT_LEN - i; j++)
        {
            bsb.clearAll();
            bsb.setFieldRight(i, j, UINT64_MAX);

            // verify
            ASSERT_EQ(bsb.getFieldRight(i, j),
                      UINT64_MAX >> (UINT64_BIT_LEN - j));
        }
    }
    for (uint32_t i = 0; i < UINT64_BIT_LEN; i++)
    {
        // set 1 bit at offset i
        bsb.clearAll();
        bsb.setFieldRight(i, 1, 1);

        // verify bit is set
        ASSERT_EQ(bsb.getFieldRight(0, 64),
                  (uint64_t)1 << (UINT64_BIT_LEN - i - 1));
    }
}

// operator >>
// operator <<
TEST(BitStringTest, TestSet6)
{
    uint64_t field = 0x1234567890abcdef;
    BitStringBuffer bsb(64);

    bsb.setFieldRight(0, 64, field);
    ASSERT_EQ(field, bsb.getFieldRight(0, 64));
    ASSERT_EQ(field >> 32, (bsb >> 32).getFieldRight(0, 64));
    ASSERT_EQ(field << 32, (bsb << 32).getFieldRight(0, 64));
}
