tests.c
author Fabien Ninoles <fabien@tzone.org>
Sun, 07 Oct 2012 14:30:52 -0400
changeset 1 ef7abb48573b
parent 0 tests.cpp@d187e7fc9970
permissions -rw-r--r--
Convert to C api.

#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;
};