/*
 * QOM interface test.
 *
 * Copyright (C) 2013 Red Hat Inc.
 *
 * Authors:
 *  Igor Mammedov <imammedo@redhat.com>
 *
 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
 * See the COPYING.LIB file in the top-level directory.
 */
#include <glib.h>

#include "qom/object.h"
#include "qemu/module.h"


#define TYPE_TEST_IF "test-interface"
#define TEST_IF_CLASS(klass) \
     OBJECT_CLASS_CHECK(TestIfClass, (klass), TYPE_TEST_IF)
#define TEST_IF_GET_CLASS(obj) \
     OBJECT_GET_CLASS(TestIfClass, (obj), TYPE_TEST_IF)
#define TEST_IF(obj) \
     INTERFACE_CHECK(TestIf, (obj), TYPE_TEST_IF)

typedef struct TestIf {
    Object parent_obj;
} TestIf;

typedef struct TestIfClass {
    InterfaceClass parent_class;

    uint32_t test;
} TestIfClass;

static const TypeInfo test_if_info = {
    .name          = TYPE_TEST_IF,
    .parent        = TYPE_INTERFACE,
    .class_size = sizeof(TestIfClass),
};

#define PATTERN 0xFAFBFCFD

static void test_class_init(ObjectClass *oc, void *data)
{
    TestIfClass *tc = TEST_IF_CLASS(oc);

    g_assert(tc);
    tc->test = PATTERN;
}

#define TYPE_DIRECT_IMPL "direct-impl"

static const TypeInfo direct_impl_info = {
    .name = TYPE_DIRECT_IMPL,
    .parent = TYPE_OBJECT,
    .class_init = test_class_init,
    .interfaces = (InterfaceInfo[]) {
        { TYPE_TEST_IF },
        { }
    }
};

#define TYPE_INTERMEDIATE_IMPL "intermediate-impl"

static const TypeInfo intermediate_impl_info = {
    .name = TYPE_INTERMEDIATE_IMPL,
    .parent = TYPE_DIRECT_IMPL,
};

static void test_interface_impl(const char *type)
{
    Object *obj = object_new(type);
    TestIf *iobj = TEST_IF(obj);
    TestIfClass *ioc = TEST_IF_GET_CLASS(iobj);

    g_assert(iobj);
    g_assert(ioc->test == PATTERN);
}

static void interface_direct_test(void)
{
    test_interface_impl(TYPE_DIRECT_IMPL);
}

static void interface_intermediate_test(void)
{
    test_interface_impl(TYPE_INTERMEDIATE_IMPL);
}

int main(int argc, char **argv)
{
    g_test_init(&argc, &argv, NULL);

    module_call_init(MODULE_INIT_QOM);
    type_register_static(&test_if_info);
    type_register_static(&direct_impl_info);
    type_register_static(&intermediate_impl_info);

    g_test_add_func("/qom/interface/direct_impl", interface_direct_test);
    g_test_add_func("/qom/interface/intermediate_impl",
                    interface_intermediate_test);

    return g_test_run();
}
