1 #ifdef HAVE_CONFIG_H
2 # include "elementary_config.h"
3 #endif
4
5 #define EFL_ACCESS_OBJECT_BETA
6 #include <Efl_Ui.h>
7 #include <Elementary.h>
8 #include "elm_suite.h"
9
10 static const char pathfmt[] = ELM_IMAGE_DATA_DIR"/images/icon_%02d.png";
11 static const char invalid[] = "thereisnosuchimage.png";
12 #define MAX_IMAGE_ID 23
13
14 typedef struct _Test_Data Test_Data;
15 struct _Test_Data
16 {
17 int image_id;
18 int success;
19 };
20
21 static int
_file_to_memory(const char * filename,char ** result)22 _file_to_memory(const char *filename, char **result)
23 {
24 int size;
25 FILE *f;
26
27 f = fopen(filename, "rb");
28 if (f == NULL)
29 {
30 *result = NULL;
31 return -1;
32 }
33
34 fseek(f, 0, SEEK_END);
35 size = ftell(f);
36 fseek(f, 0, SEEK_SET);
37 *result = (char *)malloc(size + 1);
38 if ((size_t)size != fread(*result, sizeof(char), size, f))
39 {
40 free(*result);
41 fclose(f);
42 return -1;
43 }
44 fclose(f);
45 (*result)[size] = 0;
46 return size;
47 }
48
EFL_START_TEST(elm_image_legacy_type_check)49 EFL_START_TEST(elm_image_legacy_type_check)
50 {
51 Evas_Object *win, *image;
52 const char *type;
53
54 win = win_add(NULL, "image", ELM_WIN_BASIC);
55
56 image = elm_image_add(win);
57
58 type = elm_object_widget_type_get(image);
59 ck_assert(type != NULL);
60 ck_assert(!strcmp(type, "Elm_Image"));
61
62 type = evas_object_type_get(image);
63 ck_assert(type != NULL);
64 ck_assert(!strcmp(type, "elm_image"));
65
66 }
67 EFL_END_TEST
68
EFL_START_TEST(elm_atspi_role_get)69 EFL_START_TEST(elm_atspi_role_get)
70 {
71 Evas_Object *win, *image;
72 Efl_Access_Role role;
73
74 win = win_add(NULL, "image", ELM_WIN_BASIC);
75
76 image = elm_image_add(win);
77 role = efl_access_object_role_get(image);
78
79 ck_assert(role == EFL_ACCESS_ROLE_IMAGE);
80
81 }
82 EFL_END_TEST
83
84 static void
_async_error_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)85 _async_error_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
86 {
87 Test_Data *td = data;
88 char path[PATH_MAX];
89 sprintf(path, pathfmt, td->image_id);
90 elm_image_file_set(obj, path, NULL);
91
92 td->success = 1;
93 }
94
95 static void
_async_opened_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)96 _async_opened_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
97 {
98 Test_Data *td = data;
99 const char *ff, *kk, *r1, *r2;
100 char path[PATH_MAX];
101
102 sprintf(path, pathfmt, td->image_id);
103 elm_image_file_get(obj, &ff, &kk);
104 r1 = strrchr(ff, '/');
105 r2 = strrchr(path, '/');
106 ck_assert(eina_streq(r1, r2));
107 ck_assert(!kk);
108
109 fprintf(stderr, "opened: %s\n", ff);
110
111 if (td->image_id < MAX_IMAGE_ID / 2)
112 {
113 td->image_id++;
114 sprintf(path, pathfmt, td->image_id);
115 elm_image_file_set(obj, path, NULL);
116 return;
117 }
118 else if (td->image_id < MAX_IMAGE_ID)
119 {
120 // mini stress-test
121 for (; td->image_id < MAX_IMAGE_ID;)
122 {
123 sprintf(path, pathfmt, ++td->image_id);
124 elm_image_file_set(obj, path, NULL);
125 }
126 return;
127 }
128
129 if (td->success == 1)
130 td->success = 2;
131 }
132
133 static void
_async_ready_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)134 _async_ready_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
135 {
136 Test_Data *td = data;
137
138 const char *ff;
139 elm_image_file_get(obj, &ff, 0);
140 fprintf(stderr, "ready : %s\n", ff);
141 if (td->success == 2)
142 {
143 td->success = 3;
144 ecore_main_loop_quit();
145 }
146 }
147
148 static Eina_Bool
_timeout_cb(void * data)149 _timeout_cb(void *data)
150 {
151 Test_Data *td = data;
152
153 td->success = 0;
154 ecore_main_loop_quit();
155
156 return ECORE_CALLBACK_CANCEL;
157 }
158
EFL_START_TEST(elm_image_async_path)159 EFL_START_TEST(elm_image_async_path)
160 {
161 Evas_Object *win, *image;
162 Ecore_Timer *t;
163 Eina_Bool ok;
164 Test_Data td;
165
166 win = win_add(NULL, "image", ELM_WIN_BASIC);
167
168 td.success = 0;
169 td.image_id = 0;
170
171 image = elm_image_add(win);
172 elm_image_async_open_set(image, 1);
173 evas_object_smart_callback_add(image, "load,error", _async_error_cb, &td);
174 evas_object_smart_callback_add(image, "load,open", _async_opened_cb, &td);
175 evas_object_smart_callback_add(image, "load,ready", _async_ready_cb, &td);
176 evas_object_show(image);
177 ok = elm_image_file_set(image, invalid, NULL);
178 ck_assert(ok);
179
180 t = ecore_timer_add(10.0, _timeout_cb, &td);
181
182 elm_run();
183 ck_assert(td.success == 3);
184
185 ecore_timer_del(t);
186 }
187 EFL_END_TEST
188
EFL_START_TEST(elm_image_async_mmap)189 EFL_START_TEST(elm_image_async_mmap)
190 {
191 Evas_Object *win, *image;
192 Ecore_Timer *t;
193 Eina_Bool ok;
194 Test_Data td;
195 Eina_File *f;
196 char path[PATH_MAX];
197
198 win = win_add(NULL, "image", ELM_WIN_BASIC);
199
200 td.success = 1; // skip "error" case
201 td.image_id = 1;
202
203 sprintf(path, pathfmt, td.image_id);
204 f = eina_file_open(path, 0);
205 ck_assert(f);
206
207 image = elm_image_add(win);
208 elm_image_async_open_set(image, 1);
209 evas_object_smart_callback_add(image, "load,error", _async_error_cb, &td);
210 evas_object_smart_callback_add(image, "load,open", _async_opened_cb, &td);
211 evas_object_smart_callback_add(image, "load,ready", _async_ready_cb, &td);
212 evas_object_show(image);
213 ok = elm_image_mmap_set(image, f, NULL);
214 ck_assert(ok);
215
216 t = ecore_timer_add(10.0, _timeout_cb, &td);
217
218 elm_run();
219 ck_assert(td.success == 3);
220
221 eina_file_close(f);
222
223 ecore_timer_del(t);
224 }
225 EFL_END_TEST
226
EFL_START_TEST(elm_image_evas_object_color_set)227 EFL_START_TEST(elm_image_evas_object_color_set)
228 {
229 Evas_Object *win, *image;
230 int r = 128, g = 99, b = 3, a = 230;
231 int rr = 0, gg = 0, bb = 0, aa = 0;
232
233 win = win_add(NULL, "image", ELM_WIN_BASIC);
234
235 image = elm_image_add(win);
236 evas_object_color_set(image, r, g, b, a);
237 evas_object_color_get(image, &rr, &gg, &bb, &aa);
238 ck_assert(r == rr);
239 ck_assert(g == gg);
240 ck_assert(b == bb);
241 ck_assert(a == aa);
242 }
243 EFL_END_TEST
244
EFL_START_TEST(elm_image_evas_image_get)245 EFL_START_TEST(elm_image_evas_image_get)
246 {
247 Evas_Object *win, *image, *obj;
248
249 win = win_add(NULL, "image", ELM_WIN_BASIC);
250
251 image = elm_image_add(win);
252 obj = elm_image_object_get(image);
253
254 ck_assert(obj);
255 }
256 EFL_END_TEST
257
EFL_START_TEST(elm_image_test_memfile_set)258 EFL_START_TEST(elm_image_test_memfile_set)
259 {
260 Evas_Object *win, *image, *image2;
261 char *mem;
262 int size;
263 const char *file = NULL;
264 int error_called = 0;
265
266 win = win_add(NULL, "image", ELM_WIN_BASIC);
267
268 image = elm_image_add(win);
269 ck_assert(elm_image_file_set(image, ELM_IMAGE_DATA_DIR"/images/icon_01.png", NULL));
270 size = _file_to_memory(ELM_IMAGE_DATA_DIR"/images/icon_02.png", &mem);
271 ck_assert_int_ge(size, 0);
272 ck_assert(elm_image_memfile_set(image, mem, size, "png", NULL));
273 elm_image_file_get(image, &file, NULL);
274 ck_assert_str_ne(file, ELM_IMAGE_DATA_DIR"/images/icon_01.png");
275 ck_assert(elm_image_file_set(image, ELM_IMAGE_DATA_DIR"/images/icon_01.png", NULL));
276 elm_image_file_get(image, &file, NULL);
277 ck_assert_str_eq(file, ELM_IMAGE_DATA_DIR"/images/icon_01.png");
278
279 image2 = elm_image_add(win);
280 evas_object_smart_callback_add(image2, "load,ready", event_callback_that_quits_the_main_loop_when_called, NULL);
281 evas_object_smart_callback_add(image2, "load,error", event_callback_single_call_int_data, &error_called);
282 ck_assert(elm_image_memfile_set(image2, mem, size, "png", NULL));
283 ck_assert_int_eq(error_called, 0);
284 ecore_main_loop_begin();
285
286 ck_assert_int_eq(error_called, 0);
287 }
288 EFL_END_TEST
289
EFL_START_TEST(elm_image_test_scale_method)290 EFL_START_TEST(elm_image_test_scale_method)
291 {
292 Evas_Object *win, *image;
293 int w, h;
294
295 win = win_add(NULL, "image", ELM_WIN_BASIC);
296 evas_object_resize(win, 100, 100);
297
298 image = elm_image_add(win);
299 ck_assert(elm_image_file_set(image, ELM_IMAGE_DATA_DIR"/images/logo.png", NULL));
300 evas_object_size_hint_align_set(image, 0.5, 0.0);
301 efl_gfx_image_scale_method_set(image, EFL_GFX_IMAGE_SCALE_METHOD_FIT_WIDTH);
302 evas_object_resize(image, 100, 100);
303 evas_object_show(image);
304 evas_object_show(win);
305 get_me_to_those_events(win);
306 evas_object_geometry_get(image, NULL, NULL, &w, &h);
307 ck_assert_int_eq(w, 100);
308 ck_assert_int_eq(h, 100);
309 evas_object_geometry_get(elm_image_object_get(image), NULL, NULL, &w, &h);
310 ck_assert_int_eq(w, 100);
311 ck_assert_int_eq(h, 100);
312 }
313 EFL_END_TEST
314
315 #ifdef BUILD_LOADER_GIF
316 static void
_test_render(void * data,Evas * e EINA_UNUSED,void * event_info)317 _test_render(void *data, Evas *e EINA_UNUSED, void *event_info)
318 {
319 int *pass = data;
320 Evas_Event_Render_Post *ev = event_info;
321 *pass = eina_list_count(ev->updated_area);
322 ecore_main_loop_quit();
323 }
324
325 static void
_test_preload(void * data,Evas * e,Evas_Object * obj,void * event_info EINA_UNUSED)326 _test_preload(void *data, Evas *e, Evas_Object *obj, void *event_info EINA_UNUSED)
327 {
328 if (evas_object_image_load_error_get(obj) == EVAS_LOAD_ERROR_NONE)
329 evas_event_callback_add(e, EVAS_CALLBACK_RENDER_POST, _test_render, data);
330 else
331 ecore_main_loop_quit();
332 }
333
EFL_START_TEST(elm_image_test_gif)334 EFL_START_TEST(elm_image_test_gif)
335 {
336 Evas_Object *win, *image;
337 int pass = 0;
338
339 win = win_add(NULL, "image", ELM_WIN_BASIC);
340
341 image = elm_image_add(win);
342 evas_object_resize(win, 100, 100);
343 evas_object_resize(image, 100, 100);
344 evas_object_show(win);
345 evas_object_show(image);
346
347 get_me_to_those_events(win);
348 ck_assert(elm_image_file_set(image, ELM_IMAGE_DATA_DIR"/images/fire.gif", NULL));
349 elm_image_animated_set(image, EINA_TRUE);
350 elm_image_animated_play_set(image, EINA_TRUE);
351 evas_object_event_callback_add(elm_image_object_get(image), EVAS_CALLBACK_IMAGE_PRELOADED, _test_preload, &pass);
352 /* verify that we haven't tried to set a frame with index 0, as this is an error */
353 ck_assert_int_gt(evas_object_image_animated_frame_get(elm_image_object_get(image)), 0);
354 ecore_main_loop_begin();
355 ck_assert_int_gt(pass, 0);
356 }
357 EFL_END_TEST
358
359 #endif
360
elm_test_image(TCase * tc)361 void elm_test_image(TCase *tc)
362 {
363 tcase_add_test(tc, elm_image_legacy_type_check);
364 tcase_add_test(tc, elm_atspi_role_get);
365 tcase_add_test(tc, elm_image_async_path);
366 tcase_add_test(tc, elm_image_async_mmap);
367 tcase_add_test(tc, elm_image_evas_object_color_set);
368 tcase_add_test(tc, elm_image_evas_image_get);
369 tcase_add_test(tc, elm_image_test_memfile_set);
370 tcase_add_test(tc, elm_image_test_scale_method);
371 #ifdef BUILD_LOADER_GIF
372 tcase_add_test(tc, elm_image_test_gif);
373 #endif
374 }
375