1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
5 #include <libebook/libebook.h>
7 #include "data-test-utils.h"
9 static EbSdbCursorClosure book_closure = { { E_TEST_SERVER_ADDRESS_BOOK, e_sqlitedb_cursor_fixture_setup_book, 0 }, FALSE };
12 test_cursor_calculate_initial (EbSdbCursorFixture *fixture,
13 gconstpointer user_data)
16 gint position = 0, total = 0;
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);
22 g_assert_cmpint (position, ==, 0);
23 g_assert_cmpint (total, ==, 20);
27 test_cursor_calculate_move_forward (EbSdbCursorFixture *fixture,
28 gconstpointer user_data)
32 gint position = 0, total = 0;
35 results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
36 fixture->cursor, 5, &error);
39 g_error ("Error fetching cursor results: %s", error->message);
41 /* Assert the first 5 contacts in en_US order */
42 g_assert_cmpint (g_slist_length (results), ==, 5);
43 assert_contacts_order (results,
50 g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
51 g_slist_free (results);
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);
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);
64 test_cursor_calculate_move_backwards (EbSdbCursorFixture *fixture,
65 gconstpointer user_data)
69 gint position = 0, total = 0;
72 results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
73 fixture->cursor, -5, &error);
76 g_error ("Error fetching cursor results: %s", error->message);
78 /* Assert the last 5 contacts in en_US order */
79 g_assert_cmpint (g_slist_length (results), ==, 5);
80 assert_contacts_order (results,
87 g_slist_foreach (results, (GFunc)e_book_backend_sqlitedb_search_data_free, NULL);
88 g_slist_free (results);
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);
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);
101 test_cursor_calculate_back_and_forth (EbSdbCursorFixture *fixture,
102 gconstpointer user_data)
105 GError *error = NULL;
106 gint position = 0, total = 0;
109 results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
110 fixture->cursor, 7, &error);
113 g_error ("Error fetching cursor results: %s", error->message);
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);
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);
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);
129 results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
130 fixture->cursor, -4, &error);
133 g_error ("Error fetching cursor results: %s", error->message);
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);
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);
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);
149 results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
150 fixture->cursor, 5, &error);
153 g_error ("Error fetching cursor results: %s", error->message);
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);
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);
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);
170 test_cursor_calculate_exact_target (EbSdbCursorFixture *fixture,
171 gconstpointer user_data)
173 GError *error = NULL;
174 gint position = 0, total = 0;
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]);
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);
185 /* blackbird is at position 12 in en_US locale */
186 g_assert_cmpint (position, ==, 12);
187 g_assert_cmpint (total, ==, 20);
191 test_cursor_calculate_partial_target (EbSdbCursorFixture *fixture,
192 gconstpointer user_data)
194 GError *error = NULL;
195 gint position = 0, total = 0;
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);
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);
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);
212 test_cursor_calculate_after_modification (EbSdbCursorFixture *fixture,
213 gconstpointer user_data)
215 EBookClient *book_client;
216 GError *error = NULL;
217 gint position = 0, total = 0;
219 book_client = E_TEST_SERVER_UTILS_SERVICE (fixture, EBookClient);
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]);
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);
230 /* blackbird is at position 12 in en_US locale */
231 g_assert_cmpint (position, ==, 12);
232 g_assert_cmpint (total, ==, 20);
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);
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);
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);
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);
257 test_cursor_calculate_filtered_initial (EbSdbCursorFixture *fixture,
258 gconstpointer user_data)
260 GError *error = NULL;
261 gint position = 0, total = 0;
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);
267 g_assert_cmpint (position, ==, 0);
268 g_assert_cmpint (total, ==, 13);
272 test_cursor_calculate_filtered_move_forward (EbSdbCursorFixture *fixture,
273 gconstpointer user_data)
276 GError *error = NULL;
277 gint position = 0, total = 0;
280 results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
281 fixture->cursor, 5, &error);
284 g_error ("Error fetching cursor results: %s", error->message);
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);
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);
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);
301 test_cursor_calculate_filtered_move_backwards (EbSdbCursorFixture *fixture,
302 gconstpointer user_data)
305 GError *error = NULL;
306 gint position = 0, total = 0;
309 results = e_book_backend_sqlitedb_cursor_move_by (((ESqliteDBFixture *) fixture)->ebsdb,
310 fixture->cursor, -5, &error);
313 g_error ("Error fetching cursor results: %s", error->message);
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);
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);
324 /* results 13 - 5 = position 9 (results[13, 12, 11, 10, 9]) */
325 g_assert_cmpint (position, ==, 9);
326 g_assert_cmpint (total, ==, 13);
330 test_cursor_calculate_filtered_exact_target (EbSdbCursorFixture *fixture,
331 gconstpointer user_data)
333 GError *error = NULL;
334 gint position = 0, total = 0;
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]);
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);
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);
351 test_cursor_calculate_filtered_partial_target (EbSdbCursorFixture *fixture,
352 gconstpointer user_data)
354 GError *error = NULL;
355 gint position = 0, total = 0;
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);
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);
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);
372 test_cursor_calculate_filtered_after_modification (EbSdbCursorFixture *fixture,
373 gconstpointer user_data)
375 EBookClient *book_client;
376 GError *error = NULL;
377 gint position = 0, total = 0;
379 book_client = E_TEST_SERVER_UTILS_SERVICE (fixture, EBookClient);
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]);
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);
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);
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);
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);
411 #if !GLIB_CHECK_VERSION (2, 35, 1)
414 g_test_init (&argc, &argv, NULL);
416 /* Ensure that the client and server get the same locale */
417 g_assert (g_setenv ("EDS_COLLATE", "en_US.UTF-8", TRUE));
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);
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);
473 return e_test_server_utils_run ();