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