#include <array>
#include <string>
#include <gtest/gtest.h>
#include "data_types.hpp"

using namespace std::string_literals;
using namespace phosphor::dbus::monitoring;
using PathMeta = TupleOfRefs<const std::string, const std::string>;

#include "pathgentest.hpp"

const std::array<std::string, 3> expectedMeta =
{
    "PATH1"s,
    "PATH3"s,
    "PATH2"s,
};

const std::array<std::string, 6> expectedPaths =
{
    "/xyz/openbmc_project/testing/inst1"s,
    "/xyz/openbmc_project/testing/inst2"s,
    "/xyz/openbmc_project/testing/inst3"s,
    "/xyz/openbmc_project/testing/inst4"s,
    "/xyz/openbmc_project/testing/inst5"s,
    "/xyz/openbmc_project/testing/inst6"s,
};

const std::array<PathMeta, 14> expectedPathMeta =
{
    {
        PathMeta{ paths[0], meta[0] },
        PathMeta{ paths[1], meta[0] },
        PathMeta{ paths[2], meta[0] },
        PathMeta{ paths[3], meta[0] },
        PathMeta{ paths[0], meta[1] },
        PathMeta{ paths[1], meta[1] },
        PathMeta{ paths[2], meta[1] },
        PathMeta{ paths[3], meta[1] },
        PathMeta{ paths[4], meta[0] },
        PathMeta{ paths[5], meta[0] },
        PathMeta{ paths[3], meta[2] },
        PathMeta{ paths[2], meta[2] },
        PathMeta{ paths[1], meta[2] },
        PathMeta{ paths[0], meta[2] },
    }
};

const std::array<RefVector<const std::string>, 4> expectedGroups =
{
    {
        {
            paths[0],
            paths[1],
            paths[2],
            paths[3],
        },
        {
            paths[0],
            paths[1],
            paths[2],
            paths[3],
        },
        {
            paths[0],
            paths[1],
            paths[4],
            paths[5],
        },
        {
            paths[3],
            paths[2],
            paths[1],
            paths[0],
        },
    }
};

TEST(PathGenTest, MetaSameSize)
{
    ASSERT_EQ(sizeof(expectedMeta), sizeof(meta));
}

TEST(PathGenTest, PathsSameSize)
{
    ASSERT_EQ(sizeof(expectedPaths), sizeof(paths));
}

TEST(PathGenTest, PathMetaSameSize)
{
    ASSERT_EQ(sizeof(expectedPathMeta), sizeof(pathMeta));
}

TEST(PathGenTest, GroupsSameSize)
{
    ASSERT_EQ(sizeof(expectedGroups), sizeof(groups));
}

TEST(PathGenTest, MetaSameContent)
{
    size_t i;
    for (i = 0; i < expectedMeta.size(); ++i)
    {
        ASSERT_EQ(meta[i], expectedMeta[i]);
    }
}

TEST(PathGenTest, PathsSameContent)
{
    size_t i;
    for (i = 0; i < expectedPaths.size(); ++i)
    {
        ASSERT_EQ(paths[i], expectedPaths[i]);
    }
}

TEST(PathGenTest, PathMetaSameContent)
{
    size_t i;
    for (i = 0; i < expectedPathMeta.size(); ++i)
    {
        const auto& path = std::get<0>(pathMeta[i]).get();
        const auto& expPath = std::get<0>(expectedPathMeta[i]).get();
        const auto& meta = std::get<1>(pathMeta[i]).get();
        const auto& expMeta = std::get<1>(expectedPathMeta[i]).get();

        ASSERT_EQ(path, expPath);
        ASSERT_EQ(meta, expMeta);
    }
}

TEST(PathGenTest, GroupsSameContent)
{
    size_t i;
    for (i = 0; i < expectedGroups.size(); ++i)
    {
        size_t j;
        for (j = 0; j < groups[i].size(); ++j)
        {
            ASSERT_EQ(groups[i][j].get(), expectedGroups[i][j].get());

        }
    }
}
