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); }
int main(void) { try { JD_2VARS(a, b); jd_set_string(a, "This is A"); jd_throw("Oops: a=%J", a); jd_set_bool(b, 1); } puts("cleanup"); catch (e) jd_rethrow(e);
int jdt_is_string(jd_var *got, const char *want, const char *msg, ...) { va_list ap; jd_var vwant = JD_INIT; int rc; jd_set_string(&vwant, want); va_start(ap, msg); rc = _is(got, &vwant, msg, ap); va_end(ap); jd_release(&vwant); return rc; }
static void test_retain_release(void) { int i; jd_var h = JD_INIT, s = JD_INIT; jd_set_string(&s, "Hello, World"); jd_assign(jd_lv(&h, "$.hello"), &s); jd_release(&s); is(s.type, VOID, "release -> type == void"); for (i = 0; i < 10; i++) jd_release(&s); /* make sure it's a nop */ jdt_is_json(&h, "{\"hello\":\"Hello, World\"}", "data matches"); jd_release(&h); }
static void test_simple_throw(void) { try { JD_2VARS(a, b); jd_set_string(a, "This is A"); jd_throw("Oops: a=%J", a); jd_set_bool(b, 1); } catch (e) { jdt_is_string(jd_rv(e, "$.message"), "Oops: a=\"This is A\"", "exception message matches"); jd_release(e); } }
static void test_to_json(void) { jd_var vin = JD_INIT, vout = JD_INIT, vwant = JD_INIT; jd_set_array(&vin, 1); jd_set_string(jd_push(&vin, 1), "foo"); jd_set_int(jd_push(&vin, 1), 12345); jd_set_string(&vwant, "[\"foo\",12345]"); jd_to_json(&vout, &vin); ok(jd_compare(&vout, &vwant) == 0, "json"); jd_set_string(jd_lv(&vin, "$.2.name"), "a hash"); jd_set_int(jd_lv(&vin, "$.2.value"), 555); jd_set_string(&vwant, "[\"foo\",12345,{\"name\":\"a hash\",\"value\":555}]"); jd_to_json(&vout, &vin); ok(jd_compare(&vout, &vwant) == 0, "json"); jd_release(&vin); jd_release(&vout); jd_release(&vwant); }
static jd_var *path_iter(jd_var *iter, jd_var *data) { jd_var *slot = jd_push(jd_set_array(jd_context(jd_set_closure(iter, path_iter_f)), 2), 2); jd_assign(slot++, data); jd_set_string(jd_push(jd_set_array(slot++, 1000), 1), "$"); return iter; }