tests.c
changeset 1 ef7abb48573b
parent 0 d187e7fc9970
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests.c	Sun Oct 07 14:30:52 2012 -0400
@@ -0,0 +1,127 @@
+#include "jsonsax.h"
+
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <stdarg.h>
+
+#define DEBUGTEST
+
+void debug(const char* msg, ...)
+{
+#ifdef DEBUGTEST
+    fprintf(stderr, "\n-*- ");
+    va_list ap;
+    va_start(ap, msg);
+    vfprintf(stderr, msg, ap);
+    va_end(ap);
+    fprintf(stderr, " -*-\n");
+#else
+    (void)msg;
+#endif
+}
+
+const char* TEST_JSONTYPE_STR[] = {
+    "EJSONSAX_OBJECT",
+    "EJSONSAX_ARRAY",
+    "EJSONSAX_STRING",
+    "EJSONSAX_NUMBER",
+    "EJSONSAX_NULL",
+    "EJSONSAX_TRUE",
+    "EJSONSAX_FALSE"
+};
+
+struct test_data
+{
+    const char* m_str;
+};
+
+int test_getchar(void* data)
+{
+    assert(data);
+    struct test_data* t = (struct test_data*)(data);
+    if (t->m_str[0] == 0) return -1;
+#ifdef DEBUGTEST
+    char c = t->m_str[0];
+    fprintf(stderr, "%c", c == ' ' ? '_' : c);
+#endif
+    return *(t->m_str++);
+}
+
+int test_on_start(void* data, enum EJSONSAX_TYPE etype)
+{
+    assert(data);
+    struct test_data* t = (struct test_data*)(data);
+    debug("start %s", TEST_JSONTYPE_STR[etype]);
+
+    switch (etype)
+    {
+case EJSONSAX_OBJECT:
+    assert(t->m_str[-1] == '{');
+    break;
+case EJSONSAX_ARRAY:
+    assert(t->m_str[-1] == '[');
+    break;
+case EJSONSAX_STRING:
+    assert(t->m_str[-1] == '"');
+    break;
+case EJSONSAX_NUMBER:
+    break;
+case EJSONSAX_NULL:
+case EJSONSAX_TRUE:
+case EJSONSAX_FALSE:
+    assert(0);
+}
+    return 0;
+}
+
+int test_on_stop(void* data, enum EJSONSAX_TYPE etype)
+{
+    assert(data);
+    struct test_data* t = (struct test_data*)(data);
+    debug("stop %s", TEST_JSONTYPE_STR[etype]);
+
+    switch (etype)
+    {
+case EJSONSAX_OBJECT:
+    assert(t->m_str[-1] == '}');
+    break;
+case EJSONSAX_ARRAY:
+    assert(t->m_str[-1] == ']');
+    break;
+case EJSONSAX_STRING:
+    assert(t->m_str[-1] == '"');
+    break;
+case EJSONSAX_NUMBER:
+case EJSONSAX_NULL:
+case EJSONSAX_TRUE:
+case EJSONSAX_FALSE:
+    break;
+}
+    return 0;
+}
+
+void test_on_error(void* data, int error)
+{
+    assert(data);
+    debug("Error %d", error);
+}
+
+int main()
+{
+    const char json[] =
+        "{ \"hello\" : [ 11, 12 ,1"
+        "3 ], \n  \"world\" : -3.45e2 }";
+    struct test_data data;
+    data.m_str = json;
+    struct jsonsax_backend tester;
+    memset(&tester, 0, sizeof(tester));
+    tester.m_getchar = &test_getchar;
+    tester.m_onstart = &test_on_start;
+    tester.m_onstop  = &test_on_stop;
+
+    int err = jsonsax_parse(&tester, &data);
+    assert(err == 0);
+
+    return err;
+};