Files
Agent-System/internal/squad/planner_test.go
T

146 lines
4.2 KiB
Go

package squad
import (
"strings"
"testing"
)
func TestPlanFixedAdaptive_Default(t *testing.T) {
reg := NewRoleRegistry()
planner := NewAdaptivePlanner(reg)
req := PlannerRequest{
TaskKey: "intake",
ProjectName: "掌上便携超声",
CustomerName: "北京水木东方",
DeviceType: "超声诊断仪",
}
res, err := planner.Plan(req)
if err != nil {
t.Fatalf("planner.Plan failed: %v", err)
}
if res.PlanningMode != PlanModeFixedAdaptive {
t.Errorf("expected planning mode %s, got %s", PlanModeFixedAdaptive, res.PlanningMode)
}
if len(res.Workflow.Steps) < 3 {
t.Errorf("expected at least 3 steps, got %d", len(res.Workflow.Steps))
}
if len(res.Squad.Agents) < 3 {
t.Errorf("expected at least 3 agents in squad, got %d", len(res.Squad.Agents))
}
}
func TestPlanFixedAdaptive_MaterialSnifferInsertStep(t *testing.T) {
reg := NewRoleRegistry()
planner := NewAdaptivePlanner(reg)
req := PlannerRequest{
TaskKey: "research",
ProjectName: "人工心脏瓣膜",
CustomerName: "北京水木东方",
DeviceType: "植入式心脏瓣膜",
Materials: []MaterialItem{
{
Filename: "raw_spec.txt",
Content: []byte("本项目采用牛心包生物源材料,属于血液长期接触植入物,需高度关注动物源病毒灭活与免疫原性。"),
},
},
}
res, err := planner.Plan(req)
if err != nil {
t.Fatalf("planner.Plan failed: %v", err)
}
// 验证动态插入了动物源或生物相容性专属步骤
foundSpecialStep := false
for _, s := range res.Workflow.Steps {
if strings.Contains(s.ID, "biocompatibility") || strings.Contains(s.Title, "生物相容性") || strings.Contains(s.Title, "动物源") {
foundSpecialStep = true
if !s.AllowDynamicAdjustment {
t.Errorf("special step should have AllowDynamicAdjustment=true")
}
break
}
}
if !foundSpecialStep {
t.Errorf("expected dynamic step for biocompatibility to be inserted into research workflow")
}
// 验证 Squad 中包含对应的专家角色
foundExpert := false
for _, a := range res.Squad.Agents {
if a.Role == "biocompatibility_expert" || a.Role == "regulatory" {
foundExpert = true
break
}
}
if !foundExpert {
t.Errorf("expected biocompatibility or regulatory expert in squad")
}
}
func TestPlanAutonomousAdhoc_CleanroomDesign(t *testing.T) {
reg := NewRoleRegistry()
planner := NewAdaptivePlanner(reg)
req := PlannerRequest{
TaskKey: "cleanroom_spec",
Title: "洁净厂房十万级车间建设需求与环境控制方案",
ProjectName: "无菌导管生产线",
CustomerName: "北京水木东方",
DeviceType: "无菌介入导管",
Materials: []MaterialItem{
{
Filename: "facility.txt",
Content: []byte("规划建设十万级GMP净化车间,包括压差梯度设计、高效过滤送风与沉降菌监测规程。"),
},
},
}
res, err := planner.Plan(req)
if err != nil {
t.Fatalf("planner.Plan for adhoc document failed: %v", err)
}
if res.PlanningMode != PlanModeAutonomousAdhoc {
t.Errorf("expected planning mode %s, got %s", PlanModeAutonomousAdhoc, res.PlanningMode)
}
if len(res.Workflow.Steps) != 4 {
t.Fatalf("expected 4-stage WBS steps (organize, specialize, draft, review), got %d", len(res.Workflow.Steps))
}
// 验证各步骤角色匹配与模式
stepRoles := []string{res.Workflow.Steps[0].Role, res.Workflow.Steps[1].Role, res.Workflow.Steps[2].Role, res.Workflow.Steps[3].Role}
if stepRoles[0] != "organizer" {
t.Errorf("step 1 should be organizer, got %s", stepRoles[0])
}
if stepRoles[2] != "writer" {
t.Errorf("step 3 should be writer, got %s", stepRoles[2])
}
if stepRoles[3] != "leader" {
t.Errorf("step 4 should be leader, got %s", stepRoles[3])
}
// 验证第2步为专门工程/洁净专员
specRole := res.Workflow.Steps[1].Role
_, exists := reg.GetRole(specRole)
if !exists {
t.Errorf("specialist role %s not registered in registry", specRole)
}
// 验证模板自动合成且包含核心章节
if !strings.Contains(res.TemplateContent, "洁净厂房十万级车间建设需求与环境控制方案") {
t.Errorf("template should contain document title")
}
if !strings.Contains(res.TemplateContent, "待确认清单") {
t.Errorf("template should contain pending checklist section")
}
}