/* -*- 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" static EbSqlCursorClosure book_closure = { { FALSE, NULL }, NULL, E_BOOK_CURSOR_SORT_ASCENDING }; static void test_cursor_sexp_calculate_position (EbSqlCursorFixture *fixture, gconstpointer user_data) { GError *error = NULL; EBookQuery *query; gint position = 0, total = 0; gchar *sexp = NULL; GSList *results = NULL, *node; EbSqlSearchData *data; /* Set the cursor to point exactly to 'blackbirds', which is the 12th contact in en_US */ if (!e_book_sqlite_cursor_step (((EbSqlFixture *) fixture)->ebsql, fixture->cursor, EBSQL_CURSOR_STEP_MOVE | EBSQL_CURSOR_STEP_FETCH, EBSQL_CURSOR_ORIGIN_BEGIN, 12, &results, NULL, &error)) g_error ("Error fetching cursor results: %s", error->message); /* Ensure we moved to the right contact */ node = g_slist_last (results); g_assert_true (node); data = node->data; g_assert_cmpstr (data->uid, ==, "sorted-16"); g_slist_foreach (results, (GFunc) e_book_sqlite_search_data_free, NULL); g_slist_free (results); /* Check position */ if (!e_book_sqlite_cursor_calculate (((EbSqlFixture *) fixture)->ebsql, fixture->cursor, &total, &position, NULL, &error)) g_error ("Error calculating cursor: %s", error->message); /* blackbird is at position 12 in an unfiltered en_US locale */ g_assert_cmpint (position, ==, 12); g_assert_cmpint (total, ==, 20); /* Set new sexp, only contacts with .com email addresses */ query = e_book_query_field_test (E_CONTACT_EMAIL, E_BOOK_QUERY_ENDS_WITH, ".com"); sexp = e_book_query_to_string (query); e_book_query_unref (query); if (!e_book_sqlite_cursor_set_sexp (((EbSqlFixture *) fixture)->ebsql, fixture->cursor, sexp, &error)) g_error ("Failed to set sexp: %s", error->message); /* Check new position after modified sexp */ if (!e_book_sqlite_cursor_calculate (((EbSqlFixture *) fixture)->ebsql, fixture->cursor, &total, &position, NULL, &error)) g_error ("Error calculating cursor: %s", error->message); /* 'blackbird' is now at position 8 out of 13, with a filtered set of contacts in en_US locale */ g_assert_cmpint (position, ==, 8); g_assert_cmpint (total, ==, 13); } static void test_cursor_sexp_and_step (EbSqlCursorFixture *fixture, gconstpointer user_data) { GError *error = NULL; EBookQuery *query; gchar *sexp = NULL; GSList *results = NULL, *node; EbSqlSearchData *data; /* Set new sexp, only contacts with .com email addresses */ query = e_book_query_field_test (E_CONTACT_EMAIL, E_BOOK_QUERY_ENDS_WITH, ".com"); sexp = e_book_query_to_string (query); e_book_query_unref (query); if (!e_book_sqlite_cursor_set_sexp (((EbSqlFixture *) fixture)->ebsql, fixture->cursor, sexp, &error)) g_error ("Failed to set sexp: %s", error->message); /* Step 6 results from the beginning of the filtered list, gets up to contact 'sorted-8' */ if (!e_book_sqlite_cursor_step (((EbSqlFixture *) fixture)->ebsql, fixture->cursor, EBSQL_CURSOR_STEP_MOVE | EBSQL_CURSOR_STEP_FETCH, EBSQL_CURSOR_ORIGIN_BEGIN, 6, &results, NULL, &error)) g_error ("Error fetching cursor results: %s", error->message); /* Ensure we moved to the right contact */ node = g_slist_last (results); g_assert_true (node); data = node->data; g_assert_cmpstr (data->uid, ==, "sorted-8"); g_slist_foreach (results, (GFunc) e_book_sqlite_search_data_free, NULL); g_slist_free (results); results = NULL; /* Step 6 results more, gets up to contact 'sorted-12' */ if (!e_book_sqlite_cursor_step (((EbSqlFixture *) fixture)->ebsql, fixture->cursor, EBSQL_CURSOR_STEP_MOVE | EBSQL_CURSOR_STEP_FETCH, EBSQL_CURSOR_ORIGIN_CURRENT, 6, &results, NULL, &error)) g_error ("Error fetching cursor results: %s", error->message); /* Ensure we moved to the right contact */ node = g_slist_last (results); g_assert_true (node); data = node->data; g_assert_cmpstr (data->uid, ==, "sorted-12"); g_slist_foreach (results, (GFunc) e_book_sqlite_search_data_free, NULL); g_slist_free (results); } gint main (gint argc, gchar **argv) { #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); g_test_add ( "/EbSqlCursor/SetSexp/CalculatePosition", EbSqlCursorFixture, &book_closure, e_sqlite_cursor_fixture_setup, test_cursor_sexp_calculate_position, e_sqlite_cursor_fixture_teardown); g_test_add ( "/EbSqlCursor/SetSexp/Step", EbSqlCursorFixture, &book_closure, e_sqlite_cursor_fixture_setup, test_cursor_sexp_and_step, e_sqlite_cursor_fixture_teardown); return e_test_server_utils_run_full (argc, argv, 0); }