[gom] tests: GomFilter from 3 queries
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gom] tests: GomFilter from 3 queries
- Date: Mon, 16 Jun 2014 10:52:52 +0000 (UTC)
commit e58eda1d0e99fc08c176e11a302305ee9f5f2393
Author: Victor Toso <me victortoso com>
Date: Sun Jun 15 23:33:27 2014 -0300
tests: GomFilter from 3 queries
https://bugzilla.gnome.org/show_bug.cgi?id=731701
.gitignore | 1 +
tests/Makefile.include | 6 +
tests/test-gom-find-specific.c | 395 ++++++++++++++++++++++++++++++++++++++++
3 files changed, 402 insertions(+), 0 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index d32cef3..a1acf1f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,6 +26,7 @@ stamp-h1
test-gom-adapter
test-gom-repository
test-gom-find
+test-gom-find-specific
test-gom-stress
test-gom-transform
test-gom-migration
diff --git a/tests/Makefile.include b/tests/Makefile.include
index 024401a..cf20963 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -2,6 +2,7 @@ noinst_PROGRAMS =
noinst_PROGRAMS += test-gom-adapter
noinst_PROGRAMS += test-gom-repository
noinst_PROGRAMS += test-gom-find
+noinst_PROGRAMS += test-gom-find-specific
noinst_PROGRAMS += test-gom-transform
noinst_PROGRAMS += test-gom-stress
noinst_PROGRAMS += test-gom-migration
@@ -11,6 +12,7 @@ noinst_PROGRAMS += test-gom-insert
TEST_PROGS += test-gom-adapter
TEST_PROGS += test-gom-repository
TEST_PROGS += test-gom-find
+TEST_PROGS += test-gom-find-specific
TEST_PROGS += test-gom-transform
TEST_PROGS += test-gom-stress
TEST_PROGS += test-gom-migration
@@ -49,4 +51,8 @@ test_gom_insert_SOURCES = $(top_srcdir)/tests/test-gom-insert.c
test_gom_insert_CPPFLAGS = $(GIO_CFLAGS) $(GOBJECT_CFLAGS)
test_gom_insert_LDADD = $(GIO_LIBS) $(GOBJECT_LIBS) $(top_builddir)/libgom-1.0.la
+test_gom_find_specific_SOURCES = $(top_srcdir)/tests/test-gom-find-specific.c
+test_gom_find_specific_CPPFLAGS = $(GIO_CFLAGS) $(GOBJECT_CFLAGS)
+test_gom_find_specific_LDADD = $(GIO_LIBS) $(GOBJECT_LIBS) $(top_builddir)/libgom-1.0.la
+
EXTRA_DIST = $(top_srcdir)/tests/grl-bookmarks.db $(top_srcdir)/tests/gnome.png
diff --git a/tests/test-gom-find-specific.c b/tests/test-gom-find-specific.c
new file mode 100644
index 0000000..515a90f
--- /dev/null
+++ b/tests/test-gom-find-specific.c
@@ -0,0 +1,395 @@
+#include <gom/gom.h>
+#include <glib/gstdio.h>
+
+static GMainLoop *gMainLoop;
+static char *db_dir_path = NULL;
+
+/* EpisodeResource object */
+
+#define EPISODE_TYPE_RESOURCE (episode_resource_get_type())
+#define EPISODE_TYPE_TYPE (episode_type_get_type())
+#define EPISODE_RESOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EPISODE_TYPE_RESOURCE,
EpisodeResource))
+#define EPISODE_RESOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EPISODE_TYPE_RESOURCE,
EpisodeResourceClass))
+#define EPISODE_IS_RESOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EPISODE_TYPE_RESOURCE))
+#define EPISODE_IS_RESOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EPISODE_TYPE_RESOURCE))
+#define EPISODE_RESOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EPISODE_TYPE_RESOURCE,
EpisodeResourceClass))
+
+#define EPISODE_COLUMN_ID "id"
+#define EPISODE_COLUMN_SERIES_ID "series-id"
+#define EPISODE_COLUMN_IMDB_ID "imdb-id"
+#define EPISODE_COLUMN_SEASON_NUMBER "season-number"
+#define EPISODE_COLUMN_EPISODE_NUMBER "episode-number"
+#define EPISODE_COLUMN_EPISODE_NAME "episode-name"
+
+typedef struct {
+ gint64 db_id;
+ gchar *series_id;
+ gchar *imdb_id;
+ guint8 season_number;
+ guint8 episode_number;
+ gchar *episode_name;
+} EpisodeResourcePrivate;
+
+typedef struct
+{
+ GomResource parent;
+ EpisodeResourcePrivate *priv;
+} EpisodeResource;
+
+typedef struct
+{
+ GomResourceClass parent_class;
+} EpisodeResourceClass;
+
+G_DEFINE_TYPE(EpisodeResource, episode_resource, GOM_TYPE_RESOURCE)
+
+enum {
+ PROP_0,
+ PROP_DB_ID,
+ PROP_SERIES_ID,
+ PROP_IMDB_ID,
+ PROP_SEASON_NUMBER,
+ PROP_EPISODE_NUMBER,
+ PROP_EPISODE_NAME,
+ LAST_PROP
+};
+
+static GParamSpec *specs[LAST_PROP];
+
+static struct {
+ gchar *series_id;
+ gchar *imdb_id;
+ guint8 season_number;
+ guint8 episode_number;
+ gchar *episode_name;
+} values[] = {
+ { "84947", "tt2483070", 4, 1, "New York Sour" }
+};
+
+static void
+episode_resource_finalize (GObject *object)
+{
+ EpisodeResourcePrivate *priv = EPISODE_RESOURCE(object)->priv;
+
+ g_clear_pointer (&priv->series_id, g_free);
+ g_clear_pointer (&priv->imdb_id, g_free);
+ g_clear_pointer (&priv->episode_name, g_free);
+
+ G_OBJECT_CLASS(episode_resource_parent_class)->finalize(object);
+}
+
+static void
+episode_resource_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ EpisodeResource *resource = EPISODE_RESOURCE(object);
+
+ switch (prop_id) {
+ case PROP_DB_ID:
+ g_value_set_int64 (value, resource->priv->db_id);
+ break;
+ case PROP_SERIES_ID:
+ g_value_set_string (value, resource->priv->series_id);
+ break;
+ case PROP_IMDB_ID:
+ g_value_set_string (value, resource->priv->imdb_id);
+ break;
+ case PROP_SEASON_NUMBER:
+ g_value_set_uchar (value, resource->priv->season_number);
+ break;
+ case PROP_EPISODE_NUMBER:
+ g_value_set_uchar (value, resource->priv->episode_number);
+ break;
+ case PROP_EPISODE_NAME:
+ g_value_set_string (value, resource->priv->episode_name);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ }
+}
+
+static void
+episode_resource_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ EpisodeResource *resource = EPISODE_RESOURCE(object);
+
+ switch (prop_id) {
+ case PROP_DB_ID:
+ resource->priv->db_id = g_value_get_int64 (value);
+ break;
+ case PROP_SERIES_ID:
+ g_clear_pointer (&resource->priv->series_id, g_free);
+ resource->priv->series_id = g_value_dup_string (value);
+ break;
+ case PROP_IMDB_ID:
+ g_clear_pointer (&resource->priv->imdb_id, g_free);
+ resource->priv->imdb_id = g_value_dup_string (value);
+ break;
+ case PROP_SEASON_NUMBER:
+ resource->priv->season_number = g_value_get_uchar (value);
+ break;
+ case PROP_EPISODE_NUMBER:
+ resource->priv->episode_number = g_value_get_uchar (value);
+ break;
+ case PROP_EPISODE_NAME:
+ g_clear_pointer (&resource->priv->episode_name, g_free);
+ resource->priv->episode_name = g_value_dup_string (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ }
+}
+
+static void
+episode_resource_class_init (EpisodeResourceClass *klass)
+{
+ GObjectClass *object_class;
+ GomResourceClass *resource_class;
+
+ object_class = G_OBJECT_CLASS(klass);
+ object_class->finalize = episode_resource_finalize;
+ object_class->get_property = episode_resource_get_property;
+ object_class->set_property = episode_resource_set_property;
+ g_type_class_add_private(object_class, sizeof(EpisodeResourcePrivate));
+
+ resource_class = GOM_RESOURCE_CLASS(klass);
+ gom_resource_class_set_table(resource_class, "episodes");
+
+ specs[PROP_DB_ID] = g_param_spec_int64 (EPISODE_COLUMN_ID,
+ NULL, NULL,
+ 0, G_MAXINT64,
+ 0, G_PARAM_READWRITE);
+ g_object_class_install_property (object_class, PROP_DB_ID,
+ specs[PROP_DB_ID]);
+ gom_resource_class_set_primary_key (resource_class, "id");
+
+ specs[PROP_SERIES_ID] = g_param_spec_string (EPISODE_COLUMN_SERIES_ID,
+ NULL, NULL, NULL,
+ G_PARAM_READWRITE);
+ g_object_class_install_property (object_class, PROP_SERIES_ID,
+ specs[PROP_SERIES_ID]);
+
+ specs[PROP_IMDB_ID] = g_param_spec_string (EPISODE_COLUMN_IMDB_ID,
+ NULL, NULL, NULL,
+ G_PARAM_READWRITE);
+ g_object_class_install_property (object_class, PROP_IMDB_ID,
+ specs[PROP_IMDB_ID]);
+
+ specs[PROP_SEASON_NUMBER] = g_param_spec_uchar (EPISODE_COLUMN_SEASON_NUMBER,
+ NULL, NULL,
+ 0, G_MAXUINT8,
+ 0, G_PARAM_READWRITE);
+ g_object_class_install_property (object_class, PROP_SEASON_NUMBER,
+ specs[PROP_SEASON_NUMBER]);
+
+ specs[PROP_EPISODE_NUMBER] = g_param_spec_uchar (EPISODE_COLUMN_EPISODE_NUMBER,
+ NULL, NULL,
+ 0, G_MAXUINT8,
+ 0, G_PARAM_READWRITE);
+ g_object_class_install_property (object_class, PROP_EPISODE_NUMBER,
+ specs[PROP_EPISODE_NUMBER]);
+
+ specs[PROP_EPISODE_NAME] = g_param_spec_string (EPISODE_COLUMN_EPISODE_NAME,
+ NULL, NULL, NULL,
+ G_PARAM_READWRITE);
+ g_object_class_install_property (object_class, PROP_EPISODE_NAME,
+ specs[PROP_EPISODE_NAME]);
+
+}
+
+static void
+episode_resource_init (EpisodeResource *resource)
+{
+ resource->priv = G_TYPE_INSTANCE_GET_PRIVATE(resource,
+ EPISODE_TYPE_RESOURCE,
+ EpisodeResourcePrivate);
+}
+
+static void
+create_memory_db (GomAdapter **adapter,
+ GomRepository **repository)
+{
+ gboolean ret;
+ GError *error = NULL;
+ GList *object_types;
+ EpisodeResource *eres;
+
+ *adapter = gom_adapter_new();
+ ret = gom_adapter_open_sync (*adapter, ":memory:", &error);
+ //ret = gom_adapter_open_sync (*adapter, "/tmp/test_gom_find.db", &error);
+ g_assert_no_error (error);
+ g_assert (ret);
+
+ *repository = gom_repository_new (*adapter);
+
+ object_types = g_list_prepend (NULL, GINT_TO_POINTER (EPISODE_TYPE_RESOURCE));
+ ret = gom_repository_automatic_migrate_sync (*repository, 1, object_types, &error);
+ g_assert_no_error (error);
+ g_assert (ret);
+
+ eres = g_object_new (EPISODE_TYPE_RESOURCE,
+ "repository", *repository,
+ EPISODE_COLUMN_SERIES_ID, values[0].series_id,
+ EPISODE_COLUMN_IMDB_ID, values[0].imdb_id,
+ EPISODE_COLUMN_SEASON_NUMBER, values[0].season_number,
+ EPISODE_COLUMN_EPISODE_NUMBER, values[0].episode_number,
+ EPISODE_COLUMN_EPISODE_NAME, values[0].episode_name,
+ NULL);
+ ret = gom_resource_save_sync (GOM_RESOURCE (eres), &error);
+ g_assert (ret);
+ g_assert_no_error (error);
+ g_object_unref (eres);
+}
+
+static void
+free_memory_db (GomAdapter *adapter,
+ GomRepository *repository)
+{
+ gboolean ret;
+ GError *error = NULL;
+
+ ret = gom_adapter_close_sync (adapter, &error);
+ g_assert_no_error (error);
+ g_assert (ret);
+
+ g_object_unref (repository);
+ g_object_unref (adapter);
+}
+
+/* Try to find values[0] from values[0].series_id */
+static void
+find_simple (void)
+{
+ GError *error = NULL;
+ gboolean ret;
+ GValue value = { 0, };
+ GomFilter *filter;
+ char *s1, *s2;
+ GomResource *resource;
+ EpisodeResource *eres;
+ GomAdapter *adapter;
+ GomRepository *repository;
+
+ create_memory_db (&adapter, &repository);
+
+ /* Series ID */
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_string (&value, values[0].series_id);
+ filter = gom_filter_new_like (EPISODE_TYPE_RESOURCE,
+ EPISODE_COLUMN_SERIES_ID,
+ &value);
+ g_value_unset (&value);
+
+ resource = gom_repository_find_one_sync (repository,
+ EPISODE_TYPE_RESOURCE,
+ filter,
+ &error);
+ g_assert_no_error (error);
+ g_assert (resource);
+ g_object_unref (filter);
+ eres = EPISODE_RESOURCE (resource);
+
+ g_object_get(eres,
+ EPISODE_COLUMN_SERIES_ID, &s1,
+ EPISODE_COLUMN_IMDB_ID, &s2,
+ NULL);
+ g_object_unref(eres);
+
+ g_assert_cmpstr (s1, ==, values[0].series_id);
+ g_assert_cmpstr (s2, ==, values[0].imdb_id);
+ g_free (s1);
+ g_free (s2);
+
+ free_memory_db (adapter, repository);
+}
+
+/* Try to find values[0] from:
+ * values[0].series_id
+ * AND values[0].season_number
+ * AND values[0].episode_number */
+static void
+find_specific (void)
+{
+ GError *error = NULL;
+ gboolean ret;
+ GValue value = { 0, };
+ GomFilter *filter1, *filter2, *filter3, *filter4, *filter5;
+ char *s1, *s2;
+ GomResource *resource;
+ EpisodeResource *eres;
+ GomAdapter *adapter;
+ GomRepository *repository;
+
+ create_memory_db (&adapter, &repository);
+
+ /* Season Number */
+ g_value_init (&value, G_TYPE_INT64);
+ g_value_set_int64 (&value, values[0].season_number);
+ filter1 = gom_filter_new_eq (EPISODE_TYPE_RESOURCE,
+ EPISODE_COLUMN_SEASON_NUMBER,
+ &value);
+ g_value_unset (&value);
+
+ /* Episode Number */
+ g_value_init (&value, G_TYPE_INT64);
+ g_value_set_int64 (&value, values[0].episode_number);
+ filter2 = gom_filter_new_eq (EPISODE_TYPE_RESOURCE,
+ EPISODE_COLUMN_EPISODE_NUMBER,
+ &value);
+ g_value_unset (&value);
+
+ /* Series ID */
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_string (&value, values[0].series_id);
+ filter3 = gom_filter_new_like (EPISODE_TYPE_RESOURCE,
+ EPISODE_COLUMN_SERIES_ID,
+ &value);
+ g_value_unset (&value);
+
+ /* Season and Episode Number */
+ filter4 = gom_filter_new_and (filter1, filter2);
+ g_object_unref (filter1);
+ g_object_unref (filter2);
+
+ /* Series ID and Season and Episode Number */
+ filter5 = gom_filter_new_and (filter3, filter4);
+ g_object_unref (filter3);
+ g_object_unref (filter4);
+
+ resource = gom_repository_find_one_sync (repository,
+ EPISODE_TYPE_RESOURCE,
+ filter5,
+ &error);
+ g_assert_no_error (error);
+ g_assert (resource);
+ g_object_unref (filter5);
+ eres = EPISODE_RESOURCE (resource);
+
+ g_object_get(eres,
+ EPISODE_COLUMN_SERIES_ID, &s1,
+ EPISODE_COLUMN_IMDB_ID, &s2,
+ NULL);
+ g_object_unref(eres);
+
+ g_assert_cmpstr (s1, ==, values[0].series_id);
+ g_assert_cmpstr (s2, ==, values[0].imdb_id);
+ g_free (s1);
+ g_free (s2);
+
+ free_memory_db (adapter, repository);
+}
+
+gint
+main (gint argc, gchar *argv[])
+{
+ g_test_init (&argc, &argv, NULL);
+ g_test_add_func ("/GomRepository/find-simple", find_simple);
+ g_test_add_func ("/GomRepository/find-specific", find_specific);
+ gMainLoop = g_main_loop_new (NULL, FALSE);
+ return g_test_run ();
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]