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.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
     1
#include "jsonsax.h"
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     2
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
     3
#include <stdio.h>
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
     4
#include <assert.h>
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
     5
#include <string.h>
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
     6
#include <stdarg.h>
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
     7
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
     8
#define DEBUGTEST
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     9
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    10
void debug(const char* msg, ...)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    11
{
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    12
#ifdef DEBUGTEST
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    13
    fprintf(stderr, "\n-*- ");
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    14
    va_list ap;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    15
    va_start(ap, msg);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    16
    vfprintf(stderr, msg, ap);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    17
    va_end(ap);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    18
    fprintf(stderr, " -*-\n");
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    19
#else
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    20
    (void)msg;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    21
#endif
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    22
}
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    23
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    24
const char* TEST_JSONTYPE_STR[] = {
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    25
    "EJSONSAX_OBJECT",
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    26
    "EJSONSAX_ARRAY",
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    27
    "EJSONSAX_STRING",
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    28
    "EJSONSAX_NUMBER",
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    29
    "EJSONSAX_NULL",
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    30
    "EJSONSAX_TRUE",
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    31
    "EJSONSAX_FALSE"
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    32
};
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    33
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    34
struct test_data
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    35
{
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    36
    const char* m_str;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    37
};
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    38
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    39
int test_getchar(void* data)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    40
{
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    41
    assert(data);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    42
    struct test_data* t = (struct test_data*)(data);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    43
    if (t->m_str[0] == 0) return -1;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    44
#ifdef DEBUGTEST
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    45
    char c = t->m_str[0];
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    46
    fprintf(stderr, "%c", c == ' ' ? '_' : c);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    47
#endif
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    48
    return *(t->m_str++);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    49
}
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    50
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    51
int test_on_start(void* data, enum EJSONSAX_TYPE etype)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    52
{
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    53
    assert(data);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    54
    struct test_data* t = (struct test_data*)(data);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    55
    debug("start %s", TEST_JSONTYPE_STR[etype]);
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    56
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    57
    switch (etype)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    58
    {
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    59
case EJSONSAX_OBJECT:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    60
    assert(t->m_str[-1] == '{');
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    61
    break;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    62
case EJSONSAX_ARRAY:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    63
    assert(t->m_str[-1] == '[');
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    64
    break;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    65
case EJSONSAX_STRING:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    66
    assert(t->m_str[-1] == '"');
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    67
    break;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    68
case EJSONSAX_NUMBER:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    69
    break;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    70
case EJSONSAX_NULL:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    71
case EJSONSAX_TRUE:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    72
case EJSONSAX_FALSE:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    73
    assert(0);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    74
}
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    75
    return 0;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    76
}
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    77
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    78
int test_on_stop(void* data, enum EJSONSAX_TYPE etype)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    79
{
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    80
    assert(data);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    81
    struct test_data* t = (struct test_data*)(data);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    82
    debug("stop %s", TEST_JSONTYPE_STR[etype]);
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    83
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    84
    switch (etype)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    85
    {
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    86
case EJSONSAX_OBJECT:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    87
    assert(t->m_str[-1] == '}');
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    88
    break;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    89
case EJSONSAX_ARRAY:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    90
    assert(t->m_str[-1] == ']');
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    91
    break;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    92
case EJSONSAX_STRING:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    93
    assert(t->m_str[-1] == '"');
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    94
    break;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    95
case EJSONSAX_NUMBER:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    96
case EJSONSAX_NULL:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    97
case EJSONSAX_TRUE:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    98
case EJSONSAX_FALSE:
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
    99
    break;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   100
}
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   101
    return 0;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   102
}
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   103
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   104
void test_on_error(void* data, int error)
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   105
{
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   106
    assert(data);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   107
    debug("Error %d", error);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   108
}
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   109
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   110
int main()
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   111
{
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   112
    const char json[] =
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   113
        "{ \"hello\" : [ 11, 12 ,1"
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   114
        "3 ], \n  \"world\" : -3.45e2 }";
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   115
    struct test_data data;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   116
    data.m_str = json;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   117
    struct jsonsax_backend tester;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   118
    memset(&tester, 0, sizeof(tester));
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   119
    tester.m_getchar = &test_getchar;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   120
    tester.m_onstart = &test_on_start;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   121
    tester.m_onstop  = &test_on_stop;
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   122
1
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   123
    int err = jsonsax_parse(&tester, &data);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   124
    assert(err == 0);
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   125
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   126
    return err;
ef7abb48573b Convert to C api.
Fabien Ninoles <fabien@tzone.org>
parents: 0
diff changeset
   127
};