Ported test-sqlite-cursor-calculate test to use the new ICU test data.
[platform/upstream/evolution-data-server.git] / tests / libedata-book / test-sqlite-cursor-calculate.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 static EbSdbCursorClosure book_closure = { { E_TEST_SERVER_ADDRESS_BOOK, e_sqlitedb_cursor_fixture_setup_book, 0 }, FALSE };
10
11 static void
12 test_cursor_calculate_initial (EbSdbCursorFixture *fixture,
13                                gconstpointer  user_data)
14 {
15         GError *error = NULL;
16         gint    position = 0, total = 0;
17
18         if (!e_book_backend_sqlitedb_cursor_calculate (((ESqliteDBFixture *) fixture)->ebsdb,
19                                                        fixture->cursor, &total, &position, &error))
20             g_error ("Error calculating cursor: %s", error->message);
21
22         g_assert_cmpint (position, ==, 0);
23         g_assert_cmpint (total, ==, 20);
24 }
25
26 static void
27 test_cursor_calculate_move_forward (EbSdbCursorFixture *fixture,
28                                     gconstpointer  user_data)
29 {
30         GSList *results;
31         GError *error = NULL;
32         gint    position = 0, total = 0;
33
34         /* Move cursor */
35         results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
36                                                           fixture->cursor, 5, &error);
37
38         if (error)
39                 g_error ("Error fetching cursor results: %s", error->message);
40
41         /* Assert the first 5 contacts in en_US order */
42         g_assert_cmpint (g_slist_length (results), ==, 5);
43         assert_contacts_order (results,
44                                "sorted-11",
45                                "sorted-1",
46                                "sorted-2",
47                                "sorted-5",
48                                "sorted-6",
49                                NULL);
50         g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
51         g_slist_free (results);
52
53         /* Check new position */
54         if (!e_book_backend_sqlitedb_cursor_calculate (((ESqliteDBFixture *) fixture)->ebsdb,
55                                                        fixture->cursor, &total, &position, &error))
56             g_error ("Error calculating cursor: %s", error->message);
57
58         /* results 0 + 5 = position 5, result index 4 (results[0, 1, 2, 3, 4]) */
59         g_assert_cmpint (position, ==, 5);
60         g_assert_cmpint (total, ==, 20);
61 }
62
63 static void
64 test_cursor_calculate_move_backwards (EbSdbCursorFixture *fixture,
65                                       gconstpointer  user_data)
66 {
67         GSList *results;
68         GError *error = NULL;
69         gint    position = 0, total = 0;
70
71         /* Move cursor */
72         results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
73                                                           fixture->cursor, -5, &error);
74
75         if (error)
76                 g_error ("Error fetching cursor results: %s", error->message);
77
78         /* Assert the last 5 contacts in en_US order */
79         g_assert_cmpint (g_slist_length (results), ==, 5);
80         assert_contacts_order (results,
81                                "sorted-20",
82                                "sorted-19",
83                                "sorted-9",
84                                "sorted-13",
85                                "sorted-12",
86                                NULL);
87         g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
88         g_slist_free (results);
89
90         /* Check new position */
91         if (!e_book_backend_sqlitedb_cursor_calculate (((ESqliteDBFixture *) fixture)->ebsdb,
92                                                        fixture->cursor, &total, &position, &error))
93             g_error ("Error calculating cursor: %s", error->message);
94
95         /* results 20 - 5 = position 16 result index 15 (results[20, 19, 18, 17, 16]) */
96         g_assert_cmpint (position, ==, 16);
97         g_assert_cmpint (total, ==, 20);
98 }
99
100 static void
101 test_cursor_calculate_back_and_forth (EbSdbCursorFixture *fixture,
102                                       gconstpointer  user_data)
103 {
104         GSList *results;
105         GError *error = NULL;
106         gint    position = 0, total = 0;
107
108         /* Move cursor */
109         results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
110                                                           fixture->cursor, 7, &error);
111
112         if (error)
113                 g_error ("Error fetching cursor results: %s", error->message);
114
115         g_assert_cmpint (g_slist_length (results), ==, 7);
116         g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
117         g_slist_free (results);
118
119         /* Check new position */
120         if (!e_book_backend_sqlitedb_cursor_calculate (((ESqliteDBFixture *) fixture)->ebsdb,
121                                                        fixture->cursor, &total, &position, &error))
122             g_error ("Error calculating cursor: %s", error->message);
123
124         /* results 0 + 7 = position 7 result index 6 (results[0, 1, 2, 3, 4, 5, 6]) */
125         g_assert_cmpint (position, ==, 7);
126         g_assert_cmpint (total, ==, 20);
127
128         /* Move cursor */
129         results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
130                                                           fixture->cursor, -4, &error);
131
132         if (error)
133                 g_error ("Error fetching cursor results: %s", error->message);
134
135         g_assert_cmpint (g_slist_length (results), ==, 4);
136         g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
137         g_slist_free (results);
138
139         /* Check new position */
140         if (!e_book_backend_sqlitedb_cursor_calculate (((ESqliteDBFixture *) fixture)->ebsdb,
141                                                        fixture->cursor, &total, &position, &error))
142             g_error ("Error calculating cursor: %s", error->message);
143
144         /* results 7 - 4 = position 3 result index 2 (results[5, 4, 3, 2]) */
145         g_assert_cmpint (position, ==, 3);
146         g_assert_cmpint (total, ==, 20);
147
148         /* Move cursor */
149         results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
150                                                           fixture->cursor, 5, &error);
151
152         if (error)
153                 g_error ("Error fetching cursor results: %s", error->message);
154
155         g_assert_cmpint (g_slist_length (results), ==, 5);
156         g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
157         g_slist_free (results);
158
159         /* Check new position */
160         if (!e_book_backend_sqlitedb_cursor_calculate (((ESqliteDBFixture *) fixture)->ebsdb,
161                                                        fixture->cursor, &total, &position, &error))
162             g_error ("Error calculating cursor: %s", error->message);
163
164         /* results 3 + 5 = position 8 result index 7 (results[3, 4, 5, 6, 7]) */
165         g_assert_cmpint (position, ==, 8);
166         g_assert_cmpint (total, ==, 20);
167 }
168
169 static void
170 test_cursor_calculate_exact_target (EbSdbCursorFixture *fixture,
171                                     gconstpointer  user_data)
172 {
173         GError *error = NULL;
174         gint    position = 0, total = 0;
175
176         /* Set the cursor to point exactly to blackbird */
177         e_book_backend_sqlitedb_cursor_set_target_contact (((ESqliteDBFixture *) fixture)->ebsdb,
178                                                            fixture->cursor, fixture->contacts[16 - 1]);
179
180         /* Check new position */
181         if (!e_book_backend_sqlitedb_cursor_calculate (((ESqliteDBFixture *) fixture)->ebsdb,
182                                                        fixture->cursor, &total, &position, &error))
183                 g_error ("Error calculating cursor: %s", error->message);
184
185         /* blackbird is at position 12 in en_US locale */
186         g_assert_cmpint (position, ==, 12);
187         g_assert_cmpint (total, ==, 20);
188 }
189
190 static void
191 test_cursor_calculate_partial_target (EbSdbCursorFixture *fixture,
192                                       gconstpointer  user_data)
193 {
194         GError *error = NULL;
195         gint    position = 0, total = 0;
196
197         /* Set the cursor to point to the beginning of "C" */
198         e_book_backend_sqlitedb_cursor_set_target (((ESqliteDBFixture *) fixture)->ebsdb,
199                                                    fixture->cursor, "C", NULL);
200
201         /* Check new position */
202         if (!e_book_backend_sqlitedb_cursor_calculate (((ESqliteDBFixture *) fixture)->ebsdb,
203                                                        fixture->cursor, &total, &position, &error))
204                 g_error ("Error calculating cursor: %s", error->message);
205
206         /* Position is 13, there are 13 contacts before the letter 'C' in en_US locale */
207         g_assert_cmpint (position, ==, 13);
208         g_assert_cmpint (total, ==, 20);
209 }
210
211 static void
212 test_cursor_calculate_after_modification (EbSdbCursorFixture *fixture,
213                                           gconstpointer  user_data)
214 {
215         EBookClient  *book_client;
216         GError *error = NULL;
217         gint    position = 0, total = 0;
218
219         book_client = E_TEST_SERVER_UTILS_SERVICE (fixture, EBookClient);
220
221         /* Set the cursor to point exactly to 'blackbird' */
222         e_book_backend_sqlitedb_cursor_set_target_contact (((ESqliteDBFixture *) fixture)->ebsdb,
223                                                            fixture->cursor, fixture->contacts[16 - 1]);
224
225         /* Check new position */
226         if (!e_book_backend_sqlitedb_cursor_calculate (((ESqliteDBFixture *) fixture)->ebsdb,
227                                                        fixture->cursor, &total, &position, &error))
228                 g_error ("Error calculating cursor: %s", error->message);
229
230         /* blackbird is at position 12 in en_US locale */
231         g_assert_cmpint (position, ==, 12);
232         g_assert_cmpint (total, ==, 20);
233
234         /* Rename Muffler -> Jacob Appelbaum */
235         e_contact_set (fixture->contacts[19 - 1], E_CONTACT_FAMILY_NAME, "Appelbaum");
236         e_contact_set (fixture->contacts[19 - 1], E_CONTACT_GIVEN_NAME, "Jacob");
237         if (!e_book_client_modify_contact_sync (book_client, fixture->contacts[19 - 1], NULL, &error))
238                 g_error ("modify contact sync: %s", error->message);
239
240         /* Rename Müller -> Sade Adu */
241         e_contact_set (fixture->contacts[20 - 1], E_CONTACT_FAMILY_NAME, "Adu");
242         e_contact_set (fixture->contacts[20 - 1], E_CONTACT_GIVEN_NAME, "Sade");
243         if (!e_book_client_modify_contact_sync (book_client, fixture->contacts[20 - 1], NULL, &error))
244                 g_error ("modify contact sync: %s", error->message);
245
246         /* Check new position */
247         if (!e_book_backend_sqlitedb_cursor_calculate (((ESqliteDBFixture *) fixture)->ebsdb,
248                                                        fixture->cursor, &total, &position, &error))
249                 g_error ("Error calculating cursor: %s", error->message);
250
251         /* blackbird is now at position 14 after moving 2 later contacts to begin with 'A' */
252         g_assert_cmpint (position, ==, 14);
253         g_assert_cmpint (total, ==, 20);
254 }
255
256 static void
257 test_cursor_calculate_filtered_initial (EbSdbCursorFixture *fixture,
258                                         gconstpointer  user_data)
259 {
260         GError *error = NULL;
261         gint    position = 0, total = 0;
262
263         if (!e_book_backend_sqlitedb_cursor_calculate (((ESqliteDBFixture *) fixture)->ebsdb,
264                                                        fixture->cursor, &total, &position, &error))
265             g_error ("Error calculating cursor: %s", error->message);
266
267         g_assert_cmpint (position, ==, 0);
268         g_assert_cmpint (total, ==, 13);
269 }
270
271 static void
272 test_cursor_calculate_filtered_move_forward (EbSdbCursorFixture *fixture,
273                                              gconstpointer  user_data)
274 {
275         GSList *results;
276         GError *error = NULL;
277         gint    position = 0, total = 0;
278
279         /* Move cursor */
280         results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
281                                                           fixture->cursor, 5, &error);
282
283         if (error)
284                 g_error ("Error fetching cursor results: %s", error->message);
285
286         g_assert_cmpint (g_slist_length (results), ==, 5);
287         g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
288         g_slist_free (results);
289
290         /* Check new position */
291         if (!e_book_backend_sqlitedb_cursor_calculate (((ESqliteDBFixture *) fixture)->ebsdb,
292                                                        fixture->cursor, &total, &position, &error))
293             g_error ("Error calculating cursor: %s", error->message);
294
295         /* results 0 + 5 = position 5, result index 4 (results[0, 1, 2, 3, 4]) */
296         g_assert_cmpint (position, ==, 5);
297         g_assert_cmpint (total, ==, 13);
298 }
299
300 static void
301 test_cursor_calculate_filtered_move_backwards (EbSdbCursorFixture *fixture,
302                                                gconstpointer  user_data)
303 {
304         GSList *results;
305         GError *error = NULL;
306         gint    position = 0, total = 0;
307
308         /* Move cursor */
309         results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
310                                                           fixture->cursor, -5, &error);
311
312         if (error)
313                 g_error ("Error fetching cursor results: %s", error->message);
314
315         g_assert_cmpint (g_slist_length (results), ==, 5);
316         g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
317         g_slist_free (results);
318
319         /* Check new position */
320         if (!e_book_backend_sqlitedb_cursor_calculate (((ESqliteDBFixture *) fixture)->ebsdb,
321                                                        fixture->cursor, &total, &position, &error))
322             g_error ("Error calculating cursor: %s", error->message);
323
324         /* results 13 - 5 = position 9 (results[13, 12, 11, 10, 9]) */
325         g_assert_cmpint (position, ==, 9);
326         g_assert_cmpint (total, ==, 13);
327 }
328
329 static void
330 test_cursor_calculate_filtered_exact_target (EbSdbCursorFixture *fixture,
331                                              gconstpointer  user_data)
332 {
333         GError *error = NULL;
334         gint    position = 0, total = 0;
335
336         /* Set the cursor to point exactly to 'blackbird' */
337         e_book_backend_sqlitedb_cursor_set_target_contact (((ESqliteDBFixture *) fixture)->ebsdb,
338                                                            fixture->cursor, fixture->contacts[16 - 1]);
339
340         /* Check new position */
341         if (!e_book_backend_sqlitedb_cursor_calculate (((ESqliteDBFixture *) fixture)->ebsdb,
342                                                        fixture->cursor, &total, &position, &error))
343                 g_error ("Error calculating cursor: %s", error->message);
344
345         /* 'blackbird' is the 8th contact with a .com email address in en_US locale */
346         g_assert_cmpint (position, ==, 8);
347         g_assert_cmpint (total, ==, 13);
348 }
349
350 static void
351 test_cursor_calculate_filtered_partial_target (EbSdbCursorFixture *fixture,
352                                                gconstpointer  user_data)
353 {
354         GError *error = NULL;
355         gint    position = 0, total = 0;
356
357         /* Set the cursor to point to the beginning of "C" */
358         e_book_backend_sqlitedb_cursor_set_target (((ESqliteDBFixture *) fixture)->ebsdb,
359                                                    fixture->cursor, "C", NULL);
360
361         /* Check new position */
362         if (!e_book_backend_sqlitedb_cursor_calculate (((ESqliteDBFixture *) fixture)->ebsdb,
363                                                        fixture->cursor, &total, &position, &error))
364                 g_error ("Error calculating cursor: %s", error->message);
365
366         /* There are 9 contacts before the letter 'C' in the en_US locale */
367         g_assert_cmpint (position, ==, 9);
368         g_assert_cmpint (total, ==, 13);
369 }
370
371 static void
372 test_cursor_calculate_filtered_after_modification (EbSdbCursorFixture *fixture,
373                                                    gconstpointer  user_data)
374 {
375         EBookClient  *book_client;
376         GError *error = NULL;
377         gint    position = 0, total = 0;
378
379         book_client = E_TEST_SERVER_UTILS_SERVICE (fixture, EBookClient);
380
381         /* Set the cursor to point exactly to 'blackbird' */
382         e_book_backend_sqlitedb_cursor_set_target_contact (((ESqliteDBFixture *) fixture)->ebsdb,
383                                                            fixture->cursor, fixture->contacts[16 - 1]);
384
385         /* 'blackbirds' -> Jacob Appelbaum */
386         e_contact_set (fixture->contacts[18 - 1], E_CONTACT_FAMILY_NAME, "Appelbaum");
387         e_contact_set (fixture->contacts[18 - 1], E_CONTACT_GIVEN_NAME, "Jacob");
388         if (!e_book_client_modify_contact_sync (book_client, fixture->contacts[18 - 1], NULL, &error))
389                 g_error ("modify contact sync: %s", error->message);
390
391         /* 'black-birds' -> Sade Adu */
392         e_contact_set (fixture->contacts[17 - 1], E_CONTACT_FAMILY_NAME, "Adu");
393         e_contact_set (fixture->contacts[17 - 1], E_CONTACT_GIVEN_NAME, "Sade");
394         if (!e_book_client_modify_contact_sync (book_client, fixture->contacts[17 - 1], NULL, &error))
395                 g_error ("modify contact sync: %s", error->message);
396
397         /* Check new position */
398         if (!e_book_backend_sqlitedb_cursor_calculate (((ESqliteDBFixture *) fixture)->ebsdb,
399                                                        fixture->cursor, &total, &position, &error))
400                 g_error ("Error calculating cursor: %s", error->message);
401
402         /* blackbird is now at position 11 after moving 2 later contacts to begin with 'A' */
403         g_assert_cmpint (position, ==, 9);
404         g_assert_cmpint (total, ==, 13);
405 }
406
407 gint
408 main (gint argc,
409       gchar **argv)
410 {
411 #if !GLIB_CHECK_VERSION (2, 35, 1)
412         g_type_init ();
413 #endif
414         g_test_init (&argc, &argv, NULL);
415
416         /* Ensure that the client and server get the same locale */
417         g_assert (g_setenv ("EDS_COLLATE", "en_US.UTF-8", TRUE));
418
419         g_test_add ("/EbSdbCursor/Calculate/Initial", EbSdbCursorFixture, &book_closure,
420                     e_sqlitedb_cursor_fixture_setup,
421                     test_cursor_calculate_initial,
422                     e_sqlitedb_cursor_fixture_teardown);
423         g_test_add ("/EbSdbCursor/Calculate/MoveForward", EbSdbCursorFixture, &book_closure,
424                     e_sqlitedb_cursor_fixture_setup,
425                     test_cursor_calculate_move_forward,
426                     e_sqlitedb_cursor_fixture_teardown);
427         g_test_add ("/EbSdbCursor/Calculate/MoveBackwards", EbSdbCursorFixture, &book_closure,
428                     e_sqlitedb_cursor_fixture_setup,
429                     test_cursor_calculate_move_backwards,
430                     e_sqlitedb_cursor_fixture_teardown);
431         g_test_add ("/EbSdbCursor/Calculate/BackAndForth", EbSdbCursorFixture, &book_closure,
432                     e_sqlitedb_cursor_fixture_setup,
433                     test_cursor_calculate_back_and_forth,
434                     e_sqlitedb_cursor_fixture_teardown);
435         g_test_add ("/EbSdbCursor/Calculate/ExactTarget", EbSdbCursorFixture, &book_closure,
436                     e_sqlitedb_cursor_fixture_setup,
437                     test_cursor_calculate_exact_target,
438                     e_sqlitedb_cursor_fixture_teardown);
439         g_test_add ("/EbSdbCursor/Calculate/PartialTarget", EbSdbCursorFixture, &book_closure,
440                     e_sqlitedb_cursor_fixture_setup,
441                     test_cursor_calculate_partial_target,
442                     e_sqlitedb_cursor_fixture_teardown);
443         g_test_add ("/EbSdbCursor/Calculate/AfterModification", EbSdbCursorFixture, &book_closure,
444                     e_sqlitedb_cursor_fixture_setup,
445                     test_cursor_calculate_after_modification,
446                     e_sqlitedb_cursor_fixture_teardown);
447
448         g_test_add ("/EbSdbCursor/Calculate/Filtered/Initial", EbSdbCursorFixture, &book_closure,
449                     e_sqlitedb_cursor_fixture_filtered_setup,
450                     test_cursor_calculate_filtered_initial,
451                     e_sqlitedb_cursor_fixture_teardown);
452         g_test_add ("/EbSdbCursor/Calculate/Filtered/MoveForward", EbSdbCursorFixture, &book_closure,
453                     e_sqlitedb_cursor_fixture_filtered_setup,
454                     test_cursor_calculate_filtered_move_forward,
455                     e_sqlitedb_cursor_fixture_teardown);
456         g_test_add ("/EbSdbCursor/Calculate/Filtered/MoveBackwards", EbSdbCursorFixture, &book_closure,
457                     e_sqlitedb_cursor_fixture_filtered_setup,
458                     test_cursor_calculate_filtered_move_backwards,
459                     e_sqlitedb_cursor_fixture_teardown);
460         g_test_add ("/EbSdbCursor/Calculate/Filtered/ExactTarget", EbSdbCursorFixture, &book_closure,
461                     e_sqlitedb_cursor_fixture_filtered_setup,
462                     test_cursor_calculate_filtered_exact_target,
463                     e_sqlitedb_cursor_fixture_teardown);
464         g_test_add ("/EbSdbCursor/Calculate/Filtered/PartialTarget", EbSdbCursorFixture, &book_closure,
465                     e_sqlitedb_cursor_fixture_filtered_setup,
466                     test_cursor_calculate_filtered_partial_target,
467                     e_sqlitedb_cursor_fixture_teardown);
468         g_test_add ("/EbSdbCursor/Calculate/Filtered/AfterModification", EbSdbCursorFixture, &book_closure,
469                     e_sqlitedb_cursor_fixture_filtered_setup,
470                     test_cursor_calculate_filtered_after_modification,
471                     e_sqlitedb_cursor_fixture_teardown);
472
473         return e_test_server_utils_run ();
474 }