5
#include <glib-object.h>
7
#include <json-glib/json-glib.h>
8
#include <json-glib/json-gobject.h>
10
#define TEST_TYPE_ENUM (test_enum_get_type ())
11
#define TEST_TYPE_BOXED (test_boxed_get_type ())
12
#define TEST_TYPE_OBJECT (test_object_get_type ())
13
#define TEST_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_OBJECT, TestObject))
14
#define TEST_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_OBJECT))
15
#define TEST_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TEST_TYPE_OBJECT, TestObjectClass))
16
#define TEST_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TEST_TYPE_OBJECT))
17
#define TEST_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_TYPE_OBJECT, TestObjectClass))
25
typedef struct _TestBoxed TestBoxed;
26
typedef struct _TestObject TestObject;
27
typedef struct _TestObjectClass TestObjectClass;
37
GObject parent_instance;
49
struct _TestObjectClass
51
GObjectClass parent_class;
54
GType test_object_get_type (void);
56
/*** implementation ***/
59
test_boxed_copy (const TestBoxed *src)
61
TestBoxed *copy = g_slice_new (TestBoxed);
69
test_boxed_free (TestBoxed *boxed)
73
g_slice_free (TestBoxed, boxed);
78
test_boxed_get_type (void)
80
static GType b_type = 0;
82
if (G_UNLIKELY (b_type == 0))
83
b_type = g_boxed_type_register_static ("TestBoxed",
84
(GBoxedCopyFunc) test_boxed_copy,
85
(GBoxedFreeFunc) test_boxed_free);
91
test_enum_get_type (void)
93
static GType e_type = 0;
95
if (G_UNLIKELY (e_type == 0))
97
static const GEnumValue values[] = {
98
{ TEST_ENUM_FOO, "TEST_ENUM_FOO", "foo" },
99
{ TEST_ENUM_BAR, "TEST_ENUM_BAR", "bar" },
100
{ TEST_ENUM_BAZ, "TEST_ENUM_BAZ", "baz" },
104
e_type = g_enum_register_static ("TestEnum", values);
123
static void json_serializable_iface_init (gpointer g_iface);
125
G_DEFINE_TYPE_WITH_CODE (TestObject, test_object, G_TYPE_OBJECT,
126
G_IMPLEMENT_INTERFACE (JSON_TYPE_SERIALIZABLE,
127
json_serializable_iface_init));
130
test_object_serialize_property (JsonSerializable *serializable,
137
if (strcmp (name, "blah") == 0)
142
retval = json_node_new (JSON_NODE_OBJECT);
143
obj = json_object_new ();
145
boxed = g_value_get_boxed (value);
147
json_object_set_int_member (obj, "foo", boxed->foo);
148
json_object_set_boolean_member (obj, "bar", boxed->bar);
150
json_node_take_object (retval, obj);
152
test_boxed_free (boxed);
156
GValue copy = { 0, };
158
retval = json_node_new (JSON_NODE_VALUE);
160
g_value_init (©, G_PARAM_SPEC_VALUE_TYPE (pspec));
161
g_value_copy (value, ©);
162
json_node_set_value (retval, ©);
163
g_value_unset (©);
170
json_serializable_iface_init (gpointer g_iface)
172
JsonSerializableIface *iface = g_iface;
174
iface->serialize_property = test_object_serialize_property;
178
test_object_finalize (GObject *gobject)
180
g_free (TEST_OBJECT (gobject)->baz);
181
g_strfreev (TEST_OBJECT (gobject)->mah);
183
if (TEST_OBJECT (gobject)->test != NULL)
184
g_object_unref (TEST_OBJECT (gobject)->test);
186
G_OBJECT_CLASS (test_object_parent_class)->finalize (gobject);
190
test_object_set_property (GObject *gobject,
198
TEST_OBJECT (gobject)->foo = g_value_get_int (value);
202
TEST_OBJECT (gobject)->bar = g_value_get_boolean (value);
206
g_free (TEST_OBJECT (gobject)->baz);
207
TEST_OBJECT (gobject)->baz = g_value_dup_string (value);
211
TEST_OBJECT (gobject)->meh = g_value_get_enum (value);
215
TEST_OBJECT (gobject)->mah = g_strdupv (g_value_get_boxed (value));
219
TEST_OBJECT (gobject)->test = g_value_dup_object (value);
223
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
228
test_object_get_property (GObject *gobject,
236
g_value_set_int (value, TEST_OBJECT (gobject)->foo);
240
g_value_set_boolean (value, TEST_OBJECT (gobject)->bar);
244
g_value_set_string (value, TEST_OBJECT (gobject)->baz);
248
g_value_set_boxed (value, &(TEST_OBJECT (gobject)->blah));
252
g_value_set_enum (value, TEST_OBJECT (gobject)->meh);
256
g_value_set_boxed (value, TEST_OBJECT (gobject)->mah);
260
g_value_set_object (value, TEST_OBJECT (gobject)->test);
264
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
269
test_object_class_init (TestObjectClass *klass)
271
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
273
gobject_class->set_property = test_object_set_property;
274
gobject_class->get_property = test_object_get_property;
275
gobject_class->finalize = test_object_finalize;
277
g_object_class_install_property (gobject_class,
279
g_param_spec_int ("foo", "Foo", "Foo",
282
g_object_class_install_property (gobject_class,
284
g_param_spec_boolean ("bar", "Bar", "Bar",
287
G_PARAM_CONSTRUCT_ONLY));
288
g_object_class_install_property (gobject_class,
290
g_param_spec_string ("baz", "Baz", "Baz",
293
g_object_class_install_property (gobject_class,
295
g_param_spec_boxed ("blah", "Blah", "Blah",
298
g_object_class_install_property (gobject_class,
300
g_param_spec_enum ("meh", "Meh", "Meh",
304
g_object_class_install_property (gobject_class,
306
g_param_spec_boxed ("mah", "Mah", "Mah",
309
g_object_class_install_property (gobject_class,
311
g_param_spec_object ("test", "Test", "Test",
317
test_object_init (TestObject *object)
323
object->blah.foo = object->foo;
324
object->blah.bar = object->bar;
326
object->meh = TEST_ENUM_BAR;
333
static const gchar *var_test =
337
" \"baz\" : \"hello\",\n"
338
" \"meh\" : \"baz\",\n"
339
" \"mah\" : [ \"hello\", \", \", \"world\", \"!\" ],\n"
342
" \"baz\" : \"world\",\n"
343
" \"meh\" : \"foo\"\n"
348
test_deserialize (void)
356
object = json_gobject_from_data (TEST_TYPE_OBJECT, var_test, -1, &error);
358
g_error ("*** Unable to parse buffer: %s\n", error->message);
360
if (g_test_verbose ())
361
g_print ("*** TestObject ***\n"
366
TEST_OBJECT (object)->foo == 42 ? "<true>" : "<false>",
367
TEST_OBJECT (object)->bar == TRUE ? "<true>" : "<false>",
368
TEST_OBJECT (object)->baz != NULL ? "<true>" : "<false>",
369
TEST_OBJECT (object)->meh == TEST_ENUM_BAZ ? "<true>" : "<false>");
371
g_assert_cmpint (TEST_OBJECT (object)->foo, ==, 42);
372
g_assert (TEST_OBJECT (object)->bar);
373
g_assert_cmpstr (TEST_OBJECT (object)->baz, ==, "hello");
374
g_assert_cmpint (TEST_OBJECT (object)->meh, ==, TEST_ENUM_BAZ);
376
g_assert (TEST_OBJECT (object)->mah != NULL);
377
g_assert_cmpint (g_strv_length (TEST_OBJECT (object)->mah), ==, 4);
379
str = g_strjoinv (NULL, TEST_OBJECT (object)->mah);
380
g_assert_cmpstr (str, ==, "hello, world!");
383
g_assert (TEST_IS_OBJECT (TEST_OBJECT (object)->test));
384
test = TEST_OBJECT (TEST_OBJECT (object)->test);
385
g_assert (test->bar);
386
g_assert_cmpstr (test->baz, ==, "world");
387
g_assert_cmpint (test->meh, ==, TEST_ENUM_FOO);
389
g_object_unref (object);
397
g_test_init (&argc, &argv, NULL);
399
g_test_add_func ("/deserialize/json-to-gobject", test_deserialize);
401
return g_test_run ();