From b8b40f6c54ef05bc33c67d1eeade35f6aa438f8e Mon Sep 17 00:00:00 2001 From: cozis Date: Sat, 2 Apr 2022 19:57:00 +0200 Subject: [PATCH] added basic tests --- .gitignore | 3 +- test.c | 82 +++++++++++++++++++++++++++++++++++++++++++----------- xjson.c | 15 ++++------ 3 files changed, 73 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index 30d74d2..d96ee5a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -test \ No newline at end of file +test +vgcore.* \ No newline at end of file diff --git a/test.c b/test.c index 7c9bc5f..a480fa6 100644 --- a/test.c +++ b/test.c @@ -1,29 +1,79 @@ #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"), +}; + +#undef TEST + +_Bool json_strings_match(const char *A, const char *B) +{ + int Ai = 0, Bi = 0; + + do + { + 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[4096]; + char pool[65536]; xj_error error; - xj_alloc *alloc; - alloc = xj_newAllocUsing(pool, sizeof(pool), 0, NULL); - assert(alloc != NULL); + int total = sizeof(tests) / sizeof(tests[0]); + int passed = 0; - xj_value *val = xj_decode("{}", -1, alloc, &error); - - if(val == NULL) + for(int i = 0; i < total; i += 1) { - fprintf(stderr, "Failed to parse (%s)\n", error.message); - return 1; - } - fprintf(stdout, "Parsed.\n"); + xj_alloc *alloc = xj_newAllocUsing(pool, sizeof(pool), 0, NULL); + assert(alloc != NULL); - int size; - char *serialized = xj_encode(val, &size); - fprintf(stdout, "(%d) %s\n", size, serialized); - free(serialized); + 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.\n"); + } + + free(serialized); + } + + fprintf(stdout, "passed: %d, failed: %d, total: %d\n", passed, total - passed, total); return 0; -} \ No newline at end of file +} diff --git a/xjson.c b/xjson.c index 9fa33db..6b514e4 100644 --- a/xjson.c +++ b/xjson.c @@ -476,12 +476,6 @@ static xj_value *parseObject(context_t *ctx) while(ctx->i < ctx->len && isspace(ctx->str[ctx->i])) ctx->i += 1; - if(ctx->i == ctx->len) - { - xj_report(ctx->error, "String ended inside an object, right before the %dth child's value", count+1); - return NULL; - } - xj_value *child = parseValue(ctx); if(child == NULL) @@ -522,14 +516,14 @@ static xj_value *parseObject(context_t *ctx) static xj_value *parseValue(context_t *ctx) { - assert(!isspace(ctx->str[ctx->i])); - if(ctx->i == ctx->len) { xj_report(ctx->error, "String ended where a value was expected"); return NULL; } + assert(!isspace(ctx->str[ctx->i])); + char c = ctx->str[ctx->i]; if(c == '"') @@ -570,6 +564,7 @@ static xj_value *parseValue(context_t *ctx) if(ctx->i + kwlen <= ctx->len && !strncmp(ctx->str + ctx->i, kword, kwlen)) { + ctx->i += kwlen; switch(c) { case 'n': return xj_newNull(ctx->alloc); @@ -615,7 +610,7 @@ xj_value *xj_decode(const char *str, int len, } context_t ctx = { - .str = str, .len = len, + .str = str, .i = i, .len = len, .alloc = alloc, .error = error }; return parseValue(&ctx); } @@ -767,7 +762,7 @@ char *xj_encode(xj_value *value, int *len) buff.tail = &buff.head; buff.head.next = NULL; - _Bool failed = encodeValue(value, &buff); + _Bool failed = !encodeValue(value, &buff); char *serialized = NULL;