]> spindle.queued.net Git - midori/commitdiff
Add semi-useful unit test for bookmarks
authorVincent Cappe <vcappe@gmail.com>
Mon, 16 Apr 2012 12:49:55 +0000 (14:49 +0200)
committerChristian Dywan <christian@twotoasts.de>
Sat, 12 May 2012 02:03:14 +0000 (04:03 +0200)
well, it's more of a skeleton, really

tests/bookmarks.c [new file with mode: 0644]

diff --git a/tests/bookmarks.c b/tests/bookmarks.c
new file mode 100644 (file)
index 0000000..9a13593
--- /dev/null
@@ -0,0 +1,209 @@
+/*
+ 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};
+
+    midori_app_setup (argv);
+    g_test_init (&argc, &argv, NULL);
+    gtk_init_check (&argc, &argv);
+
+    g_test_add ("/bookmarks/simple test",
+                    BookmarksFixture, &default_params,
+                    (FixtureFunc) fixture_setup,
+                    (FixtureFunc) simple_test,
+                    (FixtureFunc) fixture_teardown);
+
+    return g_test_run ();
+}