Merge "custom eail widget implementation" into tizen
[platform/core/uifw/eail.git] / tests / eail_genlist_tc3.c
1 /*
2  * Tested interface: AtkSelection
3  *
4  * Tested AtkObject: EailGenlist
5  *
6  * Description: Test AtkSelection interface
7  *
8  * Test input: accessible object representing EailGenlist
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 INIT_TEST("EailGenlist")
19
20 #define EAIL_TYPE_FOR_LIST_ITEM "EailItem"
21 #define N_ITEMS 18
22
23 static Evas_Object *glob_genlist = NULL;
24 static Elm_Genlist_Item_Class *_itc_group = NULL;
25 static int nitems = 0;
26
27 Elm_Object_Item *glob_test_item = NULL;
28
29 static void
30 _test_list_item_interfaces(AtkObject *item_object)
31 {
32    g_assert(ATK_IS_OBJECT(item_object));
33    g_assert(eailu_is_object_with_type(item_object, EAIL_TYPE_FOR_LIST_ITEM));
34
35    /**
36     * for single list items focusing does NOT work
37     */
38    eailu_test_atk_focus(item_object, FALSE);
39
40    g_assert(ATK_IS_ACTION(item_object));
41 }
42
43 static void
44 _test_item_selection_single(AtkObject *parent, AtkObject *child, int index)
45 {
46    g_assert(ATK_IS_SELECTION(parent));
47    /* in single selection mode it should return FALSE */
48    g_assert(!atk_selection_select_all_selection(ATK_SELECTION(parent)));
49    g_assert
50       (FALSE == atk_selection_is_child_selected(ATK_SELECTION(parent), index));
51
52    g_assert(atk_selection_add_selection(ATK_SELECTION(parent), index));
53    g_assert(atk_selection_is_child_selected(ATK_SELECTION(parent), index));
54    g_assert(1 == atk_selection_get_selection_count(ATK_SELECTION(parent)));
55
56    /* now removing selection using atk_selection interface */
57    g_assert(atk_selection_remove_selection(ATK_SELECTION(parent),index));
58    g_assert
59      (FALSE == atk_selection_is_child_selected(ATK_SELECTION(parent), index));
60    g_assert(0 == atk_selection_get_selection_count(ATK_SELECTION(parent)));
61 }
62
63 static void
64 _test_multiselection_list(AtkObject *atk_list)
65 {
66    elm_genlist_multi_select_set(glob_genlist, EINA_TRUE);
67    g_assert(atk_selection_select_all_selection(ATK_SELECTION(atk_list)));
68
69    /* all children should be now selected */
70    g_assert
71       (N_ITEMS == atk_selection_get_selection_count(ATK_SELECTION(atk_list)));
72
73    /* now clearing selection */
74    g_assert(atk_selection_clear_selection(ATK_SELECTION(atk_list)));
75    g_assert(0 == atk_selection_get_selection_count(ATK_SELECTION(atk_list)));
76 }
77
78 static void
79 _do_test(AtkObject *aobj)
80 {
81    int child_amount = 0, i = 0;
82
83    child_amount = atk_object_get_n_accessible_children(aobj);
84    g_assert(N_ITEMS == child_amount);
85
86    /* checking list items implementation */
87    for (i = 0; i < child_amount; i++)
88      {
89         AtkObject *child = atk_object_ref_accessible_child(aobj, i);
90         /* each list item has inside 2 text entry objects */
91
92         _test_list_item_interfaces(child);
93         _test_item_selection_single(aobj, child, i);
94
95         g_object_unref(child);
96      }
97
98    /* now quick check if multiselection on list works properly*/
99    _test_multiselection_list(aobj);
100    eailu_test_code_called = 1;
101 }
102
103 static char *
104 _item_label_get(void *data, Evas_Object *obj, const char *part)
105 {
106    time_t t = (time_t)ecore_time_unix_get();
107    char buf[256];
108    int i = (int)(long)data;
109    struct tm timeinfo;
110    localtime_r(&t, &timeinfo);
111
112    if (!strcmp(part, "elm.text"))
113      g_snprintf(buf, sizeof(buf), "Item # %i", i);
114    else
115      {
116         int n;
117         strftime(buf, sizeof(buf), "realized at %c", &timeinfo);
118         n = strlen(buf);
119         buf[n - 1] = '\0';
120      }
121
122    return strdup(buf);
123 }
124
125 static Evas_Object *
126 _item_content_get(void *data, Evas_Object *obj, const char *part)
127 {
128    Evas_Object *ic = elm_icon_add(obj);
129
130    if (!strcmp(part, "elm.swallow.icon"))
131      elm_icon_standard_set(ic, "clock");
132
133    evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
134    return ic;
135 }
136
137 static char *
138 _group_label_get(void *data, Evas_Object *obj, const char *part)
139 {
140    char buf[256];
141    int i = (int)(long)data;
142
143    g_snprintf(buf, sizeof(buf), "Group %d (item #%d)", i / 7, i);
144
145    return strdup(buf);
146 }
147
148 static Evas_Object *
149 _group_content_get(void *data, Evas_Object *obj, const char *part)
150 {
151    Evas_Object *ic = elm_icon_add(obj);
152
153    if (!strcmp(part, "elm.swallow.icon"))
154      elm_icon_standard_set(ic, "home");
155
156    evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
157    return ic;
158 }
159
160 static void
161 _item_sel_cb(void *data, Evas_Object *obj, void *event_info)
162 {
163 //   printf("sel item data [%p] on genlist obj [%p], item pointer [%p]\n",
164 //          data, obj, event_info);
165 }
166
167 void
168 _init_genlist(Evas_Object *win)
169 {
170    Evas_Object *box, *entry;
171    static Elm_Genlist_Item_Class *_itc = NULL;
172    int i = 0;
173
174    if (!_itc)
175      {
176         _itc = elm_genlist_item_class_new();
177         _itc->item_style = "default";
178         _itc->func.text_get = _item_label_get;
179         _itc->func.content_get = _item_content_get;
180         _itc->func.state_get = NULL;
181         _itc->func.del = NULL;
182      }
183
184    if (!_itc_group)
185      {
186         _itc_group = elm_genlist_item_class_new();
187         _itc_group->item_style = "group_index";
188         _itc_group->func.text_get = _group_label_get;
189         _itc_group->func.content_get = _group_content_get;
190         _itc_group->func.state_get = NULL;
191         _itc_group->func.del = NULL;
192      }
193
194    box = elm_box_add(win);
195    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
196    elm_win_resize_object_add(win, box);
197    evas_object_show(box);
198
199    glob_genlist = elm_genlist_add(win);
200
201    evas_object_size_hint_weight_set
202                            (glob_genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
203    evas_object_size_hint_align_set
204                                 (glob_genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
205    elm_box_pack_end(box, glob_genlist);
206    evas_object_show(glob_genlist);
207
208    entry = elm_entry_add(win);
209    elm_entry_single_line_set(entry, EINA_TRUE);
210    evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0.0);
211    evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
212    evas_object_show(entry);
213
214
215    /* filling genlist */
216    for (i = 0; i < N_ITEMS; i++)
217      {
218         Elm_Object_Item *gli = NULL, *glg = NULL;
219
220          if (i % 7 == 0)
221            {
222                glg = gli = elm_genlist_item_append(glob_genlist, _itc_group,
223                                                    (void *) (long) nitems++,
224                                                    NULL, ELM_GENLIST_ITEM_GROUP,
225                                                    _item_sel_cb, NULL );
226                elm_genlist_item_select_mode_set(
227                         gli, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
228            }
229          else
230            {
231                gli = elm_genlist_item_append(glob_genlist, _itc,
232                                              (void *) (long) nitems++, glg,
233                                              ELM_GENLIST_ITEM_NONE,
234                                              _item_sel_cb, NULL );
235            }
236
237          if (i == 1)
238            glob_test_item = gli;
239      }
240
241 }
242
243 EAPI_MAIN int
244 elm_main(int argc, char **argv)
245 {
246    Evas_Object *win;
247
248    win = eailu_create_test_window_with_glib_init(_on_done, _on_focus_in);
249    _init_genlist(win);
250
251    /* and show the window */
252    evas_object_show(win);
253
254    elm_run();
255    elm_shutdown();
256
257    /* exit code */
258    return 0;
259 }
260 ELM_MAIN()