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