/*
 * Copyright 2022 Google Inc
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met: redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer;
 * 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;
 * neither the name of the copyright holders nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
 * OWNER OR 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 <gmock/gmock.h>
#include <gtest/gtest.h>

#include <array>

#include "sim/bufval.hh"

using namespace gem5;

using testing::ElementsAre;

template <class First>
bool
pairFail(const std::pair<First, bool> &p)
{
    return !p.second;
}

bool
pairFailU64(const std::pair<std::uint64_t, bool> &p)
{
    return pairFail(p);
}
bool
pairFailStr(const std::pair<std::string, bool> &p)
{
    return pairFail(p);
}

template <class First>
bool
pairVal(const std::pair<First, bool> &p, const First &expected)
{
    auto &[first, success] = p;
    return success && (first == expected);
}

bool
pairValU64(const std::pair<std::uint64_t, bool> &p, std::uint64_t expected)
{
    return pairVal(p, expected);
}

bool
pairValStr(const std::pair<std::string, bool> &p, const std::string &expected)
{
    return pairVal(p, expected);
}

TEST(GetUintX, BadSize)
{
    uint8_t dummy{};
    EXPECT_PRED1(pairFailU64, getUintX(&dummy, 0, ByteOrder::little));
    EXPECT_PRED1(pairFailU64, getUintX(&dummy, 0, ByteOrder::big));
    EXPECT_PRED1(pairFailU64, getUintX(&dummy, 3, ByteOrder::little));
    EXPECT_PRED1(pairFailU64, getUintX(&dummy, 3, ByteOrder::big));
    EXPECT_PRED1(pairFailU64, getUintX(&dummy, 5, ByteOrder::little));
    EXPECT_PRED1(pairFailU64, getUintX(&dummy, 5, ByteOrder::big));
    EXPECT_PRED1(pairFailU64, getUintX(&dummy, 6, ByteOrder::little));
    EXPECT_PRED1(pairFailU64, getUintX(&dummy, 6, ByteOrder::big));
    EXPECT_PRED1(pairFailU64, getUintX(&dummy, 7, ByteOrder::little));
    EXPECT_PRED1(pairFailU64, getUintX(&dummy, 7, ByteOrder::big));
    EXPECT_PRED1(pairFailU64, getUintX(&dummy, 9, ByteOrder::little));
    EXPECT_PRED1(pairFailU64, getUintX(&dummy, 9, ByteOrder::big));
}

TEST(GetUintX, LittleEndian)
{
    const std::array<uint8_t, 9> buf =
        {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9};
    EXPECT_PRED2(pairValU64, getUintX(buf.data(), 1, ByteOrder::little),
            0x01);
    EXPECT_PRED2(pairValU64, getUintX(buf.data(), 2, ByteOrder::little),
            0x0201);
    EXPECT_PRED2(pairValU64, getUintX(buf.data(), 4, ByteOrder::little),
            0x04030201);
    EXPECT_PRED2(pairValU64, getUintX(buf.data(), 8, ByteOrder::little),
            0x0807060504030201);
}

TEST(GetUintX, BigEndian)
{
    const std::array<uint8_t, 9> buf =
        {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9};
    EXPECT_PRED2(pairValU64, getUintX(buf.data(), 1, ByteOrder::big),
            0x01);
    EXPECT_PRED2(pairValU64, getUintX(buf.data(), 2, ByteOrder::big),
            0x0102);
    EXPECT_PRED2(pairValU64, getUintX(buf.data(), 4, ByteOrder::big),
            0x01020304);
    EXPECT_PRED2(pairValU64, getUintX(buf.data(), 8, ByteOrder::big),
            0x0102030405060708);
}

TEST(SetUintX, BadSize)
{
    uint8_t dummy{};
    EXPECT_FALSE(setUintX(0, &dummy, 0, ByteOrder::little));
    EXPECT_FALSE(setUintX(0, &dummy, 0, ByteOrder::big));
    EXPECT_FALSE(setUintX(0, &dummy, 3, ByteOrder::little));
    EXPECT_FALSE(setUintX(0, &dummy, 3, ByteOrder::big));
    EXPECT_FALSE(setUintX(0, &dummy, 5, ByteOrder::little));
    EXPECT_FALSE(setUintX(0, &dummy, 5, ByteOrder::big));
    EXPECT_FALSE(setUintX(0, &dummy, 6, ByteOrder::little));
    EXPECT_FALSE(setUintX(0, &dummy, 6, ByteOrder::big));
    EXPECT_FALSE(setUintX(0, &dummy, 7, ByteOrder::little));
    EXPECT_FALSE(setUintX(0, &dummy, 7, ByteOrder::big));
    EXPECT_FALSE(setUintX(0, &dummy, 9, ByteOrder::little));
    EXPECT_FALSE(setUintX(0, &dummy, 9, ByteOrder::big));
}

TEST(SetUintX, LittleEndian)
{
    const std::array<uint8_t, 9> orig_buf =
        {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9};
    auto buf = orig_buf;

    EXPECT_TRUE(setUintX(0xf1, buf.data(), 1, ByteOrder::little));
    EXPECT_THAT(buf,
            ElementsAre(0xf1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9));
    EXPECT_TRUE(setUintX(0xe2e1, buf.data(), 2, ByteOrder::little));
    EXPECT_THAT(buf,
            ElementsAre(0xe1, 0xe2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9));
    EXPECT_TRUE(setUintX(0xd4d3d2d1, buf.data(), 4, ByteOrder::little));
    EXPECT_THAT(buf,
            ElementsAre(0xd1, 0xd2, 0xd3, 0xd4, 0x5, 0x6, 0x7, 0x8, 0x9));
    EXPECT_TRUE(setUintX(0xc8c7c6c5c4c3c2c1, buf.data(), 8,
                ByteOrder::little));
    EXPECT_THAT(buf,
            ElementsAre(0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0x9));
}

TEST(SetUintX, BigEndian)
{
    const std::array<uint8_t, 9> orig_buf =
        {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9};
    auto buf = orig_buf;

    EXPECT_TRUE(setUintX(0xf1, buf.data(), 1, ByteOrder::big));
    EXPECT_THAT(buf,
            ElementsAre(0xf1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9));
    EXPECT_TRUE(setUintX(0xe1e2, buf.data(), 2, ByteOrder::big));
    EXPECT_THAT(buf,
            ElementsAre(0xe1, 0xe2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9));
    EXPECT_TRUE(setUintX(0xd1d2d3d4, buf.data(), 4, ByteOrder::big));
    EXPECT_THAT(buf,
            ElementsAre(0xd1, 0xd2, 0xd3, 0xd4, 0x5, 0x6, 0x7, 0x8, 0x9));
    EXPECT_TRUE(setUintX(0xc1c2c3c4c5c6c7c8, buf.data(), 8, ByteOrder::big));
    EXPECT_THAT(buf,
            ElementsAre(0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0x9));
}

TEST(PrintUintX, BadSize)
{
    uint8_t dummy{};
    EXPECT_PRED1(pairFailStr, printUintX(&dummy, 0, ByteOrder::little));
    EXPECT_PRED1(pairFailStr, printUintX(&dummy, 0, ByteOrder::big));
    EXPECT_PRED1(pairFailStr, printUintX(&dummy, 3, ByteOrder::little));
    EXPECT_PRED1(pairFailStr, printUintX(&dummy, 3, ByteOrder::big));
    EXPECT_PRED1(pairFailStr, printUintX(&dummy, 5, ByteOrder::little));
    EXPECT_PRED1(pairFailStr, printUintX(&dummy, 5, ByteOrder::big));
    EXPECT_PRED1(pairFailStr, printUintX(&dummy, 6, ByteOrder::little));
    EXPECT_PRED1(pairFailStr, printUintX(&dummy, 6, ByteOrder::big));
    EXPECT_PRED1(pairFailStr, printUintX(&dummy, 7, ByteOrder::little));
    EXPECT_PRED1(pairFailStr, printUintX(&dummy, 7, ByteOrder::big));
    EXPECT_PRED1(pairFailStr, printUintX(&dummy, 9, ByteOrder::little));
    EXPECT_PRED1(pairFailStr, printUintX(&dummy, 9, ByteOrder::big));
}

TEST(PrintUintX, LittleEndian)
{
    const std::array<uint8_t, 9> buf =
        {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9};
    EXPECT_PRED2(pairValStr, printUintX(buf.data(), 1, ByteOrder::little),
            "0x01");
    EXPECT_PRED2(pairValStr, printUintX(buf.data(), 2, ByteOrder::little),
            "0x0201");
    EXPECT_PRED2(pairValStr, printUintX(buf.data(), 4, ByteOrder::little),
            "0x04030201");
    EXPECT_PRED2(pairValStr, printUintX(buf.data(), 8, ByteOrder::little),
            "0x0807060504030201");
}

TEST(PrintUintX, BigEndian)
{
    const std::array<uint8_t, 9> buf =
        {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9};
    EXPECT_PRED2(pairValStr, printUintX(buf.data(), 1, ByteOrder::big),
            "0x01");
    EXPECT_PRED2(pairValStr, printUintX(buf.data(), 2, ByteOrder::big),
            "0x0102");
    EXPECT_PRED2(pairValStr, printUintX(buf.data(), 4, ByteOrder::big),
            "0x01020304");
    EXPECT_PRED2(pairValStr, printUintX(buf.data(), 8, ByteOrder::big),
            "0x0102030405060708");
}

TEST(PrintByteBuf, LittleEndian)
{
    const std::array<uint8_t, 9> buf =
        {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xa};

    EXPECT_EQ(printByteBuf(buf.data(), 0, ByteOrder::little, 3), "[]");
    EXPECT_EQ(printByteBuf(buf.data(), 1, ByteOrder::little, 3), "[01]");
    EXPECT_EQ(printByteBuf(buf.data(), 2, ByteOrder::little, 3), "[0102]");
    EXPECT_EQ(printByteBuf(buf.data(), 3, ByteOrder::little, 3),
            "[010203]");
    EXPECT_EQ(printByteBuf(buf.data(), 4, ByteOrder::little, 3),
            "[010203 04]");
    EXPECT_EQ(printByteBuf(buf.data(), 5, ByteOrder::little, 3),
            "[010203 0405]");
    EXPECT_EQ(printByteBuf(buf.data(), 6, ByteOrder::little, 3),
            "[010203 040506]");
    EXPECT_EQ(printByteBuf(buf.data(), 7, ByteOrder::little, 3),
            "[010203 040506 07]");
    EXPECT_EQ(printByteBuf(buf.data(), 8, ByteOrder::little, 3),
            "[010203 040506 0708]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 3),
            "[010203 040506 07080a]");
}

TEST(PrintByteBuf, BigEndian)
{
    const std::array<uint8_t, 9> buf =
        {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xa};

    EXPECT_EQ(printByteBuf(buf.data(), 0, ByteOrder::big, 3), "[]");
    EXPECT_EQ(printByteBuf(buf.data(), 1, ByteOrder::big, 3), "[01]");
    EXPECT_EQ(printByteBuf(buf.data(), 2, ByteOrder::big, 3), "[0201]");
    EXPECT_EQ(printByteBuf(buf.data(), 3, ByteOrder::big, 3), "[030201]");
    EXPECT_EQ(printByteBuf(buf.data(), 4, ByteOrder::big, 3),
            "[04 030201]");
    EXPECT_EQ(printByteBuf(buf.data(), 5, ByteOrder::big, 3),
            "[0504 030201]");
    EXPECT_EQ(printByteBuf(buf.data(), 6, ByteOrder::big, 3),
            "[060504 030201]");
    EXPECT_EQ(printByteBuf(buf.data(), 7, ByteOrder::big, 3),
            "[07 060504 030201]");
    EXPECT_EQ(printByteBuf(buf.data(), 8, ByteOrder::big, 3),
            "[0807 060504 030201]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 3),
            "[0a0807 060504 030201]");
}

TEST(PrintByteBuf, ChunkSize)
{
    const std::array<uint8_t, 9> buf =
        {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xa};

    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 1),
            "[01 02 03 04 05 06 07 08 0a]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 2),
            "[0102 0304 0506 0708 0a]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 3),
            "[010203 040506 07080a]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 4),
            "[01020304 05060708 0a]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 5),
            "[0102030405 0607080a]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 6),
            "[010203040506 07080a]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 7),
            "[01020304050607 080a]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 8),
            "[0102030405060708 0a]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 9),
            "[01020304050607080a]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 10),
            "[01020304050607080a]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 100),
            "[01020304050607080a]");

    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 1),
            "[0a 08 07 06 05 04 03 02 01]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 2),
            "[0a 0807 0605 0403 0201]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 3),
            "[0a0807 060504 030201]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 4),
            "[0a 08070605 04030201]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 5),
            "[0a080706 0504030201]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 6),
            "[0a0807 060504030201]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 7),
            "[0a08 07060504030201]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 8),
            "[0a 0807060504030201]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 9),
            "[0a0807060504030201]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 10),
            "[0a0807060504030201]");
    EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 100),
            "[0a0807060504030201]");
}
