summaryrefslogtreecommitdiff
path: root/json-glib/tests/generator.c
diff options
context:
space:
mode:
Diffstat (limited to 'json-glib/tests/generator.c')
-rw-r--r--json-glib/tests/generator.c330
1 files changed, 330 insertions, 0 deletions
diff --git a/json-glib/tests/generator.c b/json-glib/tests/generator.c
new file mode 100644
index 0000000..5cc8b92
--- /dev/null
+++ b/json-glib/tests/generator.c
@@ -0,0 +1,330 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <glib.h>
+
+#include <json-glib/json-glib.h>
+
+#include <locale.h>
+
+static const gchar *empty_array = "[]";
+static const gchar *empty_object = "{}";
+
+static const gchar *simple_array = "[true,false,null,42,\"foo\"]";
+static const gchar *nested_array = "[true,[false,null],42]";
+
+static const gchar *simple_object = "{\"Bool1\":true,\"Bool2\":false,\"Null\":null,\"Int\":42,\"String\":\"foo\"}";
+/* taken from the RFC 4627, Examples section */
+static const gchar *nested_object =
+"{"
+ "\"Image\":{"
+ "\"Width\":800,"
+ "\"Height\":600,"
+ "\"Title\":\"View from 15th Floor\","
+ "\"Thumbnail\":{"
+ "\"Url\":\"http://www.example.com/image/481989943\","
+ "\"Height\":125,"
+ "\"Width\":\"100\""
+ "},"
+ "\"IDs\":[116,943,234,38793]"
+ "}"
+"}";
+
+static const struct {
+ const gchar *lang;
+ const gchar *sep;
+ guint matches : 1;
+} decimal_separator[] = {
+ { "C", ".", TRUE },
+ { "de", ",", FALSE },
+ { "en", ".", TRUE },
+ { "fr", ",", FALSE }
+};
+
+static void
+test_empty_array (void)
+{
+ JsonGenerator *gen = json_generator_new ();
+ JsonNode *root;
+ gchar *data;
+ gsize len;
+
+ root = json_node_new (JSON_NODE_ARRAY);
+ json_node_take_array (root, json_array_new ());
+
+ json_generator_set_root (gen, root);
+ g_object_set (gen, "pretty", FALSE, NULL);
+
+ data = json_generator_to_data (gen, &len);
+
+ g_assert_cmpint (len, ==, strlen (empty_array));
+ g_assert_cmpstr (data, ==, empty_array);
+
+ g_free (data);
+ json_node_free (root);
+ g_object_unref (gen);
+}
+
+static void
+test_empty_object (void)
+{
+ JsonGenerator *gen = json_generator_new ();
+ JsonNode *root;
+ gchar *data;
+ gsize len;
+
+ root = json_node_new (JSON_NODE_OBJECT);
+ json_node_take_object (root, json_object_new ());
+
+ json_generator_set_root (gen, root);
+ g_object_set (gen, "pretty", FALSE, NULL);
+
+ data = json_generator_to_data (gen, &len);
+
+ g_assert_cmpint (len, ==, strlen (empty_object));
+ g_assert_cmpstr (data, ==, empty_object);
+
+ g_free (data);
+ json_node_free (root);
+ g_object_unref (gen);
+}
+
+static void
+test_simple_array (void)
+{
+ JsonGenerator *generator = json_generator_new ();
+ JsonNode *root;
+ JsonArray *array;
+ gchar *data;
+ gsize len;
+
+ root = json_node_new (JSON_NODE_ARRAY);
+ array = json_array_sized_new (5);
+
+ json_array_add_boolean_element (array, TRUE);
+ json_array_add_boolean_element (array, FALSE);
+ json_array_add_null_element (array);
+ json_array_add_int_element (array, 42);
+ json_array_add_string_element (array, "foo");
+
+ json_node_take_array (root, array);
+ json_generator_set_root (generator, root);
+
+ g_object_set (generator, "pretty", FALSE, NULL);
+ data = json_generator_to_data (generator, &len);
+
+ if (g_test_verbose ())
+ g_print ("checking simple array `%s' (expected: %s)\n",
+ data,
+ simple_array);
+
+ g_assert_cmpint (len, ==, strlen (simple_array));
+ g_assert_cmpstr (data, ==, simple_array);
+
+ g_free (data);
+ json_node_free (root);
+ g_object_unref (generator);
+}
+
+static void
+test_nested_array (void)
+{
+ JsonGenerator *generator = json_generator_new ();
+ JsonNode *root;
+ JsonArray *array, *nested;
+ gchar *data;
+ gsize len;
+
+ root = json_node_new (JSON_NODE_ARRAY);
+ array = json_array_sized_new (3);
+
+ json_array_add_boolean_element (array, TRUE);
+
+ {
+ nested = json_array_sized_new (2);
+
+ json_array_add_boolean_element (nested, FALSE);
+ json_array_add_null_element (nested);
+
+ json_array_add_array_element (array, nested);
+ }
+
+ json_array_add_int_element (array, 42);
+
+ json_node_take_array (root, array);
+ json_generator_set_root (generator, root);
+
+ g_object_set (generator, "pretty", FALSE, NULL);
+ data = json_generator_to_data (generator, &len);
+
+ g_assert_cmpint (len, ==, strlen (nested_array));
+ g_assert_cmpstr (data, ==, nested_array);
+
+ g_free (data);
+ json_node_free (root);
+ g_object_unref (generator);
+}
+
+static void
+test_simple_object (void)
+{
+ JsonGenerator *generator = json_generator_new ();
+ JsonNode *root;
+ JsonObject *object;
+ gchar *data;
+ gsize len;
+
+ root = json_node_new (JSON_NODE_OBJECT);
+ object = json_object_new ();
+
+ json_object_set_boolean_member (object, "Bool1", TRUE);
+ json_object_set_boolean_member (object, "Bool2", FALSE);
+ json_object_set_null_member (object, "Null");
+ json_object_set_int_member (object, "Int", 42);
+ json_object_set_string_member (object, "String", "foo");
+
+ json_node_take_object (root, object);
+ json_generator_set_root (generator, root);
+
+ g_object_set (generator, "pretty", FALSE, NULL);
+ data = json_generator_to_data (generator, &len);
+
+ if (g_test_verbose ())
+ g_print ("checking simple object `%s' (expected: %s)\n",
+ data,
+ simple_object);
+
+ g_assert_cmpint (len, ==, strlen (simple_object));
+ g_assert_cmpstr (data, ==, simple_object);
+
+ g_free (data);
+ json_node_free (root);
+ g_object_unref (generator);
+}
+
+static void
+test_nested_object (void)
+{
+ JsonGenerator *generator = json_generator_new ();
+ JsonNode *root;
+ JsonObject *object, *nested;
+ JsonArray *array;
+ gchar *data;
+ gsize len;
+
+ root = json_node_new (JSON_NODE_OBJECT);
+ object = json_object_new ();
+
+ json_object_set_int_member (object, "Width", 800);
+ json_object_set_int_member (object, "Height", 600);
+ json_object_set_string_member (object, "Title", "View from 15th Floor");
+
+ {
+ nested = json_object_new ();
+
+ json_object_set_string_member (nested, "Url", "http://www.example.com/image/481989943");
+ json_object_set_int_member (nested, "Height", 125);
+ json_object_set_string_member (nested, "Width", "100");
+
+ json_object_set_object_member (object, "Thumbnail", nested);
+ }
+
+ {
+ array = json_array_new ();
+
+ json_array_add_int_element (array, 116);
+ json_array_add_int_element (array, 943);
+ json_array_add_int_element (array, 234);
+ json_array_add_int_element (array, 38793);
+
+ json_object_set_array_member (object, "IDs", array);
+ }
+
+ nested = json_object_new ();
+ json_object_set_object_member (nested, "Image", object);
+
+ json_node_take_object (root, nested);
+ json_generator_set_root (generator, root);
+
+ g_object_set (generator, "pretty", FALSE, NULL);
+ data = json_generator_to_data (generator, &len);
+
+ if (g_test_verbose ())
+ g_print ("checking nested object `%s' (expected: %s)\n",
+ data,
+ nested_object);
+
+ g_assert_cmpint (len, ==, strlen (nested_object));
+ g_assert_cmpstr (data, ==, nested_object);
+
+ g_free (data);
+ json_node_free (root);
+ g_object_unref (generator);
+}
+
+static void
+test_decimal_separator (void)
+{
+ JsonNode *node = json_node_new (JSON_NODE_VALUE);
+ JsonGenerator *generator = json_generator_new ();
+ gchar *old_locale;
+ gint i;
+
+ json_node_set_double (node, 3.14);
+
+ json_generator_set_root (generator, node);
+
+ old_locale = setlocale (LC_NUMERIC, NULL);
+
+ for (i = 0; i < G_N_ELEMENTS (decimal_separator); i++)
+ {
+ gchar *str, *expected;
+
+ setlocale (LC_NUMERIC, decimal_separator[i].lang);
+
+ str = json_generator_to_data (generator, NULL);
+
+ if (g_test_verbose ())
+ g_print ("%s: value: %.2f - string: '%s'\n",
+ G_STRFUNC,
+ json_node_get_double (node),
+ str);
+
+ g_assert (str != NULL);
+ expected = strstr (str, decimal_separator[i].sep);
+ if (decimal_separator[i].matches)
+ g_assert (expected != NULL);
+ else
+ g_assert (expected == NULL);
+
+ g_free (str);
+ }
+
+ setlocale (LC_NUMERIC, old_locale);
+
+ g_object_unref (generator);
+ json_node_free (node);
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ g_type_init ();
+ g_test_init (&argc, &argv, NULL);
+
+ g_test_add_func ("/generator/empty-array", test_empty_array);
+ g_test_add_func ("/generator/empty-object", test_empty_object);
+ g_test_add_func ("/generator/simple-array", test_simple_array);
+ g_test_add_func ("/generator/nested-array", test_nested_array);
+ g_test_add_func ("/generator/simple-object", test_simple_object);
+ g_test_add_func ("/generator/nested-object", test_nested_object);
+ g_test_add_func ("/generator/decimal-separator", test_decimal_separator);
+
+ return g_test_run ();
+}