Archived
90ddbdbfc3
Brings the remaining foundation repos that were not included in the original monorepo consolidation: - arbor/vessels/ — 6 vessels (arbor-cli, arbor-core, arbor-diagram, arbor-layout, arbor-parse, arbor-render) with manifests + src/main.el - dharma/ — CGI Provenance Registry package (flat layout, 14 .el files across registry/, sandbox/, training/, validation/, tests/) - forge/ — consciousness channel tool (8 src .el files + new manifest.el) - elp/src/ — 36 test fixture files not carried over in original merge (dedup_*, realizer_*, semantics_*, morph_*, ext_*, one_extern_* helpers) el-ide, engram, elql are already complete in ide/, engram/, ql/.
92 lines
2.8 KiB
EmacsLisp
92 lines
2.8 KiB
EmacsLisp
// test_query_param.el — unit tests for query_param + str_qmark_index helpers
|
|
// in registry/handlers.el. Self-contained: copies the helpers under test so
|
|
// the test program doesn't drag in the http server / engram dependency.
|
|
|
|
fn json_escape(s: String) -> String { return s }
|
|
|
|
fn str_qmark_index_inner(s: String, idx: Int, total: Int) -> Int {
|
|
if idx >= total {
|
|
return -1
|
|
}
|
|
let c: String = str_slice(s, idx, idx + 1)
|
|
if str_eq(c, "?") {
|
|
return idx
|
|
}
|
|
return str_qmark_index_inner(s, idx + 1, total)
|
|
}
|
|
|
|
fn str_qmark_index(s: String) -> Int {
|
|
return str_qmark_index_inner(s, 0, str_len(s))
|
|
}
|
|
|
|
fn query_param_inner(parts: [String], key: String, idx: Int, total: Int) -> String {
|
|
if idx >= total {
|
|
return ""
|
|
}
|
|
let pair: String = list_get(parts, idx)
|
|
let kv: [String] = str_split(pair, "=")
|
|
let nkv: Int = list_len(kv)
|
|
if nkv >= 2 {
|
|
let k: String = list_get(kv, 0)
|
|
if str_eq(k, key) {
|
|
return list_get(kv, 1)
|
|
}
|
|
}
|
|
return query_param_inner(parts, key, idx + 1, total)
|
|
}
|
|
|
|
fn query_param(path: String, key: String) -> String {
|
|
let qpos: Int = str_qmark_index(path)
|
|
if qpos < 0 {
|
|
return ""
|
|
}
|
|
let qs: String = str_slice(path, qpos + 1, str_len(path))
|
|
let parts: [String] = str_split(qs, "&")
|
|
return query_param_inner(parts, key, 0, list_len(parts))
|
|
}
|
|
|
|
fn assert_eq_str(name: String, got: String, want: String) -> Bool {
|
|
if str_eq(got, want) {
|
|
println("PASS " + name)
|
|
return true
|
|
}
|
|
println("FAIL " + name + " want=" + want + " got=" + got)
|
|
return false
|
|
}
|
|
|
|
fn assert_eq_int(name: String, got: Int, want: Int) -> Bool {
|
|
if got == want {
|
|
println("PASS " + name)
|
|
return true
|
|
}
|
|
println("FAIL " + name + " want=" + int_to_str(want) + " got=" + int_to_str(got))
|
|
return false
|
|
}
|
|
|
|
fn main() -> Void {
|
|
// str_qmark_index
|
|
assert_eq_int("qmark/none", str_qmark_index("/internal-state"), -1)
|
|
assert_eq_int("qmark/at-15", str_qmark_index("/internal-state?cgi_id=abc"), 15)
|
|
assert_eq_int("qmark/empty", str_qmark_index(""), -1)
|
|
|
|
// query_param: single key, multi key, missing
|
|
assert_eq_str("qp/single",
|
|
query_param("/internal-state?cgi_id=cgi-001", "cgi_id"),
|
|
"cgi-001")
|
|
assert_eq_str("qp/multi-first",
|
|
query_param("/internal-state?cgi_id=x&domain=cognition&since=100", "cgi_id"),
|
|
"x")
|
|
assert_eq_str("qp/multi-mid",
|
|
query_param("/internal-state?cgi_id=x&domain=cognition&since=100", "domain"),
|
|
"cognition")
|
|
assert_eq_str("qp/multi-last",
|
|
query_param("/internal-state?cgi_id=x&domain=cognition&since=100", "since"),
|
|
"100")
|
|
assert_eq_str("qp/missing",
|
|
query_param("/internal-state?cgi_id=x", "until"),
|
|
"")
|
|
assert_eq_str("qp/no-qs",
|
|
query_param("/internal-state", "cgi_id"),
|
|
"")
|
|
}
|