#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]);
    }
}
