/*
* Copyright (C) 2010 Canonical Ltd
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
* Authored by
* Neil Jagdish Patel
* Mikkel Kamstrup Erlandsen
*
*/
#include
#include
#include
#include
typedef struct
{
DeeModel *orig;
DeeModel *copy;
} Fixture;
static void sequence_model_setup (Fixture *fix, gconstpointer data);
static void sequence_model_teardown (Fixture *fix, gconstpointer data);
static void shared_model_setup (Fixture *fix, gconstpointer data);
static void shared_model_teardown (Fixture *fix, gconstpointer data);
static void test_model_zero_rows (Fixture *fix, gconstpointer data);
static void test_model_one_rows (Fixture *fix, gconstpointer data);
static void test_model_two_rows (Fixture *fix, gconstpointer data);
static void test_model_non_zero_seqnum_offset (Fixture *fix, gconstpointer data);
void
test_serializable_create_suite (void)
{
#define SEQUENCE_MODEL_DOMAIN "/Serializable/SequenceModel"
#define SHARED_MODEL_DOMAIN "/Serializable/SharedModel"
g_test_add (SEQUENCE_MODEL_DOMAIN"/ZeroRows", Fixture, 0,
sequence_model_setup, test_model_zero_rows, sequence_model_teardown);
g_test_add (SHARED_MODEL_DOMAIN"/ZeroRows", Fixture, 0,
shared_model_setup, test_model_zero_rows, shared_model_teardown);
g_test_add (SEQUENCE_MODEL_DOMAIN"/OneRows", Fixture, 0,
sequence_model_setup, test_model_one_rows, sequence_model_teardown);
g_test_add (SHARED_MODEL_DOMAIN"/OneRows", Fixture, 0,
sequence_model_setup, test_model_one_rows, shared_model_teardown);
g_test_add (SEQUENCE_MODEL_DOMAIN"/TwoRows", Fixture, 0,
sequence_model_setup, test_model_two_rows, sequence_model_teardown);
g_test_add (SHARED_MODEL_DOMAIN"/TwoRows", Fixture, 0,
shared_model_setup, test_model_two_rows, shared_model_teardown);
g_test_add (SEQUENCE_MODEL_DOMAIN"/NonZeroSeqnumOffset", Fixture, 0,
sequence_model_setup, test_model_non_zero_seqnum_offset, sequence_model_teardown);
g_test_add (SHARED_MODEL_DOMAIN"/NonZeroSeqnumOffset", Fixture, 0,
shared_model_setup, test_model_non_zero_seqnum_offset, shared_model_teardown);
}
static void
sequence_model_setup (Fixture *fix, gconstpointer data)
{
fix->orig = dee_sequence_model_new ();
dee_model_set_schema (fix->orig, "i", "s", NULL);
fix->copy = NULL;
g_assert (DEE_IS_SEQUENCE_MODEL (fix->orig));
}
static void
sequence_model_teardown (Fixture *fix, gconstpointer data)
{
g_object_unref (fix->orig);
fix->orig = NULL;
if (fix->copy)
g_object_unref (fix->copy);
fix->copy = NULL;
}
static void
shared_model_setup (Fixture *fix, gconstpointer data)
{
fix->orig = dee_shared_model_new ("org.example.ThisIsNotATest");
dee_model_set_schema (fix->orig, "i", "s", NULL);
fix->copy = NULL;
g_assert (DEE_IS_SHARED_MODEL (fix->orig));
}
static void
shared_model_teardown (Fixture *fix, gconstpointer data)
{
g_object_unref (fix->orig);
fix->orig = NULL;
if (fix->copy)
g_object_unref (fix->copy);
fix->copy = NULL;
}
static void
dee_assert_cmpmodel (DeeModel *m1, DeeModel *m2)
{
guint i, j, n_cols, n_rows;
DeeModelIter *row1, *row2;
GVariant *v1, *v2;
g_assert (m1 != NULL);
g_assert (m2 != NULL);
g_assert (DEE_IS_MODEL (m1));
g_assert (DEE_IS_MODEL (m2));
g_assert_cmpint (dee_model_get_n_columns (m1), ==, dee_model_get_n_columns (m2));
g_assert_cmpint (dee_model_get_n_rows (m1), ==, dee_model_get_n_rows (m2));
n_cols = dee_model_get_n_columns (m1);
for (i = 0; i < n_cols; i++)
{
g_assert_cmpstr (dee_model_get_column_schema (m1, i), ==, dee_model_get_column_schema (m1, i));
}
n_rows = dee_model_get_n_rows (m1);
for (i = 0; i < n_rows; i++)
{
row1 = dee_model_get_iter_at_row (m1, i);
row2 = dee_model_get_iter_at_row (m2, i);
for (j = 0; j < n_cols; j++)
{
v1 = dee_model_get_value (m1, row1, j);
v2 = dee_model_get_value (m2, row2, j);
g_assert (g_variant_equal (v1, v2));
g_variant_unref (v1);
g_variant_unref (v2);
}
}
if (DEE_IS_SERIALIZABLE_MODEL (m1) && DEE_IS_SERIALIZABLE_MODEL (m2))
{
g_assert_cmpuint(dee_serializable_model_get_seqnum (m1), ==, dee_serializable_model_get_seqnum (m2));
}
if (DEE_IS_SHARED_MODEL (m1) && DEE_IS_SHARED_MODEL (m2))
{
g_assert_cmpstr (dee_shared_model_get_swarm_name (DEE_SHARED_MODEL (m1)), ==, dee_shared_model_get_swarm_name (DEE_SHARED_MODEL (m2)));
}
}
static void
test_model_zero_rows (Fixture *fix, gconstpointer data)
{
GVariant *vdata;
vdata = dee_serializable_externalize (DEE_SERIALIZABLE (fix->orig));
g_assert (vdata != NULL);
fix->copy = DEE_MODEL (dee_serializable_parse_external (vdata));
dee_assert_cmpmodel (fix->orig, fix->copy);
}
static void
test_model_one_rows (Fixture *fix, gconstpointer data)
{
GVariant *vdata;
dee_model_append (fix->orig, 27, "Hello world");
vdata = dee_serializable_externalize (DEE_SERIALIZABLE (fix->orig));
g_assert (vdata != NULL);
fix->copy = DEE_MODEL (dee_serializable_parse_external (vdata));
dee_assert_cmpmodel (fix->orig, fix->copy);
}
static void
test_model_two_rows (Fixture *fix, gconstpointer data)
{
GVariant *vdata;
dee_model_append (fix->orig, 27, "Hello world");
dee_model_append (fix->orig, 68, "Hola Mars");
vdata = dee_serializable_externalize (DEE_SERIALIZABLE (fix->orig));
g_assert (vdata != NULL);
fix->copy = DEE_MODEL (dee_serializable_parse_external (vdata));
dee_assert_cmpmodel (fix->orig, fix->copy);
}
static void
test_model_non_zero_seqnum_offset (Fixture *fix, gconstpointer data)
{
GVariant *vdata;
DeeModelIter *first_row;
first_row = dee_model_append (fix->orig, 27, "Hello world");
dee_model_append (fix->orig, 68, "Hola Mars");
dee_model_remove (fix->orig, first_row);
vdata = dee_serializable_externalize (DEE_SERIALIZABLE (fix->orig));
g_assert (vdata != NULL);
fix->copy = DEE_MODEL (dee_serializable_parse_external (vdata));
g_assert_cmpuint (1, ==, dee_model_get_n_rows (fix->copy));
g_assert_cmpuint (3, ==, dee_serializable_model_get_seqnum (fix->copy));
dee_assert_cmpmodel (fix->orig, fix->copy);
}