Files
hunjing/engine/bindings/go/lingtai/lingtai_test.go
T
chenxin a39cec5287 ✨ feat: 灵台引擎五神齐备与 Go/Rust 官方绑定(WP-15)
- C++ 新增四模块(modules.cpp,19 个导出符号全部 hj_*):
  小周天 hj_stream:流会话(sequence/delta_index 单调)与 content.block.delta envelope 确定性编码(重放字节一致)
  烛照 hj_policy:URL 协议白名单(拒 file/javascript/data)、路径授权根与 .. 段拒绝、幂等键非空≤128、四维决策表(autonomy×risk→allow/ask/deny,非法输入 deny fail-closed)
  洛书 hj_plan:预算核算(达限/负数拒绝)
  河图 hj_recall:确定性重排(词频×稳定排序,canonical JSON 输出;非法输入 PARSE_FAILED)
- doctest 22 用例 20135 断言全绿(含每模块 golden 与确定性双跑)
- Go 绑定(cgo 自包含编译引擎源码):Engine RAII/TransformMarkdown/ValidateURL/ValidatePath/Decide/CheckBudget/RecallRerank;go test 3 用例通过(transform/rerank golden 与 C++ 字节一致)
- Rust 绑定(bindgen 生成 + 安全包装):Engine RAII(Drop 释放)、Error 枚举映射全部 HjStatus、Send/Sync(HjEngine 线程安全);cargo test 3 用例通过(同 golden)
- 三端(C++/Go/Rust)与 Python golden 一致:同一 markdown 输入在四端输出字节相同(跨端一致性首次全语言验证)
2026-09-12 13:54:12 +08:00

64 lines
1.9 KiB
Go

package lingtai
import "testing"
func TestEngineLifecycleAndTransform(t *testing.T) {
e, err := New()
if err != nil {
t.Fatal(err)
}
defer e.Close()
if TransformVersion() != "hunjing-markdown-v1" {
t.Fatalf("parser version: %s", TransformVersion())
}
out, err := e.TransformMarkdown("x\n```mermaid\nA-->B\n```\n$$\nz\n$$\n")
if err != nil {
t.Fatal(err)
}
want := `{"parser_version":"hunjing-markdown-v1","blocks":[{"type":"markdown","text":"x","flavor":"hunjing-gfm-v1","status":"completed"},{"type":"mermaid","source":"A-->B","status":"completed"},{"type":"math","notation":"latex","display":"block","source":"z","status":"completed"}]}`
if out != want {
t.Fatalf("golden mismatch:\n got: %s\nwant: %s", out, want)
}
}
func TestPolicyPrimitives(t *testing.T) {
if err := ValidateURL("https://ok.example"); err != nil {
t.Fatal(err)
}
if err := ValidateURL("javascript:alert(1)"); err == nil {
t.Fatal("javascript: 应被拒绝")
}
if err := ValidatePath("/data/d/f", "/data/d"); err != nil {
t.Fatal(err)
}
if err := ValidatePath("/data/d/../x", "/data/d"); err == nil {
t.Fatal(".. 应被拒绝")
}
if d := Decide(AutonomyRuleBound, RiskReadOnly); d != DecisionAllow {
t.Fatalf("循律+只读应 allow: %d", d)
}
if d := Decide(AutonomyIntrospective, RiskHighImpact); d != DecisionDeny {
t.Fatalf("自省+高影响应 deny: %d", d)
}
if err := CheckBudget(10, 10); err == nil {
t.Fatal("预算达限应报错")
}
}
func TestRecallRerankDeterministic(t *testing.T) {
e, _ := New()
defer e.Close()
in := `{"query_terms":["魂镜"],"candidates":[{"id":"a","text":"魂镜 系统"},{"id":"b","text":"无"}]}`
out1, err := e.RecallRerank(in)
if err != nil {
t.Fatal(err)
}
out2, _ := e.RecallRerank(in)
if out1 != out2 {
t.Fatalf("确定性失败: %s vs %s", out1, out2)
}
if out1 != `{"ranked":[{"id":"a","score":10},{"id":"b","score":0}]}` {
t.Fatalf("golden mismatch: %s", out1)
}
}