diff options
Diffstat (limited to 'test/json_test/test_json_printer.c')
-rw-r--r-- | test/json_test/test_json_printer.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/test/json_test/test_json_printer.c b/test/json_test/test_json_printer.c new file mode 100644 index 0000000..efbd572 --- /dev/null +++ b/test/json_test/test_json_printer.c @@ -0,0 +1,129 @@ +#include <stdio.h> + +/* Only needed for verification. */ +#include "monster_test_json_printer.h" +#include "flatcc/support/readfile.h" +#include "flatcc_golden.c" + +#ifdef NDEBUG +#define COMPILE_TYPE "(optimized)" +#else +#define COMPILE_TYPE "(debug)" +#endif + +#define FILE_SIZE_MAX (1024 * 10) + +#undef ns +#define ns(x) FLATBUFFERS_WRAP_NAMESPACE(MyGame_Example, x) + +/* A helper to simplify creating buffers vectors from C-arrays. */ +#define c_vec_len(V) (sizeof(V)/sizeof((V)[0])) + +const char *filename = 0; /* "monsterdata_test.mon"; */ +const char *golden_filename = "monsterdata_test.golden"; +const char *target_filename = "monsterdata_test.json.txt"; + +int test_print(void) +{ + int ret = 0; + const char *buf = 0; + const char *golden = 0; + const char *target = 0; + size_t size = 0, golden_size = 0, target_size = 0; + flatcc_json_printer_t ctx_obj, *ctx; + FILE *fp = 0; + + ctx = &ctx_obj; + + fp = fopen(target_filename, "wb"); + if (!fp) { + fprintf(stderr, "%s: could not open output file\n", target_filename); + /* ctx not ready for clenaup, so exit directly. */ + return -1; + } + flatcc_json_printer_init(ctx, fp); + /* Uses same formatting as golden reference file. */ + flatcc_json_printer_set_nonstrict(ctx); + + if (filename && strcmp(filename, "-")) { + buf = readfile(filename, FILE_SIZE_MAX, &size); + } else { +#if FLATBUFFERS_PROTOCOL_IS_LE + buf = (const char *)flatcc_golden_le; + size = sizeof(flatcc_golden_le); +#else + buf = (const char *)flatcc_golden_be; + size = sizeof(flatcc_golden_be); +#endif + } + + if (!buf) { + fprintf(stderr, "%s: could not read input flatbuffer file\n", filename); + goto fail; + } + golden = readfile(golden_filename, FILE_SIZE_MAX, &golden_size); + if (!golden) { + fprintf(stderr, "%s: could not read verification json file\n", golden_filename); + goto fail; + } + ns(Monster_print_json_as_root(ctx, buf, size, "MONS")); + flatcc_json_printer_flush(ctx); + if (flatcc_json_printer_get_error(ctx)) { + printf("could not print monster data\n"); + } + fclose(fp); + fp = 0; + target = readfile(target_filename, FILE_SIZE_MAX, &target_size); + if (!target) { + fprintf(stderr, "%s: could not read back output file\n", target_filename); + goto fail; + } + if (target_size != golden_size || memcmp(target, golden, target_size)) { + fprintf(stderr, "generated output file did not match verification file\n"); + goto fail; + } + fprintf(stderr, "json print test succeeded\n"); + +done: + flatcc_json_printer_clear(ctx); + if (!filename) { + buf = 0; + } + if (buf) { + free((void *)buf); + } + if (golden) { + free((void *)golden); + } + if (target) { + free((void *)target); + } + if (fp) { + fclose(fp); + } + return ret; +fail: + ret = -1; + goto done; +} + +/* We take arguments so output file can be generated in build directory without copying sources. */ +#define usage \ +"wrong number of arguments:\n" \ +"usage: <program> [(<input-filename>|'-') <reference-filename> <output-filename>]\n" \ +" noargs, or '-' use default binary buffer matching endianness of flatbuffer format\n" + +int main(int argc, const char *argv[]) +{ + fprintf(stderr, "running json print test\n"); + if (argc != 1 && argc != 4) { + fprintf(stderr, usage); + exit(1); + } + if (argc == 4) { + filename = argv[1]; + golden_filename = argv[2]; + target_filename = argv[3]; + } + return test_print(); +} |