1 /*
2  * TODO:
3  * * Test different font loading mechanisms.
4  */
5 
6 #ifdef HAVE_CONFIG_H
7 # include "config.h"
8 #endif
9 
10 #include <stdio.h>
11 
12 #include <Eina.h>
13 #include <Evas.h>
14 #include <Ecore_Evas.h>
15 
16 #include "evas_suite.h"
17 #include "evas_tests_helpers.h"
18 
19 #define TEST_FONT_SOURCE TESTS_SRC_DIR "/fonts/TestFont.eet"
20 #define TEST_TEXTBLOCK_FONT "font=DejaVuSans font_source=" TEST_FONT_SOURCE
21 #define TEST_TEXTBLOCK_FONT_SIZE "14"
22 #define TEST_TEXT_FONT "DejaVuSans,UnDotum"
23 #define TEST_TEXT_FONT_SIZE 14
24 
25 static const char *style_buf =
26    "DEFAULT='" TEST_TEXTBLOCK_FONT " font_size="TEST_TEXTBLOCK_FONT_SIZE" color=#000 text_class=entry'"
27    "newline='br'"
28    "b='+ font_weight=bold'";
29 
30 #define START_EVAS_OBJECT_SMART_TEST() \
31    Evas *evas; \
32    Evas_Object *smart_obj; \
33    evas = EVAS_TEST_INIT_EVAS(); \
34    smart_obj = evas_object_box_add(evas); \
35    fail_if(!smart_obj); \
36 do \
37 { \
38 } \
39 while (0)
40 
41 #define END_EVAS_OBJECT_SMART_TEST() \
42 do \
43 { \
44    evas_object_del(smart_obj); \
45    evas_free(evas); \
46 } \
47 while (0)
48 
49 #define ADD_EVAS_TEXTBLOCK() \
50    Evas_Object *tb; \
51    Evas_Textblock_Style *st; \
52    Evas_Textblock_Cursor *cur; \
53    evas_font_hinting_set(evas, EVAS_FONT_HINTING_AUTO); \
54    tb = evas_object_textblock_add(evas); \
55    fail_if(!tb); \
56    evas_object_textblock_legacy_newline_set(tb, EINA_FALSE); \
57    st = evas_textblock_style_new(); \
58    fail_if(!st); \
59    evas_textblock_style_set(st, style_buf); \
60    fail_if(strcmp(style_buf, evas_textblock_style_get(st))); \
61    evas_object_textblock_style_set(tb, st); \
62    cur = evas_object_textblock_cursor_new(tb); \
63 do \
64 { \
65 } \
66 while (0)
67 
68 #define ADD_EVAS_TEXT() \
69    Evas_Object *to; \
70    evas_font_hinting_set(evas, EVAS_FONT_HINTING_AUTO); \
71    to = evas_object_text_add(evas); \
72    fail_if(!to); \
73    evas_object_text_font_source_set(to, TEST_FONT_SOURCE); \
74    evas_object_text_font_set(to, TEST_TEXT_FONT, TEST_TEXT_FONT_SIZE); \
75 do \
76 { \
77 } \
78 while (0)
79 
80 #define DELETE_EVAS_TEXTBLOCK() \
81 do \
82 { \
83    evas_textblock_cursor_free(cur); \
84    evas_object_del(tb); \
85    evas_textblock_style_free(st); \
86 } \
87 while (0)
88 
89 #define DELETE_EVAS_TEXT() \
90 do \
91 { \
92    evas_object_del(to); \
93 } \
94 while (0)
95 
EFL_START_TEST(evas_object_smart_paragraph_direction)96 EFL_START_TEST(evas_object_smart_paragraph_direction)
97 {
98    START_EVAS_OBJECT_SMART_TEST();
99 
100    ADD_EVAS_TEXTBLOCK();
101    evas_object_resize(tb, 500, 500);
102    evas_object_textblock_text_markup_set(tb, "%^&amp;");
103    fail_if(strcmp(evas_object_textblock_text_markup_get(tb), "%^&amp;"));
104    evas_object_paragraph_direction_set(tb, EVAS_BIDI_DIRECTION_INHERIT);
105 
106    ADD_EVAS_TEXT();
107    evas_object_text_text_set(to, "%^&amp;");
108    fail_if(strcmp(evas_object_text_text_get(to), "%^&amp;"));
109    evas_object_paragraph_direction_set(to, EVAS_BIDI_DIRECTION_INHERIT);
110 
111    /* Test evas_object_paragraph_direction_set API with smart objects. */
112    Evas_Object *smart_child = evas_object_box_add(evas);
113    Evas_BiDi_Direction dir;
114    Evas_Coord x, y, w, h;
115    Evas_Coord xx, yy, ww, hh;
116 
117    evas_object_smart_member_add(smart_child, smart_obj);
118    evas_object_smart_member_add(tb, smart_child);
119    evas_object_smart_member_add(to, smart_child);
120 
121    dir = EVAS_BIDI_DIRECTION_RTL;
122    evas_textblock_cursor_geometry_get(cur, &x, &y, &w, &h, &dir,
123                                       EVAS_TEXTBLOCK_CURSOR_UNDER);
124    fail_if(dir == EVAS_BIDI_DIRECTION_RTL);
125    fail_if((Evas_BiDi_Direction)evas_object_text_direction_get(to) == EVAS_BIDI_DIRECTION_RTL);
126 
127    /* Change paragraph direction of smart parent object */
128    evas_object_paragraph_direction_set(smart_obj, EVAS_BIDI_DIRECTION_RTL);
129    dir = EVAS_BIDI_DIRECTION_LTR;
130    evas_textblock_cursor_geometry_get(cur, &xx, &yy, &ww, &hh, &dir,
131                                       EVAS_TEXTBLOCK_CURSOR_UNDER);
132    fail_if(dir != EVAS_BIDI_DIRECTION_RTL);
133    fail_if((x >= xx) || (y != yy) || (w != ww) || (h != hh));
134    fail_if((Evas_BiDi_Direction)evas_object_text_direction_get(to) != EVAS_BIDI_DIRECTION_RTL);
135 
136    /* The paragraph direction of smart member object has to be reset
137       if smart member object is removed from smart parent. */
138    evas_object_smart_member_del(smart_child);
139 
140    dir = EVAS_BIDI_DIRECTION_RTL;
141    evas_textblock_cursor_geometry_get(cur, &x, &y, &w, &h, &dir,
142                                       EVAS_TEXTBLOCK_CURSOR_UNDER);
143    fail_if(dir == EVAS_BIDI_DIRECTION_RTL);
144    fail_if((x >= xx) || (y != yy) || (w != ww) || (h != hh));
145    fail_if((Evas_BiDi_Direction)evas_object_text_direction_get(to) == EVAS_BIDI_DIRECTION_RTL);
146 
147    /* The paragraph direction of smart member object has to be changed
148       if smart member object is appended to smart parent. */
149    evas_object_smart_member_add(smart_child, smart_obj);
150 
151    dir = EVAS_BIDI_DIRECTION_LTR;
152    evas_textblock_cursor_geometry_get(cur, &xx, &yy, &ww, &hh, &dir,
153                                       EVAS_TEXTBLOCK_CURSOR_UNDER);
154    fail_if(dir != EVAS_BIDI_DIRECTION_RTL);
155    fail_if((x >= xx) || (y != yy) || (w != ww) || (h != hh));
156    fail_if((Evas_BiDi_Direction)evas_object_text_direction_get(to) != EVAS_BIDI_DIRECTION_RTL);
157 
158    /* Ignore smart parent's paragraph direction */
159    evas_object_paragraph_direction_set(tb, EVAS_BIDI_DIRECTION_NEUTRAL);
160    evas_object_paragraph_direction_set(to, EVAS_BIDI_DIRECTION_NEUTRAL);
161    dir = EVAS_BIDI_DIRECTION_RTL;
162    evas_textblock_cursor_geometry_get(cur, &x, &y, &w, &h, &dir,
163                                       EVAS_TEXTBLOCK_CURSOR_UNDER);
164    fail_if(dir == EVAS_BIDI_DIRECTION_RTL);
165    fail_if((x >= xx) || (y != yy) || (w != ww) || (h != hh));
166    fail_if((Evas_BiDi_Direction)evas_object_text_direction_get(to) == EVAS_BIDI_DIRECTION_RTL);
167 
168    evas_object_smart_member_del(tb);
169    evas_object_smart_member_del(to);
170    evas_object_del(smart_child);
171 
172    DELETE_EVAS_TEXTBLOCK();
173    DELETE_EVAS_TEXT();
174    END_EVAS_OBJECT_SMART_TEST();
175 }
176 EFL_END_TEST
177 
178 
179 void
_move_cb(void * data EINA_UNUSED,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)180 _move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
181 {
182    ck_abort_msg("This function should be not called");
183 }
184 
EFL_START_TEST(evas_object_smart_clipped_smart_move)185 EFL_START_TEST(evas_object_smart_clipped_smart_move)
186 {
187    Evas *evas;
188    Evas_Smart *smart;
189    Evas_Object *smart_obj, *smart_child;
190 
191    evas = _setup_evas();
192 
193    Evas_Smart_Class sc = EVAS_SMART_CLASS_INIT_NAME_VERSION("MyClass");
194    evas_object_smart_clipped_smart_set(&sc);
195    sc.move = NULL;
196 
197    smart = evas_smart_class_new(&sc);
198    fail_if(!smart);
199 
200    smart_obj = evas_object_smart_add(evas, smart);
201    fail_if(!smart_obj);
202 
203    smart_child = evas_object_box_add(evas);
204    evas_object_smart_member_add(smart_child, smart_obj);
205 
206    evas_object_event_callback_add(smart_child, EVAS_CALLBACK_MOVE, _move_cb, NULL);
207    evas_object_move(smart_obj, 100, 100);
208 
209    evas_object_smart_member_del(smart_child);
210    evas_object_del(smart_child);
211    evas_object_del(smart_obj);
212    evas_free(evas);
213 }
214 EFL_END_TEST
215 
evas_test_object_smart(TCase * tc)216 void evas_test_object_smart(TCase *tc)
217 {
218    tcase_add_test(tc, evas_object_smart_paragraph_direction);
219    tcase_add_test(tc, evas_object_smart_clipped_smart_move);
220 }
221