midori/tests/bookmarks.c
2012-08-09 01:02:56 +02:00

208 lines
6.7 KiB
C

/*
Copyright (C) 2012 Vincent Cappe <vcappe@gmail.com>
This library 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; either
version 2.1 of the License, or (at your option) any later version.
See the file COPYING for the full license text.
*/
#include "midori.h"
#include "panels/midori-bookmarks.h"
typedef struct
{
KatzeArray* db_bookmarks;
KatzeArray* test_bookmarks;
} BookmarksFixture;
typedef struct
{
char *dbfile; /* usually ":memory:" */
gboolean verbose; /* print debug stuff if TRUE */
char* infile; /* (e.g. to test import), usually NULL */
char* outfile; /* (e.g. to test export), if it can be avoided it's
better to not write anything to disk, though */
} TestParameters;
typedef void (*FixtureFunc)(BookmarksFixture*, const void*);
static void
fixture_setup (BookmarksFixture* fixture,
const TestParameters* params)
{
KatzeItem* item;
KatzeArray* folder;
sqlite3* db;
gchar *errmsg = NULL;
fixture->db_bookmarks = katze_array_new (KATZE_TYPE_ARRAY);
db = midori_bookmarks_initialize (fixture->db_bookmarks, params->dbfile, &errmsg);
if (db == NULL)
g_error ("Bookmarks couldn't be loaded: %s\n", errmsg);
g_assert (errmsg == NULL);
g_object_set_data ( G_OBJECT (fixture->db_bookmarks), "db", db);
fixture->test_bookmarks = katze_array_new (KATZE_TYPE_ARRAY);
item = (KatzeItem*)katze_array_new (KATZE_TYPE_ARRAY);
item->name = "i am a folder";
katze_array_add_item (fixture->test_bookmarks, item);
folder = (KatzeArray *) item;
item = (KatzeItem*)katze_array_new (KATZE_TYPE_ARRAY);
item->name = "i am a folder inside a folder";
katze_array_add_item (folder, item);
folder = (KatzeArray *) item;
item = g_object_new (KATZE_TYPE_ITEM,
"uri", "http://xyzzy.invalid",
"name", "xyzzy", NULL);
katze_item_set_meta_integer (item, "app", TRUE);
katze_array_add_item (folder, item);
/* level up */
folder = katze_item_get_parent ((KatzeItem*)folder);
item = g_object_new (KATZE_TYPE_ITEM,
"uri", "http://zyxxy.invalid",
"name", "zyxxy",
"text", "i have a description and am in a folder", NULL);
katze_item_set_meta_integer(item, "toolbar", TRUE);
katze_array_add_item (folder, item);
folder = katze_item_get_parent ((KatzeItem*)folder);
/* we should be at toplevel, now */
g_assert (folder == fixture->test_bookmarks);
item = g_object_new (KATZE_TYPE_ITEM,
"uri", "http://foobarbaz.invalid",
"name", "i am in the toplevel folder", NULL);
katze_array_add_item (folder, item);
}
static void
fixture_teardown (BookmarksFixture* fixture,
const TestParameters *params)
{
sqlite3* db = g_object_get_data (G_OBJECT (fixture->db_bookmarks), "db");
sqlite3_close (db);
g_object_unref (fixture->db_bookmarks);
g_object_unref (fixture->test_bookmarks);
}
static void
print_bookmark (KatzeItem *bookmark)
{
g_print ("title : '%s'\n", katze_item_get_name (bookmark));
g_print ("uri : '%s'\n", katze_item_get_uri (bookmark));
g_print ("desc : '%s'\n", katze_item_get_text (bookmark));
g_print ("app : %d\n", katze_item_get_meta_boolean (bookmark, "app"));
g_print ("toolbar: %d\n", katze_item_get_meta_boolean (bookmark, "toolbar"));
}
static void
compare_items (KatzeItem *a, KatzeItem *b)
{
g_assert_cmpstr ( katze_item_get_uri (a), ==, katze_item_get_uri (b));
g_assert_cmpstr ( katze_item_get_name (a), ==, katze_item_get_name (b));
g_assert_cmpstr ( katze_str_non_null (katze_item_get_text (a)), ==, katze_str_non_null (katze_item_get_text (b)));
g_assert_cmpint ( katze_item_get_meta_boolean (a, "app"), ==, katze_item_get_meta_boolean (b, "app"));
g_assert_cmpint ( katze_item_get_meta_boolean (a, "toolbar"), ==, katze_item_get_meta_boolean (b, "toolbar"));
}
/* NB: assumes "title" is unique in a set */
static void
compare_test_and_db (KatzeArray* test_bookmarks,
KatzeArray* db_bookmarks,
gboolean verbose)
{
KatzeArray* db_items;
KatzeItem *test_item, *db_item;
GList* list;
KATZE_ARRAY_FOREACH_ITEM_L (test_item, test_bookmarks, list)
{
if (verbose)
{
print_bookmark (test_item);
g_print ("----------\n");
}
db_items = midori_array_query_recursive (db_bookmarks,
"*", "title='%q'", katze_item_get_name (test_item), FALSE);
g_assert_cmpint (katze_array_get_length (db_items), ==, 1);
db_item = katze_array_get_nth_item (db_items, 0);
compare_items (db_item, test_item);
if (KATZE_ITEM_IS_FOLDER(test_item))
compare_test_and_db ( KATZE_ARRAY (test_item), db_bookmarks, verbose);
}
g_list_free (list);
}
static void
insert_bookmarks (KatzeArray* test_bookmarks,
KatzeArray* db_bookmarks,
gboolean verbose)
{
KatzeItem* item;
GList* list;
sqlite3 *db = g_object_get_data (G_OBJECT (db_bookmarks), "db");
KATZE_ARRAY_FOREACH_ITEM_L (item, test_bookmarks, list)
{
if (verbose)
{
print_bookmark (item);
g_print ("----------\n");
}
midori_bookmarks_insert_item_db (db, item, 0);
if (KATZE_ITEM_IS_FOLDER(item))
insert_bookmarks (KATZE_ARRAY (item), db_bookmarks, verbose);
}
g_list_free (list);
}
static void
simple_test (BookmarksFixture* fixture,
const TestParameters* params)
{
if (params->verbose)
g_print ("\n===== inserting items in the database =====\n");
insert_bookmarks (fixture->test_bookmarks, fixture->db_bookmarks, params->verbose);
if (params->verbose)
g_print ("===== comparing database with the original =====\n");
compare_test_and_db (fixture->test_bookmarks, fixture->db_bookmarks, params->verbose);
}
int
main (int argc,
char** argv)
{
//TestParameters default_params = {"/a/path/unlikely/to/exists/bookmarks.db", TRUE, NULL, NULL};
//TestParameters default_params = {"/tmp/bookmarks.db", TRUE, NULL, NULL};
//TestParameters default_params = {":memory:", TRUE, NULL, NULL};
TestParameters default_params = {":memory:", FALSE, NULL, NULL};
g_test_init (&argc, &argv, NULL);
midori_app_setup (&argc, &argv, NULL, NULL);
g_test_add ("/bookmarks/simple test",
BookmarksFixture, &default_params,
(FixtureFunc) fixture_setup,
(FixtureFunc) simple_test,
(FixtureFunc) fixture_teardown);
return g_test_run ();
}