1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4 
5 #include <unistd.h>
6 #include <stdio.h>
7 
8 #define EFL_GFX_FILTER_BETA
9 #define EFL_CANVAS_LAYOUT_BETA
10 
11 #include "edje_suite.h"
12 
13 #define EVAS_DATA_DIR TESTS_SRC_DIR "/../../lib/evas"
14 
15 static void
_message_signal_reply_cb(void * data,Evas_Object * obj EINA_UNUSED,const char * emission,const char * source)16 _message_signal_reply_cb(void *data, Evas_Object *obj EINA_UNUSED,
17                          const char *emission, const char *source)
18 {
19    int *id = data;
20 
21    fprintf(stderr, "source %s emit %s id %d\n", source, emission, *id);
22    fflush(stderr);
23    ck_assert_str_eq(source, "edc");
24    ck_assert_ptr_ne(emission, NULL);
25 
26    if (!strncmp(emission, "int set", 7))
27      ck_assert_str_eq(emission, "int set 7 12 42 255");
28    else if (!strncmp(emission, "int", 3))
29      ck_assert_str_eq(emission, "int 42");
30    else if (!strncmp(emission, "float", 5))
31      {
32         char buf[64];
33         sprintf(buf, "float %f", 0.12);
34         ck_assert_str_eq(emission, buf);
35      }
36    else if (!strncmp(emission, "str", 3))
37      ck_assert_str_eq(emission, "str hello world");
38    else ck_abort_msg("Invalid emission!");
39 
40    (*id)++;
41 }
42 
EFL_START_TEST(edje_test_message_send_legacy)43 EFL_START_TEST(edje_test_message_send_legacy)
44 {
45    Evas *evas;
46    Evas_Object *obj;
47    Edje_Message_Int msgi;
48    Edje_Message_Float msgf;
49    Edje_Message_String msgs;
50    Edje_Message_Int_Set *msgis;
51    int id = 0;
52 
53    /* Ugly calls to process:
54     *
55     * 1. Send edje message (async)
56     * 2. Process edje message (sync)
57     * 3. EDC program emits edje signal (async)
58     * 4. Process edje signal (sync)
59     * 5. Finally reached signal cb
60     */
61 
62    evas = _setup_evas();
63 
64    obj = edje_object_add(evas);
65    fail_unless(edje_object_file_set(obj, test_layout_get("test_messages.edj"), "test_group"));
66    edje_object_signal_callback_add(obj, "*", "edc", _message_signal_reply_cb, &id);
67 
68    msgs.str = "hello world";
69    edje_object_message_send(obj, EDJE_MESSAGE_STRING, 0, &msgs);
70    edje_message_signal_process();
71    ck_assert_int_eq(id, 1);
72 
73    msgi.val = 42;
74    edje_object_message_send(obj, EDJE_MESSAGE_INT, 1, &msgi);
75    edje_message_signal_process();
76    ck_assert_int_eq(id, 2);
77 
78    msgf.val = 0.12;
79    edje_object_message_send(obj, EDJE_MESSAGE_FLOAT, 2, &msgf);
80    edje_message_signal_process();
81    ck_assert_int_eq(id, 3);
82 
83    msgis = alloca(sizeof(*msgis) + 4 * sizeof(msgis->val));
84    msgis->count = 4;
85    msgis->val[0] = 7;
86    msgis->val[1] = 12;
87    msgis->val[2] = 42;
88    msgis->val[3] = 255;
89    edje_object_message_send(obj, EDJE_MESSAGE_INT_SET, 3, msgis);
90    edje_message_signal_process();
91    ck_assert_int_eq(id, 4);
92 
93    evas_object_del(obj);
94 
95 }
96 EFL_END_TEST
97 
EFL_START_TEST(edje_test_message_send_eo)98 EFL_START_TEST(edje_test_message_send_eo)
99 {
100    Evas *evas;
101    Evas_Object *obj;
102    Eina_Value v, *va;
103    int id = 0;
104 
105    evas = _setup_evas();
106 
107    obj = efl_add(EFL_CANVAS_LAYOUT_CLASS, evas,
108                  efl_file_set(efl_added, test_layout_get("test_messages.edj")),
109                  efl_file_key_set(efl_added, "test_group"));
110 
111    // FIXME: EO API HERE
112    edje_object_signal_callback_add(obj, "*", "edc", _message_signal_reply_cb, &id);
113 
114    // NOTE: edje_object_message_signal_process may or may not be in EO (TBD)
115 
116    eina_value_setup(&v, EINA_VALUE_TYPE_STRING);
117    eina_value_set(&v, "hello world");
118    efl_layout_signal_message_send(obj, 0, v);
119    eina_value_flush(&v);
120    edje_message_signal_process();
121    edje_object_calc_force(obj);
122    ck_assert_int_eq(id, 1);
123 
124    eina_value_setup(&v, EINA_VALUE_TYPE_INT);
125    eina_value_set(&v, 42);
126    efl_layout_signal_message_send(obj, 1, v);
127    eina_value_flush(&v);
128    edje_message_signal_process();
129    edje_object_calc_force(obj);
130    ck_assert_int_eq(id, 2);
131 
132    eina_value_setup(&v, EINA_VALUE_TYPE_FLOAT);
133    eina_value_set(&v, 0.12);
134    efl_layout_signal_message_send(obj, 2, v);
135    eina_value_flush(&v);
136    edje_message_signal_process();
137    edje_object_calc_force(obj);
138    ck_assert_int_eq(id, 3);
139 
140    va = eina_value_array_new(EINA_VALUE_TYPE_INT, 4);
141    eina_value_array_append(va, 7);
142    eina_value_array_append(va, 12);
143    eina_value_array_append(va, 42);
144    eina_value_array_append(va, 255);
145    efl_layout_signal_message_send(obj, 3, *va);
146    eina_value_free(va);
147    edje_message_signal_process();
148    edje_object_calc_force(obj);
149    ck_assert_int_eq(id, 4);
150 
151    efl_del(obj);
152 
153 }
154 EFL_END_TEST
155 
EFL_START_TEST(edje_test_signals)156 EFL_START_TEST(edje_test_signals)
157 {
158    Evas *evas;
159    Evas_Object *obj;
160    const char *state;
161 
162    evas = _setup_evas();
163 
164    obj = efl_add(EFL_CANVAS_LAYOUT_CLASS, evas,
165                  efl_file_set(efl_added, test_layout_get("test_signals.edj")),
166                  efl_file_key_set(efl_added, "level1"),
167                  efl_gfx_entity_size_set(efl_added, EINA_SIZE2D(320, 240)),
168                  efl_gfx_entity_visible_set(efl_added, 1));
169 
170    edje_object_signal_emit(obj, "mouse,in", "text");
171 
172    edje_object_message_signal_process(obj);
173    state = edje_object_part_state_get(obj, "group:group:text", NULL);
174    ck_assert_str_eq(state, "default");
175 
176    edje_object_message_signal_process(obj);
177    state = edje_object_part_state_get(obj, "group:group:text", NULL);
178    ck_assert_str_eq(state, "default");
179 
180    edje_object_message_signal_recursive_process(obj);
181    state = edje_object_part_state_get(obj, "group:group:text", NULL);
182    ck_assert_str_eq(state, "over");
183 
184    efl_del(obj);
185 
186 }
187 EFL_END_TEST
188 
189 static int _signal_count;
190 
191 static void
_signal_callback_count_cb(void * data,Evas_Object * obj EINA_UNUSED,const char * emission EINA_UNUSED,const char * source EINA_UNUSED)192 _signal_callback_count_cb(void *data, Evas_Object *obj EINA_UNUSED,
193                          const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
194 {
195    int *_data = data;
196    _signal_count += *_data;
197 }
198 
EFL_START_TEST(edje_test_signal_callback_del_full)199 EFL_START_TEST(edje_test_signal_callback_del_full)
200 {
201    Evas *evas;
202    Evas_Object *obj;
203    int data[4] = { 1, 2, 4, 8 };
204 
205    evas = _setup_evas();
206 
207    obj = efl_add(EFL_CANVAS_LAYOUT_CLASS, evas,
208                  efl_file_set(efl_added,
209                  test_layout_get("test_signal_callback_del_full.edj")),
210                  efl_file_key_set(efl_added, "test"),
211                  efl_gfx_entity_size_set(efl_added, EINA_SIZE2D(320, 240)),
212                  efl_gfx_entity_visible_set(efl_added, 1));
213 
214    edje_object_signal_callback_add(obj, "some_signal", "event", _signal_callback_count_cb, &data[0]);
215    edje_object_signal_callback_add(obj, "some_signal", "event", _signal_callback_count_cb, &data[1]);
216    edje_object_signal_callback_add(obj, "some_signal", "event", _signal_callback_count_cb, &data[2]);
217    edje_object_signal_callback_add(obj, "some_signal", "event", _signal_callback_count_cb, &data[3]);
218 
219    edje_object_signal_callback_del_full(obj, "some_signal", "event", _signal_callback_count_cb, &data[0]);
220    edje_object_signal_callback_del_full(obj, "some_signal", "event", _signal_callback_count_cb, &data[3]);
221 
222    edje_object_signal_emit(obj, "some_signal", "event");
223 
224    edje_object_message_signal_process(obj);
225    ck_assert_int_eq(_signal_count, (data[1] + data[2]));
226 
227    efl_del(obj);
228 
229 }
230 EFL_END_TEST
231 
edje_test_signal(TCase * tc)232 void edje_test_signal(TCase *tc)
233 {
234    tcase_add_test(tc, edje_test_message_send_legacy);
235    tcase_add_test(tc, edje_test_message_send_eo);
236    tcase_add_test(tc, edje_test_signals);
237    tcase_add_test(tc, edje_test_signal_callback_del_full);
238 
239 }
240