#include <sdbusplus/vtable.hpp>

#include <gtest/gtest.h>

extern "C"
{
    int test_handler(sd_bus_message* m, void* userdata,
                     sd_bus_error* ret_error);
    int test_get(sd_bus* bus, const char* path, const char* interface,
                 const char* property, sd_bus_message* reply, void* userdata,
                 sd_bus_error* ret_error);
    int test_set(sd_bus* bus, const char* path, const char* interface,
                 const char* property, sd_bus_message* value, void* userdata,
                 sd_bus_error* ret_error);

    extern const sd_bus_vtable example2[];
    extern const size_t example2_size;
}

static const sdbusplus::vtable::vtable_t example[] = {
    sdbusplus::vtable::start(),
    sdbusplus::vtable::method("1", "2", "3", &test_handler, 0),
    sdbusplus::vtable::signal("5", "6"),
    sdbusplus::vtable::property("7", "8", &test_get,
                                sdbusplus::vtable::property_::const_),
    sdbusplus::vtable::property("10", "11", &test_get, &test_set),
    sdbusplus::vtable::property_o("14", "15", 16),
    sdbusplus::vtable::end()};

TEST(VtableTest, SameSize)
{
    ASSERT_EQ(sizeof(example), example2_size);
}

constexpr bool operator==(const sd_bus_vtable& t1, const sd_bus_vtable& t2)
{
    if (t1.type != t2.type || t1.flags != t2.flags)
    {
        return false;
    }

    switch (t1.type)
    {
        case _SD_BUS_VTABLE_START:
            return t1.x.start.element_size == t2.x.start.element_size &&
                   t1.x.start.features == t2.x.start.features;
            // FIXME: In systemd 243, there is the new vtable_format_reference
            // member, but current CI is using libsystemd 242, so we can not
            // check it yet.
            // && t1.x.start.vtable_format_reference
            //      == t2.x.start.vtable_format_reference;
            break;
        case _SD_BUS_VTABLE_END:
        {
            // The union x shall be all zeros for END
            constexpr uint8_t allZeors[sizeof(t1.x)] = {0};
            return memcmp(&t1.x, allZeors, sizeof(t1.x)) == 0 &&
                   memcmp(&t2.x, allZeors, sizeof(t2.x)) == 0;
            break;
        }
        case _SD_BUS_VTABLE_METHOD:
            return strcmp(t1.x.method.member, t2.x.method.member) == 0 &&
                   strcmp(t1.x.method.signature, t2.x.method.signature) == 0 &&
                   strcmp(t1.x.method.result, t2.x.method.result) == 0 &&
                   t1.x.method.handler == t2.x.method.handler &&
                   t1.x.method.offset == t2.x.method.offset &&
                   strcmp(t1.x.method.names, t2.x.method.names) == 0;
            break;
        case _SD_BUS_VTABLE_SIGNAL:
            return strcmp(t1.x.signal.member, t2.x.signal.member) == 0 &&
                   strcmp(t1.x.signal.signature, t2.x.signal.signature) == 0 &&
                   strcmp(t1.x.signal.names, t2.x.signal.names) == 0;
            break;
        case _SD_BUS_VTABLE_PROPERTY:
        case _SD_BUS_VTABLE_WRITABLE_PROPERTY:
            return strcmp(t1.x.property.member, t2.x.property.member) == 0 &&
                   strcmp(t1.x.property.signature, t2.x.property.signature) ==
                       0 &&
                   t1.x.property.get == t2.x.property.get &&
                   t1.x.property.set == t2.x.property.set &&
                   t1.x.property.offset == t2.x.property.offset;
            break;
    }
    return false;
}

TEST(VtableTest, SameContent)
{
    for (size_t i = 0; i < sizeof(example) / sizeof(example[0]); ++i)
    {
        EXPECT_EQ(example[i], example2[i]);
    }
}
