Rename C-based tests
[yaz-moved-to-github.git] / test / test_json.c
diff --git a/test/test_json.c b/test/test_json.c
new file mode 100644 (file)
index 0000000..eace27e
--- /dev/null
@@ -0,0 +1,213 @@
+/**
+ * \file 
+ * \brief JSON test
+ */
+#include <yaz/test.h>
+#include <yaz/json.h>
+#include <string.h>
+#include <yaz/log.h>
+
+static int expect(json_parser_t p, const char *input, 
+                  const char *output)
+{
+    int ret = 0;
+    struct json_node *n;
+
+    n = json_parser_parse(p, input);
+    if (n == 0 && output == 0)
+        ret = 1;
+    else if (n && output)
+    {
+        WRBUF result = wrbuf_alloc();
+
+        json_write_wrbuf(n, result);
+        if (strcmp(wrbuf_cstr(result), output) == 0)
+            ret = 1;
+        else
+        {
+            yaz_log(YLOG_WARN, "expected '%s' but got '%s'",
+                    output, wrbuf_cstr(result));
+        }
+        wrbuf_destroy(result);
+    }
+    else if (!n)
+    {
+        yaz_log(YLOG_WARN, "expected '%s' but got error '%s'",
+                output, json_parser_get_errmsg(p));
+    }
+    json_remove_node(n);
+    return ret;
+}
+
+static void tst1(void)
+{
+    json_parser_t p = json_parser_create();
+
+    YAZ_CHECK(p);
+    if (!p)
+        return;
+
+    YAZ_CHECK(expect(p, "", 0));
+
+    YAZ_CHECK(expect(p, "1234", "1234"));
+
+    YAZ_CHECK(expect(p, "[ 1234 ]", "[1234]"));
+
+    YAZ_CHECK(expect(p, "{\"k\":tru}", 0));
+
+    YAZ_CHECK(expect(p, "{\"k\":null", 0));
+
+    YAZ_CHECK(expect(p, "{\"k\":nullx}", 0));
+
+    YAZ_CHECK(expect(p, "{\"k\":-", 0));
+
+    YAZ_CHECK(expect(p, "{\"k\":+", 0));
+
+    YAZ_CHECK(expect(p, "{\"k\":\"a}", 0));
+
+    YAZ_CHECK(expect(p, "{\"k\":\"a", 0));
+
+    YAZ_CHECK(expect(p, "{\"k\":\"", 0));
+
+    YAZ_CHECK(expect(p, "{", 0));
+
+    YAZ_CHECK(expect(p, "{}", "{}"));
+
+    YAZ_CHECK(expect(p, "{}  extra", 0));
+
+    YAZ_CHECK(expect(p, "{\"a\":[1,2,3}", 0));
+    
+    YAZ_CHECK(expect(p, "{\"a\":[1,2,", 0));
+
+    YAZ_CHECK(expect(p, "{\"k\":\"wa\"}", "{\"k\":\"wa\"}"));
+
+    YAZ_CHECK(expect(p, "{\"k\":null}", "{\"k\":null}"));
+
+    YAZ_CHECK(expect(p, "{\"k\":false}", "{\"k\":false}"));
+
+    YAZ_CHECK(expect(p, "{\"k\":true}", "{\"k\":true}"));
+
+    YAZ_CHECK(expect(p, "{\"k\":12}", "{\"k\":12}"));
+
+    YAZ_CHECK(expect(p, "{\"k\":-12}", "{\"k\":-12}"));
+
+    YAZ_CHECK(expect(p, "{\"k\":1.2e6}", "{\"k\":1.2e+06}"));
+
+    YAZ_CHECK(expect(p, "{\"k\":1e3}", "{\"k\":1000}"));
+
+    YAZ_CHECK(expect(p, "{\"k\":\"\"}", "{\"k\":\"\"}"));
+
+    YAZ_CHECK(expect(p, "{\"a\":1,\"b\":2}", "{\"a\":1,\"b\":2}"));
+
+    YAZ_CHECK(expect(p, "{\"a\":1,\"b\":2,\"c\":3}",
+                     "{\"a\":1,\"b\":2,\"c\":3}"));
+
+    YAZ_CHECK(expect(p, "{\"a\":[]}", "{\"a\":[]}"));
+
+    YAZ_CHECK(expect(p, "{\"a\":[1]}", "{\"a\":[1]}"));
+
+    YAZ_CHECK(expect(p, "{\"a\":[1,2]}", "{\"a\":[1,2]}"));
+
+    YAZ_CHECK(expect(p, "{\"a\":[1,2,3]}", "{\"a\":[1,2,3]}"));
+
+    YAZ_CHECK(expect(p, "{\"k\":\"\\t\"}", "{\"k\":\"\x09\"}"));
+
+    YAZ_CHECK(expect(p, "{\"k\":\"\\u0009\"}", "{\"k\":\"\x09\"}"));
+
+    json_parser_destroy(p);
+}
+
+static void tst2(void)
+{
+    struct json_node *n, *n1;
+
+    n = json_parse("{\"a\":1,\"b\":2,\"c\":[true,false,null]}", 0);
+    YAZ_CHECK(n);
+    if (!n)
+        return;
+
+    YAZ_CHECK_EQ(json_count_children(n), 3);
+    
+    n1 = json_get_object(n, "a");
+    YAZ_CHECK(n1 && n1->type == json_node_number && n1->u.number == 1.0);
+    YAZ_CHECK_EQ(json_count_children(n1), 0);
+
+    n1 = json_get_object(n, "b");
+    YAZ_CHECK(n1 && n1->type == json_node_number && n1->u.number == 2.0);
+    YAZ_CHECK_EQ(json_count_children(n1), 0);
+
+    n1 = json_get_object(n, "b");
+    YAZ_CHECK(n1 && n1->type == json_node_number && n1->u.number == 2.0);
+    YAZ_CHECK_EQ(json_count_children(n1), 0);
+
+    n1 = json_get_object(n, "c");
+    YAZ_CHECK(n1 && n1->type == json_node_array);
+    YAZ_CHECK_EQ(json_count_children(n1), 3);
+
+    n1 = json_get_elem(json_get_object(n, "c"), 0);
+    YAZ_CHECK(n1 && n1->type == json_node_true);
+
+    n1 = json_get_elem(json_get_object(n, "c"), 1);
+    YAZ_CHECK(n1 && n1->type == json_node_false);
+
+    n1 = json_get_elem(json_get_object(n, "c"), 2);
+    YAZ_CHECK(n1 && n1->type == json_node_null);
+
+    n1 = json_get_elem(json_get_object(n, "c"), 3);
+    YAZ_CHECK(n1 == 0);
+
+    json_remove_node(n);
+}
+
+static int append_check(const char *a, const char *b, const char *exp)
+{
+    WRBUF w = wrbuf_alloc();
+    struct json_node *n_a, *n_b;
+    int ret = 0;
+
+    n_a = json_parse(a, 0);
+    n_b = json_parse(b, 0);
+    json_append_array(json_get_object(n_a, "a"),
+                      json_detach_object(n_b, "b"));
+
+    json_write_wrbuf(n_a, w);
+
+    if (!strcmp(wrbuf_cstr(w), exp))
+        ret = 1;
+    wrbuf_destroy(w);
+    json_remove_node(n_a);
+    json_remove_node(n_b);
+    return ret;
+}
+
+static void tst3(void)
+{
+    YAZ_CHECK(append_check("{\"a\":[1,2,3]}", "{\"b\":[5,6,7]}",
+                           "{\"a\":[1,2,3,5,6,7]}"));
+
+    YAZ_CHECK(append_check("{\"a\":[]}", "{\"b\":[5,6,7]}",
+                           "{\"a\":[5,6,7]}"));
+
+    YAZ_CHECK(append_check("{\"a\":[1,2,3]}", "{\"b\":[]}",
+                           "{\"a\":[1,2,3]}"));
+}
+
+int main (int argc, char **argv)
+{
+    YAZ_CHECK_INIT(argc, argv);
+    tst1();
+    tst2();
+    tst3();
+    YAZ_CHECK_TERM;
+}
+
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+
+