static void test_utf8(void) { uint8_t u8[] = { 0x00, 0x7f, 0xc2, 0x80, 0xdf, 0xbf, 0xe0, 0xa0, 0x80, 0xef, 0xbf, 0xbf }; scope { jd_var *got = jd_from_json(jd_nv(), jd_nsv("\"\\u0000\\u007F\\u0080\\u07FF\\u0800\\uFFFF\"")); size_t sz; const char *bytes = jd_bytes(got, &sz); if (ok(sz == sizeof(u8) + 1, "utf8: size matches")) { ok(0 == memcmp(bytes, u8, sz - 1), "utf8: bytes match"); } } scope { const char one80[] = ONE80; const char *one80json = "\"" ONE80 "\""; jd_var *got = jd_from_json(jd_nv(), jd_nsv(one80json)); size_t sz; const char *bytes = jd_bytes(got, &sz); if (ok(sz == sizeof(one80), "180 degrees: size matches")) { ok(0 == memcmp(bytes, one80, sz), "180 degrees: bytes match"); } } }
static void test_clone(void) { jd_var dst = JD_INIT, src = JD_INIT, ref = JD_INIT; jd_var json = JD_INIT; jd_set_string(&json, "{\"a\":[1,2,3],\"b\":3.14,\"c\":\"foo\"}"); jd_from_json(&ref, &json); jd_clone(&src, &ref, 1); jd_clone(&dst, &src, 0); /* shallow */ jdt_is(&dst, &src, "clone matches"); jd_assign(jd_lv(&dst, "$.d.0.capsule.source"), &json); jdt_is(&ref, &src, "source unchanged"); jd_assign(jd_lv(&dst, "$.a.3"), &json); jdt_is(jd_rv(&src, "$.a.3"), &json, "deep item changed"); jd_clone(&src, &ref, 1); jd_clone(&dst, &src, 1); /* deep */ jdt_is(&dst, &src, "clone matches"); jd_assign(jd_lv(&dst, "$.d.0.capsule.source"), &json); jdt_is(&ref, &src, "source unchanged"); jd_assign(jd_lv(&dst, "$.a.3"), &json); jdt_is(&ref, &src, "source unchanged again"); jd_release(&dst); jd_release(&src); jd_release(&ref); jd_release(&json); }
static int _isj(jd_var *got, jd_var *want, const char *msg, va_list ap) { jd_var vgot = JD_INIT; int rc; jd_to_json(&vgot, got); rc = test(jd_compare(&vgot, want) == 0, msg, ap); if (!rc) { jd_var pwant = JD_INIT; jd_from_json(&pwant, want); jdt_diag("wanted %lJ", &pwant); jdt_diag("got %lJ", got); jd_release(&pwant); } jd_release(&vgot); return rc; }
static jd_var *load_json(jd_var *out, const char *filename) { jd_var json = JD_INIT; jd_from_json(out, load_string(&json, filename)); jd_release(&json); return out; }
jd_var *tf_load_json(jd_var *out, FILE *f) { jd_var json = JD_INIT; jd_from_json(out, tf_load_string(&json, f)); jd_release(&json); return out; }