efl
193 строки · 5.7 Кб
1#ifdef HAVE_CONFIG_H
2# include "elementary_config.h"
3#endif
4
5#include <Efl_Ui.h>
6#include "efl_ui_suite.h"
7#include "efl_ui_test_collection_common.h"
8
9Eo *position_manager;
10
11static Eo* win;
12
13static Eina_Array *arr_obj;
14static Eina_Inarray *arr_size;
15
16static void
17item_container_setup()
18{
19win = win_add();
20}
21
22static void
23item_container_teardown()
24{
25win = NULL;
26}
27
28static Efl_Ui_Position_Manager_Size_Batch_Result
29_size_accessor_get_at(void *data EINA_UNUSED, Efl_Ui_Position_Manager_Size_Call_Config conf, Eina_Rw_Slice memory)
30{
31int i;
32Efl_Ui_Position_Manager_Size_Batch_Entity *sizes = memory.mem;
33Efl_Ui_Position_Manager_Size_Batch_Result result = {0};
34
35for (i = conf.range.start_id; i < (int)(MIN(conf.range.end_id, eina_inarray_count(arr_size))); ++i)
36{
37Eina_Size2D *size = eina_inarray_nth(arr_size, i);
38
39sizes[i - conf.range.start_id].size = *size;
40sizes[i - conf.range.start_id].depth_leader = 0;
41sizes[i - conf.range.start_id].element_depth = 0;
42}
43result.filled_items = i - conf.range.start_id;
44result.parent_size = EINA_SIZE2D(0, 0);
45return result;
46}
47
48static Efl_Ui_Position_Manager_Object_Batch_Result
49_obj_accessor_get_at(void *data EINA_UNUSED, Efl_Ui_Position_Manager_Request_Range range, Eina_Rw_Slice memory)
50{
51int i;
52Efl_Ui_Position_Manager_Object_Batch_Entity *objs = memory.mem;
53Efl_Ui_Position_Manager_Object_Batch_Result result = {0};
54
55for (i = range.start_id; i < (int)(MIN(range.end_id, eina_array_count(arr_obj))); ++i)
56{
57Efl_Gfx_Entity *geom = eina_array_data_get(arr_obj, i);
58
59objs[i - range.start_id].entity = geom;
60objs[i - range.start_id].depth_leader = 0;
61objs[i - range.start_id].element_depth = 0;
62}
63result.filled_items = i - range.start_id;
64result.group = NULL;
65return result;
66}
67static void
68_initial_setup(void)
69{
70arr_obj = eina_array_new(10);
71arr_size = eina_inarray_new(sizeof(Eina_Size2D), 10);
72
73efl_ui_position_manager_data_access_v1_data_access_set(position_manager,
74win,
75NULL, _obj_accessor_get_at, NULL,
76NULL, _size_accessor_get_at, NULL,
770);
78}
79
80static int
81_add_item(Eo *obj, Eina_Size2D size)
82{
83int idx = eina_array_count(arr_obj);
84EINA_SAFETY_ON_FALSE_RETURN_VAL(eina_array_count(arr_obj) == eina_inarray_count(arr_size), -1);
85
86eina_array_push(arr_obj, (void*)0x1); //wtf
87eina_array_data_set(arr_obj, idx, obj);
88eina_inarray_push(arr_size, &size);
89
90
91efl_ui_position_manager_entity_item_added(position_manager, idx, obj);
92
93return idx;
94}
95
96static void
97_update_item(int index, Eo *obj, Eina_Size2D size)
98{
99Eina_Size2D *s;
100
101eina_array_data_set(arr_obj, index, obj);
102s = eina_inarray_nth(arr_size, index);
103*s = size;
104}
105
106static void
107_ticker(void *data EINA_UNUSED, const Efl_Event *ev EINA_UNUSED)
108{
109efl_loop_quit(efl_main_loop_get(), EINA_VALUE_EMPTY);
110}
111
112static void
113_iterate_a_few(void)
114{
115efl_add(EFL_LOOP_TIMER_CLASS, efl_main_loop_get(),
116efl_event_callback_add(efl_added, EFL_LOOP_TIMER_EVENT_TIMER_TICK, _ticker, NULL),
117efl_loop_timer_interval_set(efl_added, 0.1));
118efl_loop_begin(efl_main_loop_get());
119}
120
121EFL_START_TEST(no_crash1)
122{
123_initial_setup();
124
125//try to resize the viewport while we have no item
126efl_ui_position_manager_entity_viewport_set(position_manager, EINA_RECT(20, 20, 200, 200));
127_iterate_a_few();
128efl_ui_position_manager_entity_viewport_set(position_manager, EINA_RECT(20, 20, 0, 0));
129_iterate_a_few();
130_add_item(efl_add(EFL_UI_GRID_DEFAULT_ITEM_CLASS, win), EINA_SIZE2D(20, 20));
131_iterate_a_few();
132efl_ui_position_manager_entity_viewport_set(position_manager, EINA_RECT(20, 20, 200, 200));
133_iterate_a_few();
134efl_ui_position_manager_entity_viewport_set(position_manager, EINA_RECT(20, 20, 0, 0));
135_iterate_a_few();
136}
137EFL_END_TEST
138
139EFL_START_TEST(no_crash2)
140{
141_initial_setup();
142
143//try to resize the viewport while we have no item
144efl_ui_position_manager_entity_viewport_set(position_manager, EINA_RECT(20, 20, 200, 200));
145_iterate_a_few();
146efl_ui_position_manager_entity_viewport_set(position_manager, EINA_RECT(20, 20, 0, 0));
147_iterate_a_few();
148_add_item(NULL, EINA_SIZE2D(20, 20));
149_iterate_a_few();
150efl_ui_position_manager_entity_viewport_set(position_manager, EINA_RECT(20, 20, 0, 0));
151_iterate_a_few();
152efl_ui_position_manager_entity_viewport_set(position_manager, EINA_RECT(20, 20, 200, 200));
153_iterate_a_few();
154_update_item(0, efl_add(EFL_UI_GRID_DEFAULT_ITEM_CLASS, win), EINA_SIZE2D(20, 20));
155_iterate_a_few();
156}
157EFL_END_TEST
158
159static void
160_content_size_cb(void *data, const Efl_Event *ev)
161{
162Eina_Size2D *size = data;
163*size = *((Eina_Size2D*)ev->info);
164}
165
166EFL_START_TEST(viewport_newsize_event_result)
167{
168Eina_Size2D size = EINA_SIZE2D(-2, -2), min_size = EINA_SIZE2D(-2, -2);
169efl_event_callback_add(position_manager,
170EFL_UI_POSITION_MANAGER_ENTITY_EVENT_CONTENT_SIZE_CHANGED, _content_size_cb, &size);
171efl_event_callback_add(position_manager,
172EFL_UI_POSITION_MANAGER_ENTITY_EVENT_CONTENT_MIN_SIZE_CHANGED, _content_size_cb, &min_size);
173_initial_setup();
174_add_item(efl_add(EFL_UI_GRID_DEFAULT_ITEM_CLASS, win), EINA_SIZE2D(20, 20));
175_add_item(efl_add(EFL_UI_GRID_DEFAULT_ITEM_CLASS, win), EINA_SIZE2D(20, 30));
176
177efl_ui_position_manager_entity_viewport_set(position_manager, EINA_RECT(0, 0, 200, 200));
178_iterate_a_few();
179
180ck_assert_int_ne(size.w, -2);
181ck_assert_int_ne(size.h, -2);
182ck_assert_int_ne(min_size.w, -2);
183ck_assert_int_ne(min_size.h, -2);
184}
185EFL_END_TEST
186
187void efl_ui_test_position_manager_common_add(TCase *tc)
188{
189tcase_add_checked_fixture(tc, item_container_setup, item_container_teardown);
190tcase_add_test(tc, no_crash1);
191tcase_add_test(tc, no_crash2);
192tcase_add_test(tc, viewport_newsize_event_result);
193}
194