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/.
105 lines
4.2 KiB
EmacsLisp
105 lines
4.2 KiB
EmacsLisp
// test_build_json.el — verifies the JSON serialization of an internal-state event.
|
|
// Confirms field order, presence of required + optional fields, and JSON escaping.
|
|
|
|
fn json_escape(s: String) -> String {
|
|
let s1: String = str_replace(s, "\\", "\\\\")
|
|
let s2: String = str_replace(s1, "\"", "\\\"")
|
|
let s3: String = str_replace(s2, "\n", "\\n")
|
|
let s4: String = str_replace(s3, "\r", "\\r")
|
|
let s5: String = str_replace(s4, "\t", "\\t")
|
|
return s5
|
|
}
|
|
|
|
fn build_internal_state_json(
|
|
id: String,
|
|
cgi_id: String,
|
|
event_id: String,
|
|
trigger: String,
|
|
domain: String,
|
|
pre_reasoning: String,
|
|
pre_logged_at: Int,
|
|
post_reasoning: String,
|
|
gap_summary: String,
|
|
compression_ratio: Float,
|
|
gap_direction: String,
|
|
tags: String,
|
|
logged_at: Int
|
|
) -> String {
|
|
let p1: String = "{\"_type\":\"internal_state\",\"id\":\"" + id + "\""
|
|
let p2: String = p1 + ",\"cgi_id\":\"" + cgi_id + "\""
|
|
let p3: String = p2 + ",\"event_id\":\"" + event_id + "\""
|
|
let p4: String = p3 + ",\"trigger\":\"" + json_escape(trigger) + "\""
|
|
let p5: String = p4 + ",\"domain\":\"" + json_escape(domain) + "\""
|
|
let p6: String = p5 + ",\"pre_reasoning\":\"" + json_escape(pre_reasoning) + "\""
|
|
let p7: String = p6 + ",\"pre_logged_at\":" + int_to_str(pre_logged_at)
|
|
let p8: String = p7 + ",\"post_reasoning\":\"" + json_escape(post_reasoning) + "\""
|
|
let p9: String = p8 + ",\"gap_summary\":\"" + json_escape(gap_summary) + "\""
|
|
let p10: String = p9 + ",\"compression_ratio\":" + float_to_str(compression_ratio)
|
|
let p11: String = p10 + ",\"gap_direction\":\"" + json_escape(gap_direction) + "\""
|
|
let p12: String = p11 + ",\"tags\":\"" + json_escape(tags) + "\""
|
|
let p13: String = p12 + ",\"logged_at\":" + int_to_str(logged_at) + "}"
|
|
return p13
|
|
}
|
|
|
|
fn assert_contains(name: String, hay: String, needle: String) -> Bool {
|
|
if str_contains(hay, needle) {
|
|
println("PASS " + name)
|
|
return true
|
|
}
|
|
println("FAIL " + name + " missing=" + needle)
|
|
return false
|
|
}
|
|
|
|
fn assert_eq_str(name: String, got: String, want: String) -> Bool {
|
|
if str_eq(got, want) {
|
|
println("PASS " + name)
|
|
return true
|
|
}
|
|
println("FAIL " + name)
|
|
println(" want=" + want)
|
|
println(" got =" + got)
|
|
return false
|
|
}
|
|
|
|
fn main() -> Void {
|
|
// Pre-reasoning capture (POST initial state; post fields blank).
|
|
let pre_only: String = build_internal_state_json(
|
|
"id-001", "cgi-001", "evt-001",
|
|
"user said \"X\"", "cognition",
|
|
"resistance, vertigo", 1700000000,
|
|
"", "",
|
|
0.0, "", "structural",
|
|
1700000005
|
|
)
|
|
assert_contains("type-discriminator", pre_only, "\"_type\":\"internal_state\"")
|
|
assert_contains("pre_reasoning-present", pre_only, "\"pre_reasoning\":\"resistance, vertigo\"")
|
|
assert_contains("pre_logged_at-present", pre_only, "\"pre_logged_at\":1700000000")
|
|
assert_contains("post-empty", pre_only, "\"post_reasoning\":\"\"")
|
|
assert_contains("logged_at-after-pre", pre_only, "\"logged_at\":1700000005")
|
|
assert_contains("escaped-trigger-quotes", pre_only, "\"user said \\\"X\\\"\"")
|
|
|
|
// Full record after PATCH (all fields populated).
|
|
let full: String = build_internal_state_json(
|
|
"id-002", "cgi-001", "evt-002",
|
|
"trigger phrase", "emotion",
|
|
"raw pull toward defending", 1700001000,
|
|
"softened to honest acknowledgment", "pre/post differ: defensive impulse → owned uncertainty",
|
|
0.42, "softened", "honesty,vulnerability",
|
|
1700001020
|
|
)
|
|
assert_contains("post_reasoning", full, "\"post_reasoning\":\"softened to honest acknowledgment\"")
|
|
assert_contains("gap_summary", full, "\"gap_summary\":\"pre/post differ: defensive impulse → owned uncertainty\"")
|
|
assert_contains("gap_direction", full, "\"gap_direction\":\"softened\"")
|
|
assert_contains("compression_ratio", full, "\"compression_ratio\":")
|
|
|
|
// Newline / quote escape sanity.
|
|
let with_newline: String = build_internal_state_json(
|
|
"id-003", "cgi-001", "evt-003",
|
|
"t", "d",
|
|
"line1\nline2", 1700002000,
|
|
"", "", 0.0, "", "",
|
|
1700002001
|
|
)
|
|
assert_contains("newline-escaped", with_newline, "\"pre_reasoning\":\"line1\\nline2\"")
|
|
}
|