Added test case test-sqlite-cursor-set-target.c
[platform/upstream/evolution-data-server.git] / tests / libedata-book / test-sqlite-cursor-set-target.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2
3 #include <stdlib.h>
4 #include <locale.h>
5 #include <libebook/libebook.h>
6
7 #include "data-test-utils.h"
8
9 /* Optimize queries, just so we can run with BOOKSQL_DEBUG=2 and check the
10  * indexes are properly leverage for cursor queries
11  */
12 static void
13 setup_custom_book (ESource            *scratch,
14                    ETestServerClosure *closure)
15 {
16         ESourceBackendSummarySetup *setup;
17
18         g_type_class_unref (g_type_class_ref (E_TYPE_SOURCE_BACKEND_SUMMARY_SETUP));
19         setup = e_source_get_extension (scratch, E_SOURCE_EXTENSION_BACKEND_SUMMARY_SETUP);
20         e_source_backend_summary_setup_set_summary_fields (setup,
21                                                            E_CONTACT_FAMILY_NAME,
22                                                            E_CONTACT_GIVEN_NAME,
23                                                            E_CONTACT_EMAIL,
24                                                            0);
25         e_source_backend_summary_setup_set_indexed_fields (setup,
26                                                            E_CONTACT_FAMILY_NAME, E_BOOK_INDEX_PREFIX,
27                                                            E_CONTACT_GIVEN_NAME, E_BOOK_INDEX_PREFIX,
28                                                            E_CONTACT_EMAIL, E_BOOK_INDEX_PREFIX,
29                                                            0);
30 }
31
32 static ETestServerClosure book_closure = { E_TEST_SERVER_ADDRESS_BOOK, setup_custom_book, 0 };
33
34 typedef struct {
35         ESqliteDBFixture parent_fixture;
36
37         EbSdbCursor  *cursor;
38
39         EContact *contacts[11];
40 } CursorFixture;
41
42 static void
43 cursor_fixture_setup (CursorFixture *fixture,
44                       gconstpointer  user_data)
45 {
46         EContactField sort_fields[] = { E_CONTACT_FAMILY_NAME, E_CONTACT_GIVEN_NAME };
47         EBookSortType sort_types[] = { E_BOOK_SORT_ASCENDING, E_BOOK_SORT_ASCENDING };
48         GError       *error = NULL;
49         EBookClient  *book_client;
50         EContact    **it = fixture->contacts;
51
52         e_sqlitedb_fixture_setup ((ESqliteDBFixture *)fixture, user_data);
53
54         book_client = E_TEST_SERVER_UTILS_SERVICE (fixture, EBookClient);
55
56         /* Add contacts... */
57         if (/* N:Jackson;Micheal */
58             !add_contact_from_test_case_verify (book_client, "sorted-1", it++) ||
59             /* N:Jackson;Janet */
60             !add_contact_from_test_case_verify (book_client, "sorted-2", it++) ||
61             /* N:Brown;Bobby */
62             !add_contact_from_test_case_verify (book_client, "sorted-3", it++) ||
63             /* N:Brown;Big Bobby */
64             !add_contact_from_test_case_verify (book_client, "sorted-4", it++) ||
65             /* N:Brown;James */
66             !add_contact_from_test_case_verify (book_client, "sorted-5", it++) ||
67             /* N:%Strange Name;Mister */
68             !add_contact_from_test_case_verify (book_client, "sorted-6", it++) ||
69             /* N:Goose;Purple */
70             !add_contact_from_test_case_verify (book_client, "sorted-7", it++) ||
71             /* N:Pony;Purple */
72             !add_contact_from_test_case_verify (book_client, "sorted-8", it++) ||
73             /* N:Pony;Pink */
74             !add_contact_from_test_case_verify (book_client, "sorted-9", it++) ||
75             /* N:J;Mister */
76             !add_contact_from_test_case_verify (book_client, "sorted-10", it++) ||
77             /* FN:Ye Nameless One */
78             !add_contact_from_test_case_verify (book_client, "sorted-11", it++)) {
79                 g_error ("Failed to add contacts");
80         }
81
82         fixture->cursor = e_book_backend_sqlitedb_cursor_new (((ESqliteDBFixture *) fixture)->ebsdb,
83                                                               SQLITEDB_FOLDER_ID,
84                                                               NULL, sort_fields, sort_types, 2, &error);
85
86         g_assert (fixture->cursor != NULL);
87 }
88
89 static void
90 cursor_fixture_teardown (CursorFixture *fixture,
91                          gconstpointer  user_data)
92 {
93         gint i;
94
95         for (i = 0; i < G_N_ELEMENTS (fixture->contacts); ++i) {
96                 if (fixture->contacts[i])
97                         g_object_unref (fixture->contacts[i]);
98         }
99
100         e_book_backend_sqlitedb_cursor_free (((ESqliteDBFixture *) fixture)->ebsdb, fixture->cursor);
101         e_sqlitedb_fixture_teardown ((ESqliteDBFixture *)fixture, user_data);
102 }
103
104 /*****************************************************
105  *          Expect the same results twice            *
106  *****************************************************/
107 static void
108 test_cursor_set_target_reset_cursor (CursorFixture *fixture,
109                                      gconstpointer  user_data)
110 {
111         GSList *results;
112         GError *error = NULL;
113
114         /* First batch */
115         results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
116                                                           fixture->cursor, 5, &error);
117
118         if (error)
119                 g_error ("Error fetching cursor results: %s", error->message);
120
121         print_results (results);
122
123         g_assert_cmpint (g_slist_length (results), ==, 5);
124
125         /* Assert that we got the results ordered as:
126          *   "Big Bobby Brown"
127          *   "Bobby Brown"
128          *   "James Brown"
129          */
130         assert_contacts_order (results,
131                                e_contact_get_const (fixture->contacts[3], E_CONTACT_UID),
132                                e_contact_get_const (fixture->contacts[2], E_CONTACT_UID),
133                                e_contact_get_const (fixture->contacts[4], E_CONTACT_UID),
134                                NULL);
135
136         g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
137         g_slist_free (results);
138
139         /* Reset cursor */
140         e_book_backend_sqlitedb_cursor_set_target (((ESqliteDBFixture *) fixture)->ebsdb,
141                                                    fixture->cursor,
142                                                    NULL);
143
144         /* Second batch */
145         results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
146                                                           fixture->cursor, 5, &error);
147
148         if (error)
149                 g_error ("Error fetching cursor results: %s", error->message);
150
151         print_results (results);
152
153         g_assert_cmpint (g_slist_length (results), ==, 5);
154
155         /* Assert that we got the results ordered as:
156          *   "Big Bobby Brown"
157          *   "Bobby Brown"
158          *   "James Brown"
159          */
160         assert_contacts_order (results,
161                                e_contact_get_const (fixture->contacts[3], E_CONTACT_UID),
162                                e_contact_get_const (fixture->contacts[2], E_CONTACT_UID),
163                                e_contact_get_const (fixture->contacts[4], E_CONTACT_UID),
164                                NULL);
165
166         g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
167         g_slist_free (results);
168 }
169
170 /*****************************************************
171  * Expect results with family name starting with 'J' *
172  *****************************************************/
173 static void
174 test_cursor_set_target_j_next_results (CursorFixture *fixture,
175                                        gconstpointer  user_data)
176 {
177         GSList *results;
178         GError *error = NULL;
179
180         /* Set the cursor at the start of family names beginning with 'J' */
181         e_book_backend_sqlitedb_cursor_set_target (((ESqliteDBFixture *) fixture)->ebsdb,
182                                                    fixture->cursor, "J", NULL);
183
184         results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
185                                                           fixture->cursor, 3, &error);
186
187         if (error)
188                 g_error ("Error fetching cursor results: %s", error->message);
189
190         print_results (results);
191
192         g_assert_cmpint (g_slist_length (results), ==, 3);
193
194         /* Assert that we got the results ordered as:
195          *   "Mister J"
196          *   "Janet Jackson"
197          *   "Micheal Jackson"
198          */
199         assert_contacts_order (results,
200                                e_contact_get_const (fixture->contacts[9], E_CONTACT_UID),
201                                e_contact_get_const (fixture->contacts[1], E_CONTACT_UID),
202                                e_contact_get_const (fixture->contacts[0], E_CONTACT_UID),
203                                NULL);
204
205         g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
206         g_slist_free (results);
207 }
208
209 /*****************************************************
210  *       Expect results before the letter 'J'        *
211  *****************************************************/
212 static void
213 test_cursor_set_target_j_prev_results (CursorFixture *fixture,
214                                        gconstpointer  user_data)
215 {
216         GSList *results;
217         GError *error = NULL;
218
219         /* Set the cursor at the start of family names beginning with 'J' */
220         e_book_backend_sqlitedb_cursor_set_target (((ESqliteDBFixture *) fixture)->ebsdb,
221                                                    fixture->cursor, "J", NULL);
222
223         results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
224                                                           fixture->cursor, -5, &error);
225
226         if (error)
227                 g_error ("Error fetching cursor results: %s", error->message);
228
229         print_results (results);
230
231         g_assert_cmpint (g_slist_length (results), ==, 5);
232
233         /* Assert that we got the results ordered as:
234          *   "James Brown"
235          *   "Bobby Brown"
236          *   "Big Bobby Brown"
237          */
238         assert_contacts_order (results,
239                                e_contact_get_const (fixture->contacts[4], E_CONTACT_UID),
240                                e_contact_get_const (fixture->contacts[2], E_CONTACT_UID),
241                                e_contact_get_const (fixture->contacts[3], E_CONTACT_UID),
242                                NULL);
243
244         g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
245         g_slist_free (results);
246 }
247
248 /*****************************************************
249  *       Expect results after Bobby Brown            *
250  *****************************************************/
251 static void
252 test_cursor_set_target_bobby_brown_next_results (CursorFixture *fixture,
253                                                  gconstpointer  user_data)
254 {
255         GSList *results;
256         GError *error = NULL;
257
258         /* Set the cursor to point exactly to Bobby Brown */
259         e_book_backend_sqlitedb_cursor_set_target_contact (((ESqliteDBFixture *) fixture)->ebsdb,
260                                                            fixture->cursor,
261                                                            fixture->contacts[2]);
262
263         results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
264                                                           fixture->cursor, 5, &error);
265
266         if (error)
267                 g_error ("Error fetching cursor results: %s", error->message);
268
269         print_results (results);
270
271         g_assert_cmpint (g_slist_length (results), ==, 5);
272
273         /* Assert that we got the results ordered as:
274          *   "James Brown"
275          *   "Purple Goose"
276          *   "Mister J"
277          *   "Janet Jackson"
278          *   "Micheal Jackson"
279          */
280         assert_contacts_order (results,
281                                e_contact_get_const (fixture->contacts[4], E_CONTACT_UID),
282                                e_contact_get_const (fixture->contacts[6], E_CONTACT_UID),
283                                e_contact_get_const (fixture->contacts[9], E_CONTACT_UID),
284                                e_contact_get_const (fixture->contacts[1], E_CONTACT_UID),
285                                e_contact_get_const (fixture->contacts[0], E_CONTACT_UID),
286                                NULL);
287
288         g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
289         g_slist_free (results);
290 }
291
292 /*****************************************************
293  *       Expect results before Bobby Brown           *
294  *****************************************************/
295 static void
296 test_cursor_set_target_bobby_brown_prev_results (CursorFixture *fixture,
297                                                  gconstpointer  user_data)
298 {
299         GSList *results;
300         GError *error = NULL;
301
302         /* Set the cursor to point exactly to Bobby Brown */
303         e_book_backend_sqlitedb_cursor_set_target_contact (((ESqliteDBFixture *) fixture)->ebsdb,
304                                                            fixture->cursor,
305                                                            fixture->contacts[2]);
306
307         results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
308                                                           fixture->cursor, -5, &error);
309
310         if (error)
311                 g_error ("Error fetching cursor results: %s", error->message);
312
313         print_results (results);
314
315         g_assert_cmpint (g_slist_length (results), ==, 2);
316
317         /* Assert that we got the results ordered as:
318          *   "Big Bobby Brown"
319          *   "Ye Nameless One"
320          */
321         assert_contacts_order (results,
322                                e_contact_get_const (fixture->contacts[3], E_CONTACT_UID),
323                                e_contact_get_const (fixture->contacts[10], E_CONTACT_UID),
324                                NULL);
325
326         g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
327         g_slist_free (results);
328 }
329
330 gint
331 main (gint argc,
332       gchar **argv)
333 {
334 #if !GLIB_CHECK_VERSION (2, 35, 1)
335         g_type_init ();
336 #endif
337         g_test_init (&argc, &argv, NULL);
338
339         /* Ensure that the client and server get the same locale */
340         g_assert (g_setenv ("LC_ALL", "en_US.UTF-8", TRUE));
341         setlocale (LC_ALL, "");
342
343         g_test_add ("/EbSdbCursor/SetTarget/ResetCursor", CursorFixture, &book_closure,
344                     cursor_fixture_setup, test_cursor_set_target_reset_cursor, cursor_fixture_teardown);
345         g_test_add ("/EbSdbCursor/SetTarget/Partial-J/NextResults", CursorFixture, &book_closure,
346                     cursor_fixture_setup, test_cursor_set_target_j_next_results, cursor_fixture_teardown);
347         g_test_add ("/EbSdbCursor/SetTarget/Partial-J/PreviousResults", CursorFixture, &book_closure,
348                     cursor_fixture_setup, test_cursor_set_target_j_prev_results, cursor_fixture_teardown);
349         g_test_add ("/EbSdbCursor/SetTarget/Exactly-Bobby-Brown/NextResults", CursorFixture, &book_closure,
350                     cursor_fixture_setup, test_cursor_set_target_bobby_brown_next_results, cursor_fixture_teardown);
351         g_test_add ("/EbSdbCursor/SetTarget/Exactly-Bobby-Brown/PreviousResults", CursorFixture, &book_closure,
352                     cursor_fixture_setup, test_cursor_set_target_bobby_brown_prev_results, cursor_fixture_teardown);
353
354         return e_test_server_utils_run ();
355 }