Blame src/tests/ibus-engine-switch.c

Packit 3ff832
/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
Packit 3ff832
Packit 3ff832
#include <string.h>
Packit 3ff832
#include "ibus.h"
Packit 3ff832
Packit 3ff832
static IBusBus *bus;
Packit 3ff832
Packit 3ff832
#define BEFORE_ENGINE "xkb:us::eng"
Packit 3ff832
#define AFTER_ENGINE "xkb:jp::jpn"
Packit 3ff832
Packit 3ff832
static const gchar *engine_names[] = {
Packit 3ff832
    BEFORE_ENGINE,
Packit 3ff832
    AFTER_ENGINE
Packit 3ff832
};
Packit 3ff832
rpm-build d915bf
static const gchar *engine_names2[] = {
rpm-build d915bf
    AFTER_ENGINE,
rpm-build d915bf
    BEFORE_ENGINE
rpm-build d915bf
};
rpm-build d915bf
Packit 3ff832
static void
rpm-build d915bf
change_global_engine (gboolean reverse)
Packit 3ff832
{
Packit 3ff832
    gint i;
Packit 3ff832
Packit 3ff832
    for (i = 0; i < G_N_ELEMENTS (engine_names); i++) {
rpm-build d915bf
        const gchar *engine_name = engine_names[i];
rpm-build d915bf
        if (reverse)
rpm-build d915bf
            engine_name = engine_names2[i];
rpm-build d915bf
        ibus_bus_set_global_engine (bus, engine_name);
Packit 3ff832
        IBusEngineDesc *engine_desc = ibus_bus_get_global_engine (bus);
Packit 3ff832
        g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc),
Packit 3ff832
                         ==,
rpm-build d915bf
                         engine_name);
Packit 3ff832
        g_object_unref (G_OBJECT (engine_desc));
Packit 3ff832
    }
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
static void
Packit 3ff832
change_context_engine (IBusInputContext *context)
Packit 3ff832
{
Packit 3ff832
    gint i;
Packit 3ff832
Packit 3ff832
    for (i = 0; i < G_N_ELEMENTS (engine_names); i++) {
Packit 3ff832
        ibus_input_context_set_engine (context, engine_names[i]);
Packit 3ff832
        IBusEngineDesc *engine_desc = ibus_input_context_get_engine (context);
Packit 3ff832
        g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc),
Packit 3ff832
                         ==,
Packit 3ff832
                         engine_names[i]);
Packit 3ff832
    }
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
typedef struct {
Packit 3ff832
    gint count;
Packit 3ff832
    guint timeout_id;
Packit 3ff832
    guint idle_id;
rpm-build d915bf
    gboolean reverse;
Packit 3ff832
} GlobalEngineChangedData;
Packit 3ff832
Packit 3ff832
static void
Packit 3ff832
global_engine_changed_cb (IBusBus *bus, gchar *name, gpointer user_data)
Packit 3ff832
{
Packit 3ff832
    GlobalEngineChangedData *data = (GlobalEngineChangedData *) user_data;
Packit 3ff832
    if (data->count++ == 0)
Packit 3ff832
        ibus_quit ();
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
static gboolean
Packit 3ff832
timeout_cb (gpointer user_data)
Packit 3ff832
{
Packit 3ff832
    GlobalEngineChangedData *data = (GlobalEngineChangedData *) user_data;
Packit 3ff832
    if (data->count == 0)
Packit 3ff832
        ibus_quit ();
Packit 3ff832
    data->timeout_id = 0;
Packit 3ff832
    return FALSE;
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
static gboolean
Packit 3ff832
change_global_engine_cb (gpointer user_data)
Packit 3ff832
{
Packit 3ff832
    GlobalEngineChangedData *data = (GlobalEngineChangedData *) user_data;
rpm-build d915bf
    change_global_engine (data->reverse);
Packit 3ff832
    data->idle_id = 0;
Packit 3ff832
    return FALSE;
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
static void
Packit 3ff832
test_global_engine (void)
Packit 3ff832
{
rpm-build d915bf
    GLogLevelFlags flags;
rpm-build d915bf
    IBusEngineDesc *desc;
Packit 3ff832
    GlobalEngineChangedData data;
Packit 3ff832
    guint handler_id;
Packit 3ff832
Packit 3ff832
    if (!ibus_bus_get_use_global_engine (bus))
Packit 3ff832
        return;
Packit 3ff832
rpm-build d915bf
    /* "No global engine." warning is not critical message. */
rpm-build d915bf
    flags = g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL);
rpm-build d915bf
    desc = ibus_bus_get_global_engine (bus);
rpm-build d915bf
    g_log_set_always_fatal (flags);
rpm-build d915bf
    if (desc &&
rpm-build d915bf
        !g_strcmp0 (BEFORE_ENGINE, ibus_engine_desc_get_name (desc))) {
rpm-build d915bf
        data.reverse = TRUE;
rpm-build d915bf
    } else {
rpm-build d915bf
        data.reverse = FALSE;
rpm-build d915bf
    }
rpm-build d915bf
Packit 3ff832
    data.count = 0;
Packit 3ff832
Packit 3ff832
    handler_id = g_signal_connect (bus,
Packit 3ff832
                                   "global-engine-changed",
Packit 3ff832
                                   G_CALLBACK (global_engine_changed_cb),
Packit 3ff832
                                   &data);
Packit 3ff832
    data.timeout_id = g_timeout_add_seconds (1, timeout_cb, &data);
Packit 3ff832
    data.idle_id = g_idle_add ((GSourceFunc) change_global_engine_cb, &data);
Packit 3ff832
Packit 3ff832
    ibus_main ();
Packit 3ff832
Packit 3ff832
    g_assert_cmpint (data.count, ==, G_N_ELEMENTS (engine_names));
Packit 3ff832
Packit 3ff832
    if (data.idle_id > 0)
Packit 3ff832
        g_source_remove (data.idle_id);
Packit 3ff832
    if (data.timeout_id > 0)
Packit 3ff832
        g_source_remove (data.timeout_id);
Packit 3ff832
    g_signal_handler_disconnect (bus, handler_id);
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
static void
Packit 3ff832
test_context_engine (void)
Packit 3ff832
{
Packit 3ff832
    IBusEngineDesc *engine_desc;
Packit 3ff832
    IBusInputContext *context;
Packit 3ff832
Packit 3ff832
    if (ibus_bus_get_use_global_engine (bus))
Packit 3ff832
        return;
Packit 3ff832
Packit 3ff832
    context = ibus_bus_create_input_context (bus, "test");
Packit 3ff832
    ibus_input_context_set_capabilities (context, IBUS_CAP_FOCUS);
Packit 3ff832
Packit 3ff832
    /* ibus_bus_set_global_engine() changes focused context engine. */
Packit 3ff832
    ibus_input_context_focus_in (context);
Packit 3ff832
Packit 3ff832
    change_context_engine (context);
Packit 3ff832
    engine_desc = ibus_input_context_get_engine (context);
Packit 3ff832
    g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc), ==, AFTER_ENGINE);
Packit 3ff832
Packit 3ff832
    g_object_unref (context);
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
static void
Packit 3ff832
test_context_engine_set_by_global (void)
Packit 3ff832
{
Packit 3ff832
    IBusEngineDesc *engine_desc;
Packit 3ff832
    IBusInputContext *context;
Packit 3ff832
Packit 3ff832
    if (!ibus_bus_get_use_global_engine (bus))
Packit 3ff832
        return;
Packit 3ff832
Packit 3ff832
    context = ibus_bus_create_input_context (bus, "test");
Packit 3ff832
    ibus_input_context_set_capabilities (context, IBUS_CAP_FOCUS);
Packit 3ff832
Packit 3ff832
    /* ibus_bus_set_global_engine() changes focused context engine. */
Packit 3ff832
    ibus_input_context_focus_in (context);
Packit 3ff832
rpm-build d915bf
    change_global_engine (FALSE);
Packit 3ff832
Packit 3ff832
    /* ibus_input_context_set_engine() does not take effect when
Packit 3ff832
       global engine is used. */
Packit 3ff832
    ibus_input_context_set_engine (context, BEFORE_ENGINE);
Packit 3ff832
Packit 3ff832
    engine_desc = ibus_input_context_get_engine (context);
Packit 3ff832
    g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc), ==, AFTER_ENGINE);
Packit 3ff832
Packit 3ff832
    g_object_unref (context);
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
static void
Packit 3ff832
test_context_engine_set_by_focus (void)
Packit 3ff832
{
Packit 3ff832
    IBusEngineDesc *engine_desc;
Packit 3ff832
    IBusInputContext *context, *another_context;
Packit 3ff832
Packit 3ff832
    if (!ibus_bus_get_use_global_engine (bus))
Packit 3ff832
        return;
Packit 3ff832
Packit 3ff832
    context = ibus_bus_create_input_context (bus, "test");
Packit 3ff832
    ibus_input_context_set_capabilities (context, IBUS_CAP_FOCUS);
Packit 3ff832
Packit 3ff832
    another_context = ibus_bus_create_input_context (bus, "another");
Packit 3ff832
    ibus_input_context_set_capabilities (another_context, IBUS_CAP_FOCUS);
Packit 3ff832
Packit 3ff832
    ibus_input_context_focus_in (context);
Packit 3ff832
rpm-build d915bf
    change_global_engine (FALSE);
Packit 3ff832
Packit 3ff832
    /* When focus is lost, context engine is set to "dummy". */
Packit 3ff832
    ibus_input_context_focus_in (another_context);
Packit 3ff832
Packit 3ff832
    engine_desc = ibus_input_context_get_engine (context);
Packit 3ff832
    g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc), ==, "dummy");
Packit 3ff832
Packit 3ff832
    engine_desc = ibus_input_context_get_engine (another_context);
Packit 3ff832
    g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc), ==, AFTER_ENGINE);
Packit 3ff832
Packit 3ff832
    g_object_unref (context);
Packit 3ff832
    g_object_unref (another_context);
Packit 3ff832
}
Packit 3ff832
Packit 3ff832
gint
Packit 3ff832
main (gint    argc,
Packit 3ff832
      gchar **argv)
Packit 3ff832
{
Packit 3ff832
    gint result;
Packit 3ff832
    ibus_init ();
Packit 3ff832
    g_test_init (&argc, &argv, NULL);
Packit 3ff832
    bus = ibus_bus_new ();
Packit 3ff832
    g_object_unref (bus);
Packit 3ff832
    bus = ibus_bus_new (); // crosbug.com/17293
Packit 3ff832
Packit 3ff832
    ibus_bus_set_watch_ibus_signal (bus, TRUE);
Packit 3ff832
Packit 3ff832
    g_test_add_func ("/ibus/engine-switch/global-engine",
Packit 3ff832
                     test_global_engine);
Packit 3ff832
    g_test_add_func ("/ibus/engine-switch/context-engine",
Packit 3ff832
                     test_context_engine);
Packit 3ff832
    g_test_add_func ("/ibus/engine-switch/context-engine-set-by-global",
Packit 3ff832
                     test_context_engine_set_by_global);
Packit 3ff832
    g_test_add_func ("/ibus/engine-switch/context-engine-set-by-focus",
Packit 3ff832
                     test_context_engine_set_by_focus);
Packit 3ff832
Packit 3ff832
    result = g_test_run ();
Packit 3ff832
    g_object_unref (bus);
Packit 3ff832
Packit 3ff832
    return result;
Packit 3ff832
}