/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * */ #include #include #include #include "e-test-server-utils.h" #include "data-test-utils.h" /***************************************************** * Expect the same results twice * *****************************************************/ static void test_cursor_set_target_reset_cursor (EbSqlCursorFixture *fixture, gconstpointer user_data) { GSList *results = NULL; GError *error = NULL; /* First batch */ if (e_book_sqlite_cursor_step (((EbSqlFixture *) fixture)->ebsql, fixture->cursor, EBSQL_CURSOR_STEP_MOVE | EBSQL_CURSOR_STEP_FETCH, EBSQL_CURSOR_ORIGIN_BEGIN, 5, &results, NULL, &error) < 0) g_error ("Error fetching cursor results: %s", error->message); print_results (results); /* Assert the first 5 contacts in en_US order */ g_assert_cmpint (g_slist_length (results), ==, 5); assert_contacts_order ( results, "sorted-11", "sorted-1", "sorted-2", "sorted-5", "sorted-6", NULL); g_slist_foreach (results, (GFunc) e_book_sqlite_search_data_free, NULL); g_slist_free (results); results = NULL; /* Second batch reset (same results) */ if (e_book_sqlite_cursor_step (((EbSqlFixture *) fixture)->ebsql, fixture->cursor, EBSQL_CURSOR_STEP_MOVE | EBSQL_CURSOR_STEP_FETCH, EBSQL_CURSOR_ORIGIN_BEGIN, 5, &results, NULL, &error) < 0) g_error ("Error fetching cursor results: %s", error->message); print_results (results); /* Assert the first 5 contacts in en_US order again */ g_assert_cmpint (g_slist_length (results), ==, 5); assert_contacts_order ( results, "sorted-11", "sorted-1", "sorted-2", "sorted-5", "sorted-6", NULL); g_slist_foreach (results, (GFunc) e_book_sqlite_search_data_free, NULL); g_slist_free (results); } /***************************************************** * Expect results with family name starting with 'C' * *****************************************************/ static void test_cursor_set_target_c_next_results (EbSqlCursorFixture *fixture, gconstpointer user_data) { GSList *results = NULL; GError *error = NULL; ECollator *collator; gint n_labels; const gchar *const *labels; /* First verify our test... in en_US locale the label 'C' should exist with the index 3 */ collator = e_book_sqlite_ref_collator (((EbSqlFixture *) fixture)->ebsql); labels = e_collator_get_index_labels (collator, &n_labels, NULL, NULL, NULL); g_assert_cmpstr (labels[3], ==, "C"); e_collator_unref (collator); /* Set the cursor at the start of family names beginning with 'C' */ e_book_sqlite_cursor_set_target_alphabetic_index ( ((EbSqlFixture *) fixture)->ebsql, fixture->cursor, 3); if (e_book_sqlite_cursor_step (((EbSqlFixture *) fixture)->ebsql, fixture->cursor, EBSQL_CURSOR_STEP_MOVE | EBSQL_CURSOR_STEP_FETCH, EBSQL_CURSOR_ORIGIN_CURRENT, 5, &results, NULL, &error) < 0) g_error ("Error fetching cursor results: %s", error->message); print_results (results); /* Assert that we got the results starting at C */ g_assert_cmpint (g_slist_length (results), ==, 5); assert_contacts_order ( results, "sorted-10", "sorted-14", "sorted-12", "sorted-13", "sorted-9", NULL); g_slist_foreach (results, (GFunc) e_book_sqlite_search_data_free, NULL); g_slist_free (results); } /***************************************************** * Expect results before the letter 'C' * *****************************************************/ static void test_cursor_set_target_c_prev_results (EbSqlCursorFixture *fixture, gconstpointer user_data) { GSList *results = NULL; GError *error = NULL; ECollator *collator; gint n_labels; const gchar *const *labels; /* First verify our test... in en_US locale the label 'C' should exist with the index 3 */ collator = e_book_sqlite_ref_collator (((EbSqlFixture *) fixture)->ebsql); labels = e_collator_get_index_labels (collator, &n_labels, NULL, NULL, NULL); g_assert_cmpstr (labels[3], ==, "C"); e_collator_unref (collator); /* Set the cursor at the start of family names beginning with 'C' */ e_book_sqlite_cursor_set_target_alphabetic_index ( ((EbSqlFixture *) fixture)->ebsql, fixture->cursor, 3); if (e_book_sqlite_cursor_step (((EbSqlFixture *) fixture)->ebsql, fixture->cursor, EBSQL_CURSOR_STEP_MOVE | EBSQL_CURSOR_STEP_FETCH, EBSQL_CURSOR_ORIGIN_CURRENT, -5, &results, NULL, &error) < 0) g_error ("Error fetching cursor results: %s", error->message); print_results (results); /* Assert that we got the results before C */ g_assert_cmpint (g_slist_length (results), ==, 5); assert_contacts_order ( results, "sorted-18", "sorted-16", "sorted-17", "sorted-15", "sorted-8", NULL); g_slist_foreach (results, (GFunc) e_book_sqlite_search_data_free, NULL); g_slist_free (results); } static EbSqlCursorClosure closures[] = { { { FALSE, NULL }, NULL, E_BOOK_CURSOR_SORT_ASCENDING }, { { TRUE, NULL }, NULL, E_BOOK_CURSOR_SORT_ASCENDING }, { { FALSE, setup_empty_book }, NULL, E_BOOK_CURSOR_SORT_ASCENDING }, { { TRUE, setup_empty_book }, NULL, E_BOOK_CURSOR_SORT_ASCENDING } }; static const gchar *prefixes[] = { "/EBookSqlite/DefaultSummary/StoreVCards", "/EBookSqlite/DefaultSummary/NoVCards", "/EBookSqlite/EmptySummary/StoreVCards", "/EBookSqlite/EmptrySummary/NoVCards" }; gint main (gint argc, gchar **argv) { gint i; #if !GLIB_CHECK_VERSION (2, 35, 1) g_type_init (); #endif g_test_init (&argc, &argv, NULL); g_test_bug_base ("https://gitlab.gnome.org/GNOME/evolution-data-server/"); data_test_utils_read_args (argc, argv); for (i = 0; i < G_N_ELEMENTS (closures); i++) { gchar *path; path = g_strconcat (prefixes[i], "/SetTarget/ResetCursor", NULL); g_test_add ( path, EbSqlCursorFixture, &closures[i], e_sqlite_cursor_fixture_setup, test_cursor_set_target_reset_cursor, e_sqlite_cursor_fixture_teardown); g_free (path); path = g_strconcat (prefixes[i], "/SetTarget/Alphabetic/C/NextResults", NULL); g_test_add ( path, EbSqlCursorFixture, &closures[i], e_sqlite_cursor_fixture_setup, test_cursor_set_target_c_next_results, e_sqlite_cursor_fixture_teardown); g_free (path); path = g_strconcat (prefixes[i], "/SetTarget/Alphabetic/C/PreviousResults", NULL); g_test_add ( path, EbSqlCursorFixture, &closures[i], e_sqlite_cursor_fixture_setup, test_cursor_set_target_c_prev_results, e_sqlite_cursor_fixture_teardown); g_free (path); } return e_test_server_utils_run_full (argc, argv, 0); }