--- /dev/null
+/*
+ * ISF(Input Service Framework)
+ *
+ * ISF is based on SCIM 1.4.7 and extended for supporting more mobile fitable.
+ * Copyright (c) 2012-2015 Samsung Electronics Co., Ltd.
+ *
+ * Contact: Jihoon Kim <jihoon48.kim@samsung.com>, Inhong Han <inhong1.han@samsung.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+#include <gtest/gtest.h>
+#include <Ecore_IMF.h>
+#include <Ecore_Evas.h>
+#include <Evas.h>
+#include <Ecore.h>
+
+#define WIDTH 480
+#define HEIGHT 800
+
+namespace {
+
+static bool callback_called = false;
+static Ecore_IMF_Input_Panel_State input_panel_state = ECORE_IMF_INPUT_PANEL_STATE_HIDE;
+
+static void STOP_LOOP();
+static void WAIT_FOR_CALLBACK();
+
+class EcoreIMFContextTest : public testing::Test {
+ public:
+ virtual void SetUp() {
+ setenv("ECORE_IMF_MODULE", "wayland", 1);
+ setenv("WAYLAND_DISPLAY", "wayland-0", 1);
+ setenv("XDG_RUNTIME_DIR", "/run", 1);
+
+ callback_called = false;
+ int ret;
+
+ ret = ecore_evas_init();
+ ASSERT_NE(ret, 0);
+
+ ret = ecore_imf_init();
+ ASSERT_NE(ret, 0);
+ }
+ virtual void TearDown() {
+ ecore_imf_shutdown();
+ ecore_evas_shutdown();
+ }
+
+ Ecore_Timer *timer_exit = nullptr;
+};
+
+static Eina_Bool _timeout_timer_cb(void *data)
+{
+ printf("timeout\n");
+ STOP_LOOP();
+
+ return ECORE_CALLBACK_DONE;
+}
+
+static void _input_panel_state_cb (void *data, Ecore_IMF_Context *ctx, int value)
+{
+ int x, y, w, h;
+
+ input_panel_state = (Ecore_IMF_Input_Panel_State)value;
+
+ if (value == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
+ ecore_imf_context_input_panel_geometry_get (ctx, &x, &y, &w, &h);
+ printf ("Input panel is shown. ctx : %p\n", ctx);
+ printf ("x : %d, y : %d, w : %d, h : %d\n", x, y, w, h);
+ } else if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
+ printf ("Input panel is hidden. ctx : %p\n", ctx);
+ } else if (value == ECORE_IMF_INPUT_PANEL_STATE_WILL_SHOW) {
+ printf ("Input panel will be shown. ctx : %p\n", ctx);
+ }
+
+ callback_called = true;
+
+ STOP_LOOP();
+}
+
+static void STOP_LOOP()
+{
+ ecore_main_loop_quit();
+}
+
+static void WAIT_FOR_CALLBACK()
+{
+ ecore_main_loop_begin();
+}
+
+/**
+ * @testcase ecore_imf_context_add_p
+ * @since 2.4
+ * @description Positive UTC of ecore_imf_context_add().
+ */
+TEST_F(EcoreIMFContextTest, utc_ecore_imf_context_add_p)
+{
+ const char *ctx_id = ecore_imf_context_default_id_get();
+ ASSERT_NE(ctx_id, nullptr);
+
+ Ecore_IMF_Context *ctx = ecore_imf_context_add(ctx_id);
+ EXPECT_NE(ctx, nullptr);
+}
+
+/**
+ * @testcase ecore_imf_context_add_n
+ * @since 2.4
+ * @description Negative UTC of ecore_imf_context_add().
+ */
+TEST_F(EcoreIMFContextTest, utc_ecore_imf_context_add_n)
+{
+ Ecore_IMF_Context *ctx = ecore_imf_context_add(NULL);
+ EXPECT_EQ(ctx, nullptr);
+}
+
+TEST_F(EcoreIMFContextTest, utc_ime_show_in_canvas)
+{
+ callback_called = false;
+ input_panel_state = ECORE_IMF_INPUT_PANEL_STATE_HIDE;
+
+ int ret = ecore_evas_init();
+ ASSERT_NE(ret, 0);
+
+ const char *ctx_id = ecore_imf_context_default_id_get();
+ ASSERT_NE(ctx_id, nullptr);
+
+ Ecore_IMF_Context *ctx = ecore_imf_context_add(ctx_id);
+ ASSERT_NE(ctx, nullptr);
+
+ Ecore_Evas *ee = ecore_evas_new(NULL, 0, 0, WIDTH, HEIGHT, NULL);
+ ASSERT_NE(ee, nullptr);
+
+ ecore_evas_show(ee);
+
+ Evas *evas = ecore_evas_get(ee);
+ ASSERT_NE(evas, nullptr);
+
+ evas_focus_in(evas);
+
+ Evas_Object *bg = evas_object_rectangle_add(evas);
+ evas_object_resize(bg, WIDTH, HEIGHT);
+ evas_object_color_set(bg, 255, 255, 255, 255);
+ evas_object_show(bg);
+
+ ecore_imf_context_client_canvas_set(ctx, evas);
+ ecore_imf_context_focus_in(ctx);
+
+ timer_exit = ecore_timer_add(1.5, _timeout_timer_cb, NULL);
+
+ ecore_imf_context_input_panel_event_callback_add(ctx, ECORE_IMF_INPUT_PANEL_STATE_EVENT, _input_panel_state_cb, NULL);
+
+ WAIT_FOR_CALLBACK();
+
+ if (bg)
+ evas_object_del(bg);
+
+ ecore_evas_free(ee);
+
+ EXPECT_EQ(callback_called, true);
+}
+
+TEST_F(EcoreIMFContextTest, utc_ime_show_in_canvas_no_window_show)
+{
+ callback_called = false;
+ input_panel_state = ECORE_IMF_INPUT_PANEL_STATE_HIDE;
+
+ int ret = ecore_evas_init();
+ ASSERT_NE(ret, 0);
+
+ const char *ctx_id = ecore_imf_context_default_id_get();
+ ASSERT_NE(ctx_id, nullptr);
+
+ Ecore_IMF_Context *ctx = ecore_imf_context_add(ctx_id);
+ ASSERT_NE(ctx, nullptr);
+
+ Ecore_Evas *ee = ecore_evas_new(NULL, 0, 0, WIDTH, HEIGHT, NULL);
+ ASSERT_NE(ee, nullptr);
+
+ Evas *evas = ecore_evas_get(ee);
+ ASSERT_NE(evas, nullptr);
+
+ evas_focus_in(evas);
+
+ Evas_Object *bg = evas_object_rectangle_add(evas);
+ evas_object_resize(bg, WIDTH, HEIGHT);
+ evas_object_color_set(bg, 255, 255, 255, 255);
+ evas_object_show(bg);
+
+ // no call ecore_evas_show() intentionally for testing
+
+ timer_exit = ecore_timer_add(1.5, _timeout_timer_cb, NULL);
+
+ ecore_imf_context_client_canvas_set(ctx, evas);
+ ecore_imf_context_focus_in(ctx);
+
+ ecore_imf_context_input_panel_event_callback_add(ctx, ECORE_IMF_INPUT_PANEL_STATE_EVENT, _input_panel_state_cb, NULL);
+
+ WAIT_FOR_CALLBACK();
+
+ Ecore_IMF_Input_Panel_State input_panel_state = ecore_imf_context_input_panel_state_get(ctx);
+
+ evas_object_del(bg);
+ ecore_evas_free(ee);
+
+ EXPECT_EQ(callback_called, false);
+ EXPECT_EQ(input_panel_state, ECORE_IMF_INPUT_PANEL_STATE_HIDE);
+}
+
+TEST_F(EcoreIMFContextTest, utc_ime_show_in_client_window)
+{
+ callback_called = false;
+ input_panel_state = ECORE_IMF_INPUT_PANEL_STATE_HIDE;
+
+ int ret = ecore_evas_init();
+ ASSERT_NE(ret, 0);
+
+ const char *ctx_id = ecore_imf_context_default_id_get();
+ ASSERT_NE(ctx_id, nullptr);
+
+ Ecore_IMF_Context *ctx = ecore_imf_context_add(ctx_id);
+ ASSERT_NE(ctx, nullptr);
+
+ Ecore_Evas *ee = ecore_evas_new(NULL, 0, 0, WIDTH, HEIGHT, NULL);
+ ASSERT_NE(ee, nullptr);
+
+ ecore_evas_show(ee);
+
+ Evas *evas = ecore_evas_get(ee);
+
+ Evas_Object *bg = evas_object_rectangle_add(evas);
+ evas_object_resize(bg, WIDTH, HEIGHT);
+ evas_object_color_set(bg, 255, 255, 255, 255);
+ evas_object_show(bg);
+
+ timer_exit = ecore_timer_add(1.5, _timeout_timer_cb, NULL);
+
+ ecore_imf_context_client_window_set(ctx, (void *)ecore_evas_window_get(ecore_evas_ecore_evas_get(evas)));
+ ecore_imf_context_focus_in(ctx);
+
+ ecore_imf_context_input_panel_event_callback_add(ctx, ECORE_IMF_INPUT_PANEL_STATE_EVENT, _input_panel_state_cb, NULL);
+
+ WAIT_FOR_CALLBACK();
+
+ evas_object_del(bg);
+ ecore_evas_free(ee);
+
+ EXPECT_EQ(callback_called, true);
+ EXPECT_EQ(input_panel_state, ECORE_IMF_INPUT_PANEL_STATE_SHOW);
+}
+
+} // namespace