Merge "custom eail widget implementation" into tizen
[platform/core/uifw/eail.git] / tests / eail_index_tc1.c
1 /*
2  * Tested interface: AtkObject
3  *
4  * Tested AtkObject: EailIndex
5  *
6  * Description: Test AtkObject interface
7  *
8  * Test input: accessible object representing EailIndex
9  *
10  * Expected test result: test should return 0 (success)
11  */
12
13 #include <Elementary.h>
14 #include <atk/atk.h>
15
16 #include "eail_test_utils.h"
17
18 #define INDEX_NAME "index"
19
20 INIT_TEST("EailIndex")
21
22 static void
23 _test_index_child_for_object(AtkObject *obj, int index)
24 {
25    g_assert(0 == atk_selection_get_selection_count(ATK_SELECTION(obj)));
26    g_assert(atk_selection_add_selection(ATK_SELECTION(obj), index));
27
28    g_assert(atk_selection_is_child_selected(ATK_SELECTION(obj), index));
29    g_assert(1 == atk_selection_get_selection_count(ATK_SELECTION(obj)));
30
31    g_assert(atk_selection_clear_selection(ATK_SELECTION(obj)));
32    g_assert(0 == atk_selection_get_selection_count(ATK_SELECTION(obj)));
33 }
34 static void
35 _do_test(AtkObject *obj)
36 {
37    int n_children = 0, i = 0;
38
39    g_assert(ATK_IS_OBJECT(obj));
40    atk_object_set_name(obj, INDEX_NAME"test");
41    g_assert_cmpstr(atk_object_get_name(obj), ==, INDEX_NAME"test");
42    atk_object_set_description(obj, "test");
43    g_assert_cmpstr(atk_object_get_description(obj), ==, "test");
44
45    g_assert(atk_object_get_role(obj) == ATK_ROLE_LIST);
46
47    eailu_test_atk_focus(obj, FALSE);
48    n_children = atk_object_get_n_accessible_children(obj);
49    /* there should be 13 index entries */
50    g_assert(13 == n_children);
51    for (i = 0; i < n_children; ++i)
52      {
53         _test_index_child_for_object(obj, i);
54      }
55
56    eailu_test_code_called = 1;
57 }
58
59 struct _Idx_Data_Type
60 {
61    Evas_Object *id;  /* Pointer to Index */
62    Elm_Object_Item *item; /* Item we use for search */
63 };
64 typedef struct _Idx_Data_Type Idx_Data_Type;
65
66 struct _api_data
67 {
68    unsigned int state;  /* What state we are testing       */
69    Idx_Data_Type dt;
70 };
71 typedef struct _api_data api_data;
72
73 enum _api_state
74 {
75    INDEX_LEVEL_SET,
76    INDEX_ACTIVE_SET,
77    INDEX_APPEND_RELATIVE,
78    INDEX_PREPEND,
79    INDEX_ITEM_DEL,
80    INDEX_ITEM_FIND,
81    INDEX_HORIZONTAL,
82    INDEX_INDICATOR_DISABLED,
83    INDEX_CLEAR,
84    API_STATE_LAST
85 };
86 typedef enum _api_state api_state;
87
88 static Elm_Genlist_Item_Class itci;
89 char *gli_text_get(void *data, Evas_Object *obj, const char *part )
90 {
91    char buf[256];
92    int j = (uintptr_t)data;
93    g_snprintf(buf, sizeof(buf), "%c%c",
94             'A' + ((j >> 4) & 0xf),
95             'a' + ((j     ) & 0xf)
96             );
97    return strdup(buf);
98 }
99
100 void
101 _index_delay_changed_cb(void *data, Evas_Object *obj, void *event_info)
102 {
103    // called on a change but delayed in case multiple changes happen in a
104    // short timespan
105    elm_genlist_item_bring_in(elm_object_item_data_get(event_info),
106                               ELM_GENLIST_ITEM_SCROLLTO_TOP);
107 }
108
109 void
110 _index_changed_cb(void *data, Evas_Object *obj, void *event_info)
111 {
112    // this is called on every change, no matter how often
113 }
114
115 void
116 _index_selected_cb(void *data, Evas_Object *obj, void *event_info)
117 {
118    // called on final select
119    const Elm_Object_Item *item = elm_index_selected_item_get(obj, 0);
120    _printf("Index selected %s\n", elm_index_item_letter_get(item));
121    elm_genlist_item_bring_in(elm_object_item_data_get(event_info),
122                               ELM_GENLIST_ITEM_SCROLLTO_TOP);
123 }
124
125 static void
126 _cleanup_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
127 {
128    free(data);
129 }
130
131 static void
132 id_cb(void *data, Evas_Object *obj, void *event_info)
133 {
134    printf("Current Index : %s\n", elm_index_item_letter_get((const Elm_Object_Item *)event_info));
135 }
136
137 static void
138 _init_index(Evas_Object *win)
139 {
140    Evas_Object *bxx, *gl, *id;
141    Elm_Object_Item *glit;
142    int i, j;
143    api_data *api = calloc(1, sizeof(api_data));
144
145    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
146
147    bxx = elm_box_add(win);
148    elm_win_resize_object_add(win, bxx);
149    evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
150    evas_object_show(bxx);
151
152    gl = elm_genlist_add(win);
153    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
154    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
155    evas_object_show(gl);
156
157    api->dt.id = id = elm_index_add(win);
158    evas_object_size_hint_weight_set(id, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
159    evas_object_size_hint_align_set(id, EVAS_HINT_FILL, EVAS_HINT_FILL);
160    elm_win_resize_object_add(win, id);
161
162    evas_object_show(id);
163
164    itci.item_style     = "default";
165    itci.func.text_get = gli_text_get;
166    itci.func.content_get  = NULL;
167    itci.func.state_get = NULL;
168    itci.func.del       = NULL;
169
170    j = 0;
171    for (i = 0; i < 100; i++)
172      {
173         glit = elm_genlist_item_append(gl, &itci,
174                                        (void *)(uintptr_t)j/* item data */,
175                                        NULL/* parent */,
176                                        ELM_GENLIST_ITEM_NONE,
177                                        NULL/* func */, NULL/* func data */);
178         if (!(j & 0xf))
179           {
180              char buf[32];
181
182              g_snprintf(buf, sizeof(buf), "%c", 'A' + ((j >> 4) & 0xf));
183              elm_index_item_append(id, buf, id_cb, glit);
184              if (*buf == 'G')  /* Just init dt->item later used in API test */
185                api->dt.item = glit;
186           }
187         j += 2;
188      }
189    evas_object_smart_callback_add(id, "delay,changed", _index_delay_changed_cb, NULL);
190    evas_object_smart_callback_add(id, "changed", _index_changed_cb, NULL);
191    evas_object_smart_callback_add(id, "selected", _index_selected_cb, NULL);
192    elm_index_level_go(id, 0);
193
194    elm_box_pack_end(bxx, gl);
195
196    evas_object_show(id);
197
198    evas_object_resize(win, 320, 250);
199 }
200
201 EAPI_MAIN int
202 elm_main(int argc, char **argv)
203 {
204    Evas_Object *win;
205
206    win = eailu_create_test_window_with_glib_init(_on_done, _on_focus_in);
207    _init_index(win);
208
209    evas_object_show(win);
210
211    elm_run();
212    elm_shutdown();
213
214    /* exit code */
215    return 0;
216 }
217 ELM_MAIN()