#include #include #include #include #include "xjson.h" #define TEST(src_) { .line = __LINE__, .src = src_ } static const struct { int line; const char *src; } tests[] = { TEST("null"), TEST("\t\n null \t\n"), TEST("true"), TEST("\t\n true \t\n"), TEST("false"), TEST("\t\n false \t\n"), TEST("1"), TEST(" 1 "), TEST("[]"), TEST("[1, 2, 3]"), TEST(" [ ] "), TEST(" [ 1 , 2 , 3 ] "), TEST("{}"), TEST(" { } "), TEST(" { \"key\" : 5 } "), }; #undef TEST _Bool json_strings_match(const char *A, const char *B) { int Ai = 0, Bi = 0; do { // TODO: Only ignore spaces if they're // not inside strings. while(isspace(A[Ai])) Ai += 1; while(isspace(B[Bi])) Bi += 1; if(A[Ai] != B[Bi]) return 0; Ai += 1; Bi += 1; } while(A[Ai] != '\0'); return 1; } int main() { char pool[65536]; xj_error error; int total = sizeof(tests) / sizeof(tests[0]); int passed = 0; for(int i = 0; i < total; i += 1) { xj_alloc *alloc = xj_alloc_using(pool, sizeof(pool), 0, NULL); assert(alloc != NULL); xj_value *val = xj_decode(tests[i].src, -1, alloc, &error); if(val == NULL) { fprintf(stderr, "Failed to parse (%s)\n", error.message); return 1; } int size; char *serialized = xj_encode(val, &size); assert(serialized != NULL); if(json_strings_match(serialized, tests[i].src)) { //fprintf(stdout, "Passed.\n"); passed += 1; } else { fprintf(stderr, "Failed! Expected:\n"); fprintf(stderr, " %s\n", tests[i].src); fprintf(stderr, "but got:\n"); fprintf(stderr, " %s\n", serialized); } free(serialized); } fprintf(stdout, "passed: %d, failed: %d, total: %d\n", passed, total - passed, total); return 0; }