summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/Makefile.am8
-rw-r--r--tests/test-02.c73
-rw-r--r--tests/test-03.c211
3 files changed, 285 insertions, 7 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 0ad7195..b1ddc68 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,6 +1,7 @@
-noinst_PROGRAMS = \
- test-01 \
- test-02
+noinst_PROGRAMS = \
+ test-01 \
+ test-02 \
+ test-03
INCLUDES = -I$(top_srcdir)
LDADD = $(top_builddir)/json-glib/libjson-glib-1.0.la
@@ -10,3 +11,4 @@ AM_LDFLAGS = $(JSON_LIBS)
test_01_SOURCES = test-01.c
test_02_SOURCES = test-02.c
+test_03_SOURCES = test-03.c
diff --git a/tests/test-02.c b/tests/test-02.c
index 78047bb..c4ca4ae 100644
--- a/tests/test-02.c
+++ b/tests/test-02.c
@@ -11,10 +11,16 @@ static const gchar *test_arrays[] = {
"[ 42, [ ], null ]",
"[ [ ], [ true, [ true ] ] ]",
"[ [ false, true, 42 ], [ true, false, 3.14 ], \"test\" ]"
+ "[ true, { } ]",
+ "[ false, { \"test\" : 42 } ]",
};
static guint n_test_arrays = G_N_ELEMENTS (test_arrays);
+static void print_array (gint indent, JsonArray *array);
+static void print_value (gint indent, JsonNode *node);
+static void print_object (gint indent, JsonObject *object);
+
static void
print_value (gint indent,
JsonNode *node)
@@ -90,26 +96,85 @@ print_array (gint indent,
switch (JSON_NODE_TYPE (node))
{
case JSON_NODE_ARRAY:
- g_print ("%sFound array (len:%d)\n",
+ g_print ("%sFound array (index: %d, len: %d)\n",
indent_str,
+ j,
json_array_get_length (json_node_get_array (node)));
print_array (indent + 1, json_node_get_array (node));
break;
case JSON_NODE_OBJECT:
- g_print ("%sFound object (size:%d)\n",
+ g_print ("%sFound object (index: %d, size: %d)\n",
indent_str,
+ j,
json_object_get_size (json_node_get_object (node)));
+ print_object (indent + 1, json_node_get_object (node));
break;
case JSON_NODE_VALUE:
- print_value (indent, node);
+ g_print ("%sFound value (index: %d)\n", indent_str, j);
+ print_value (indent + 1, node);
break;
case JSON_NODE_NULL:
- g_print ("%sFound null\n", indent_str);
+ g_print ("%sFound null (index: %d)\n", indent_str, j);
break;
}
}
}
+static void
+print_object (gint indent,
+ JsonObject *object)
+{
+ gint object_size = json_object_get_size (object);
+ gint j;
+ gchar indent_str[80];
+ GList *members, *l;
+
+ for (j = 0; j < indent; j++)
+ indent_str[j] = ' ';
+
+ indent_str[j] = '\0';
+
+ if (object_size == 0)
+ {
+ g_print ("%sFound empty object\n", indent_str);
+ return;
+ }
+
+ members = json_object_get_members (object);
+ for (l = members; l; l = l->next)
+ {
+ const gchar *name = l->data;
+ JsonNode *node = json_object_get_member (object, name);
+
+ switch (JSON_NODE_TYPE (node))
+ {
+ case JSON_NODE_ARRAY:
+ g_print ("%sFound array (member: `%s', len: %d)\n",
+ indent_str,
+ name,
+ json_array_get_length (json_node_get_array (node)));
+ print_array (indent + 1, json_node_get_array (node));
+ break;
+ case JSON_NODE_OBJECT:
+ g_print ("%sFound object (member: `%s', size: %d)\n",
+ indent_str,
+ name,
+ json_object_get_size (json_node_get_object (node)));
+ print_object (indent + 1, json_node_get_object (node));
+ break;
+ case JSON_NODE_VALUE:
+ g_print ("%sFound value (member: `%s')\n", indent_str, name);
+ print_value (indent + 1, node);
+ break;
+ case JSON_NODE_NULL:
+ g_print ("%sFound null (member: `%s')\n", indent_str, name);
+ break;
+ }
+ }
+
+ g_list_free (members);
+}
+
int
main (int argc, char *argv[])
{
diff --git a/tests/test-03.c b/tests/test-03.c
new file mode 100644
index 0000000..129f4c5
--- /dev/null
+++ b/tests/test-03.c
@@ -0,0 +1,211 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <json-glib/json-glib.h>
+
+static const gchar *test_objects[] = {
+ "{ }",
+};
+
+static guint n_test_objects = G_N_ELEMENTS (test_objects);
+
+static void print_array (gint indent, JsonArray *array);
+static void print_value (gint indent, JsonNode *node);
+static void print_object (gint indent, JsonObject *object);
+
+static void
+print_value (gint indent,
+ JsonNode *node)
+{
+ gint j;
+ gchar indent_str[80];
+ GValue value = { 0, };
+
+ for (j = 0; j < indent; j++)
+ indent_str[j] = ' ';
+
+ indent_str[j] = '\0';
+
+ json_node_get_value (node, &value);
+
+ switch (G_VALUE_TYPE (&value))
+ {
+ case G_TYPE_INT:
+ g_print ("%sFound integer: `%d'\n",
+ indent_str,
+ g_value_get_int (&value));
+ break;
+
+ case G_TYPE_STRING:
+ g_print ("%sFound string: `%s'\n",
+ indent_str,
+ g_value_get_string (&value));
+ break;
+
+ case G_TYPE_FLOAT:
+ g_print ("%sFound float: `%f'\n",
+ indent_str,
+ g_value_get_float (&value));
+ break;
+
+ case G_TYPE_BOOLEAN:
+ g_print ("%sFound boolean: `%s'\n",
+ indent_str,
+ g_value_get_boolean (&value) ? "true" : "false");
+ break;
+
+ default:
+ g_print ("%sUnknown value\n", indent_str);
+ break;
+ }
+
+ g_value_unset (&value);
+}
+
+static void
+print_array (gint indent,
+ JsonArray *array)
+{
+ gint array_len = json_array_get_length (array);
+ gint j;
+ gchar indent_str[80];
+
+ for (j = 0; j < indent; j++)
+ indent_str[j] = ' ';
+
+ indent_str[j] = '\0';
+
+ if (array_len == 0)
+ {
+ g_print ("%sFound empty array\n", indent_str);
+ return;
+ }
+
+ for (j = 0; j < array_len; j++)
+ {
+ JsonNode *node = json_array_get_element (array, j);
+
+ switch (JSON_NODE_TYPE (node))
+ {
+ case JSON_NODE_ARRAY:
+ g_print ("%sFound array (index: %d, len: %d)\n",
+ indent_str,
+ j,
+ json_array_get_length (json_node_get_array (node)));
+ print_array (indent + 1, json_node_get_array (node));
+ break;
+ case JSON_NODE_OBJECT:
+ g_print ("%sFound object (index: %d, size: %d)\n",
+ indent_str,
+ j,
+ json_object_get_size (json_node_get_object (node)));
+ print_object (indent + 1, json_node_get_object (node));
+ break;
+ case JSON_NODE_VALUE:
+ g_print ("%sFound value (index: %d)\n", indent_str, j);
+ print_value (indent + 1, node);
+ break;
+ case JSON_NODE_NULL:
+ g_print ("%sFound null (index: %d)\n", indent_str, j);
+ break;
+ }
+ }
+}
+
+static void
+print_object (gint indent,
+ JsonObject *object)
+{
+ gint object_size = json_object_get_size (object);
+ gint j;
+ gchar indent_str[80];
+ GList *members, *l;
+
+ for (j = 0; j < indent; j++)
+ indent_str[j] = ' ';
+
+ indent_str[j] = '\0';
+
+ if (object_size == 0)
+ {
+ g_print ("%sFound empty object\n", indent_str);
+ return;
+ }
+
+ members = json_object_get_members (object);
+ for (l = members; l; l = l->next)
+ {
+ const gchar *name = l->data;
+ JsonNode *node = json_object_get_member (object, name);
+
+ switch (JSON_NODE_TYPE (node))
+ {
+ case JSON_NODE_ARRAY:
+ g_print ("%sFound array (member: `%s', len: %d)\n",
+ indent_str,
+ name,
+ json_array_get_length (json_node_get_array (node)));
+ print_array (indent + 1, json_node_get_array (node));
+ break;
+ case JSON_NODE_OBJECT:
+ g_print ("%sFound object (member: `%s', size: %d)\n",
+ indent_str,
+ name,
+ json_object_get_size (json_node_get_object (node)));
+ print_object (indent + 1, json_node_get_object (node));
+ break;
+ case JSON_NODE_VALUE:
+ g_print ("%sFound value (member: `%s')\n", indent_str, name);
+ print_value (indent + 1, node);
+ break;
+ case JSON_NODE_NULL:
+ g_print ("%sFound null (member: `%s')\n", indent_str, name);
+ break;
+ }
+ }
+
+ g_list_free (members);
+}
+
+int
+main (int argc, char *argv[])
+{
+ JsonParser *parser;
+ gint i;
+
+ g_type_init ();
+
+ parser = json_parser_new ();
+
+ for (i = 0; i < n_test_objects; i++)
+ {
+ GError *error = NULL;
+ JsonNode *node;
+ JsonObject *object;
+
+ if (!json_parser_load_from_data (parser, test_objects[i], -1, &error))
+ {
+ g_print ("* Error, test %d:\n"
+ "* \t%s:\n"
+ "* Message: %s\n",
+ i, test_objects[i], error->message);
+ g_error_free (error);
+ g_object_unref (parser);
+ return EXIT_FAILURE;
+ }
+
+ node = json_parser_get_root (parser);
+ g_assert (node != NULL);
+ g_assert (JSON_NODE_TYPE (node) == JSON_NODE_OBJECT);
+
+ object = json_node_get_object (node);
+ g_assert (object != NULL);
+
+ g_print ("*** Test %d ***\n", i);
+ print_object (1, object);
+ }
+
+ g_object_unref (parser);
+
+ return EXIT_SUCCESS;
+}