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

using namespace std::string_literals;
using namespace phosphor::dbus::monitoring;

using Property =
    TupleOfRefs<const std::string, const std::string, const std::string>;

using GroupOfProperties = std::vector<::Property>;

#include "propertygentest.hpp"
const std::array<std::string, 3> expectedMeta = {
    "PROPERTY1"s,
    "PROPERTY2"s,
    "PROPERTY3"s,
};

const std::array<std::string, 4> expectedInterfaces = {
    "xyz.openbmc_project.Test.Iface3"s,
    "xyz.openbmc_project.Test.Iface2"s,
    "xyz.openbmc_project.Test.Iface6"s,
    "xyz.openbmc_project.Test.Iface1"s,
};

const std::array<std::string, 4> expectedProperties = {
    "Foo"s,
    "Value"s,
    "Bar"s,
    "Baz"s,
};

const std::array<GroupOfProperties, 4> expectedGroups = {{
    {
        ::Property{interfaces[0], properties[0], meta[0]},
        ::Property{interfaces[1], properties[1], meta[1]},
    },
    {
        ::Property{interfaces[0], properties[2], meta[0]},
        ::Property{interfaces[1], properties[0], meta[1]},
    },
    {
        ::Property{interfaces[2], properties[0], meta[0]},
        ::Property{interfaces[3], properties[1], meta[1]},
    },
    {
        ::Property{interfaces[0], properties[2], meta[0]},
        ::Property{interfaces[1], properties[1], meta[1]},
        ::Property{interfaces[2], properties[3], meta[2]},
    },
}};

const std::array<std::string, 4> expectedTypes = {
    "uint32_t"s,
    "int32_t"s,
    "std::string"s,
    "int32_t"s,
};

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

TEST(PropertyGenTest, IfacesSameSize)
{
    ASSERT_EQ(sizeof(expectedInterfaces), sizeof(interfaces));
}

TEST(PropertyGenTest, PropertiesSameSize)
{
    ASSERT_EQ(sizeof(expectedProperties), sizeof(properties));
}

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

TEST(PropertyGenTest, TypesSameSize)
{
    ASSERT_EQ(sizeof(expectedTypes), sizeof(types));
}

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

TEST(PropertyGenTest, IfacesSameContent)
{
    size_t i;
    for (i = 0; i < expectedInterfaces.size(); ++i)
    {
        ASSERT_EQ(interfaces[i], expectedInterfaces[i]);
    }
}

TEST(PropertyGenTest, PropertiesSameContent)
{
    size_t i;
    for (i = 0; i < expectedProperties.size(); ++i)
    {
        ASSERT_EQ(expectedProperties[i], properties[i]);
    }
}

TEST(PropertyGenTest, GroupsSameContent)
{
    size_t i;
    for (i = 0; i < expectedGroups.size(); ++i)
    {
        size_t j;
        for (j = 0; j < expectedGroups[i].size(); ++j)
        {
            const auto& expectedIface = std::get<0>(expectedGroups[i][j]).get();
            const auto& actualIface = std::get<0>(groups[i][j]).get();
            ASSERT_EQ(expectedIface, actualIface);

            const auto& expectedProperty =
                std::get<1>(expectedGroups[i][j]).get();
            const auto& actualProperty = std::get<1>(groups[i][j]).get();
            ASSERT_EQ(expectedProperty, actualProperty);

            const auto& expectedMeta = std::get<1>(expectedGroups[i][j]).get();
            const auto& actualMeta = std::get<1>(groups[i][j]).get();
            ASSERT_EQ(expectedMeta, actualMeta);
        }
    }
}

TEST(PropertyGenTest, TypesSameContent)
{
    size_t i;
    for (i = 0; i < expectedTypes.size(); ++i)
    {
        ASSERT_EQ(expectedTypes[i], types[i]);
    }
}
