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, "%^&");
103 fail_if(strcmp(evas_object_textblock_text_markup_get(tb), "%^&"));
104 evas_object_paragraph_direction_set(tb, EVAS_BIDI_DIRECTION_INHERIT);
105
106 ADD_EVAS_TEXT();
107 evas_object_text_text_set(to, "%^&");
108 fail_if(strcmp(evas_object_text_text_get(to), "%^&"));
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