Files
2026-05-05 01:38:51 -05:00

133 lines
4.9 KiB
EmacsLisp

// test_json.el - native test suite for runtime/json.el
//
// Covers: json_get (dot-path), typed extractors (int, bool, float),
// json_array_len/get, json_set, json_build_object, json_build_array,
// and json_escape_string.
test "json-get-string" {
let obj: String = "{\"name\":\"alice\",\"role\":\"admin\"}"
let name: String = json_get(obj, "name")
assert name == "alice", "get string field name"
let role: String = json_get(obj, "role")
assert role == "admin", "get string field role"
let missing: String = json_get(obj, "xyz")
assert missing == "", "missing key returns empty string"
}
test "json-get-int" {
let obj: String = "{\"count\":42,\"offset\":0}"
let count: Int = json_get_int(obj, "count")
assert count == 42, "get int field count"
let offset: Int = json_get_int(obj, "offset")
assert offset == 0, "get int field offset = 0"
}
test "json-get-bool" {
let obj: String = "{\"active\":true,\"deleted\":false}"
let active: Bool = json_get_bool(obj, "active")
assert active, "get bool true"
let deleted: Bool = json_get_bool(obj, "deleted")
assert !deleted, "get bool false"
}
test "json-dot-path" {
let obj: String = "{\"user\":{\"name\":\"bob\",\"age\":30}}"
let name: String = json_get(obj, "user.name")
assert name == "bob", "dot-path traversal user.name"
let age: String = json_get(obj, "user.age")
assert age == "30", "dot-path traversal user.age"
}
test "json-array-len" {
let arr: String = "[\"a\",\"b\",\"c\"]"
let n: Int = json_array_len(arr)
assert n == 3, "array length 3"
let empty_arr: String = "[]"
let m: Int = json_array_len(empty_arr)
assert m == 0, "empty array length 0"
}
test "json-array-get" {
let arr: String = "[\"foo\",\"bar\",\"baz\"]"
let first: String = json_array_get_string(arr, 0)
assert first == "foo", "first element"
let second: String = json_array_get_string(arr, 1)
assert second == "bar", "second element"
let third: String = json_array_get_string(arr, 2)
assert third == "baz", "third element"
}
test "json-get-raw" {
let obj: String = "{\"items\":[1,2,3],\"meta\":{\"page\":1}}"
let raw_arr: String = json_get_raw(obj, "items")
let arr_len: Int = json_array_len(raw_arr)
assert arr_len == 3, "raw array has 3 elements"
let raw_meta: String = json_get_raw(obj, "meta")
let page: String = json_get(raw_meta, "page")
assert page == "1", "page from nested raw object"
}
test "json-set" {
let obj: String = "{\"name\":\"alice\"}"
let updated: String = json_set(obj, "name", "\"bob\"")
let name: String = json_get(updated, "name")
assert name == "bob", "set replaces existing key"
}
test "json-build-object" {
let kvs: [String] = native_list_empty()
let kvs = native_list_append(kvs, "name")
let kvs = native_list_append(kvs, "alice")
let kvs = native_list_append(kvs, "role")
let kvs = native_list_append(kvs, "admin")
let obj: String = json_build_object(kvs)
let name: String = json_get(obj, "name")
let role: String = json_get(obj, "role")
assert name == "alice", "built object name field"
assert role == "admin", "built object role field"
}
test "json-build-array" {
let items: [String] = native_list_empty()
let items = native_list_append(items, "\"alpha\"")
let items = native_list_append(items, "\"beta\"")
let items = native_list_append(items, "\"gamma\"")
let arr: String = json_build_array(items)
let n: Int = json_array_len(arr)
assert n == 3, "built array has 3 elements"
let first: String = json_array_get_string(arr, 0)
assert first == "alpha", "first built element"
let third: String = json_array_get_string(arr, 2)
assert third == "gamma", "third built element"
}
test "json-escape-string" {
let escaped: String = json_escape_string("say \"hello\"")
assert str_contains(escaped, "\\\""), "double quotes are escaped"
let tab_esc: String = json_escape_string("a\tb")
assert str_contains(tab_esc, "\\t"), "tabs are escaped"
let plain: String = json_escape_string("no special chars")
assert plain == "no special chars", "plain string unchanged"
}
test "json-get-float" {
let obj: String = "{\"price\":9.99,\"tax\":0.0}"
let price: Float = json_get_float(obj, "price")
let diff: Float = price - 9.99
assert diff > -0.001, "price close to 9.99 low"
assert diff < 0.001, "price close to 9.99 high"
let tax: Float = json_get_float(obj, "tax")
assert tax == 0.0, "tax is zero"
}
test "json-nested-array-index" {
let obj: String = "{\"tags\":[\"go\",\"el\",\"rust\"]}"
let tags_raw: String = json_get_raw(obj, "tags")
let count: Int = json_array_len(tags_raw)
assert count == 3, "tags array has 3 elements"
let first_tag: String = json_array_get_string(tags_raw, 0)
assert first_tag == "go", "first tag is go"
let last_tag: String = json_array_get_string(tags_raw, 2)
assert last_tag == "rust", "last tag is rust"
}