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