178 lines
4.9 KiB
Go
178 lines
4.9 KiB
Go
package squad
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestAgentSpecEnhancements(t *testing.T) {
|
|
spec := AgentSpec{
|
|
Role: "biocompatibility_expert",
|
|
Name: "生物相容性评估专员",
|
|
Source: RoleSourceAdHoc,
|
|
BaseRole: "engineer",
|
|
Model: "MiniMax-M3",
|
|
Tools: []string{"read", "write", "edit"},
|
|
BashPermission: "deny",
|
|
Responsibilities: []string{"生物相容性风险评估"},
|
|
ForbiddenActions: []string{"严禁越权发布正式检验报告"},
|
|
}
|
|
|
|
data, err := json.Marshal(spec)
|
|
if err != nil {
|
|
t.Fatalf("marshal AgentSpec failed: %v", err)
|
|
}
|
|
|
|
var parsed AgentSpec
|
|
if err := json.Unmarshal(data, &parsed); err != nil {
|
|
t.Fatalf("unmarshal AgentSpec failed: %v", err)
|
|
}
|
|
|
|
if parsed.Source != RoleSourceAdHoc {
|
|
t.Errorf("expected source %s, got %s", RoleSourceAdHoc, parsed.Source)
|
|
}
|
|
if parsed.BaseRole != "engineer" {
|
|
t.Errorf("expected base_role engineer, got %s", parsed.BaseRole)
|
|
}
|
|
}
|
|
|
|
func TestStepSpecDynamicAdjustment(t *testing.T) {
|
|
step := StepSpec{
|
|
ID: "step_01_search",
|
|
Role: "searcher",
|
|
Title: "文献与标准检索",
|
|
SubWorkspace: "tasks/01_search",
|
|
Mode: "execute",
|
|
AllowDynamicAdjustment: true,
|
|
}
|
|
|
|
data, err := json.Marshal(step)
|
|
if err != nil {
|
|
t.Fatalf("marshal StepSpec failed: %v", err)
|
|
}
|
|
|
|
var parsed StepSpec
|
|
if err := json.Unmarshal(data, &parsed); err != nil {
|
|
t.Fatalf("unmarshal StepSpec failed: %v", err)
|
|
}
|
|
|
|
if !parsed.AllowDynamicAdjustment {
|
|
t.Errorf("expected AllowDynamicAdjustment to be true")
|
|
}
|
|
}
|
|
|
|
func TestWorkflowPlanPlanningMode(t *testing.T) {
|
|
wf := WorkflowPlan{
|
|
WorkflowID: "wf_test_123",
|
|
TaskKey: "cleanroom_design",
|
|
Title: "洁净厂房设计方案",
|
|
PlanningMode: PlanModeAutonomousAdhoc,
|
|
Status: "pending",
|
|
Steps: []StepSpec{
|
|
{
|
|
ID: "step_01",
|
|
Role: "organizer",
|
|
},
|
|
},
|
|
}
|
|
|
|
data, err := json.Marshal(wf)
|
|
if err != nil {
|
|
t.Fatalf("marshal WorkflowPlan failed: %v", err)
|
|
}
|
|
|
|
var parsed WorkflowPlan
|
|
if err := json.Unmarshal(data, &parsed); err != nil {
|
|
t.Fatalf("unmarshal WorkflowPlan failed: %v", err)
|
|
}
|
|
|
|
if parsed.PlanningMode != PlanModeAutonomousAdhoc {
|
|
t.Errorf("expected planning mode %s, got %s", PlanModeAutonomousAdhoc, parsed.PlanningMode)
|
|
}
|
|
if parsed.TaskKey != "cleanroom_design" {
|
|
t.Errorf("expected task_key cleanroom_design, got %s", parsed.TaskKey)
|
|
}
|
|
}
|
|
|
|
func TestBlackboardAssumptions(t *testing.T) {
|
|
bb := BlackboardState{
|
|
Facts: []FactItem{
|
|
{ID: "f1", Claim: "产品为无菌二类导管", Verified: true},
|
|
},
|
|
Assumptions: []AssumptionItem{
|
|
{
|
|
ID: "a1",
|
|
Topic: "sterilization_method",
|
|
Statement: "基准假设灭菌方式采用环氧乙烷(EO)灭菌,解析期设定为14天",
|
|
Rationale: "客户未明确灭菌方式,依据二类无源无菌高分子导管临床通行工程惯例设定",
|
|
Source: "inferred",
|
|
},
|
|
},
|
|
UpdatedAt: time.Now(),
|
|
}
|
|
|
|
data, err := json.Marshal(bb)
|
|
if err != nil {
|
|
t.Fatalf("marshal BlackboardState failed: %v", err)
|
|
}
|
|
|
|
var parsed BlackboardState
|
|
if err := json.Unmarshal(data, &parsed); err != nil {
|
|
t.Fatalf("unmarshal BlackboardState failed: %v", err)
|
|
}
|
|
|
|
if len(parsed.Assumptions) != 1 {
|
|
t.Fatalf("expected 1 assumption, got %d", len(parsed.Assumptions))
|
|
}
|
|
if parsed.Assumptions[0].Source != "inferred" {
|
|
t.Errorf("expected assumption source 'inferred', got '%s'", parsed.Assumptions[0].Source)
|
|
}
|
|
}
|
|
|
|
func TestEvaluationResult(t *testing.T) {
|
|
res := EvaluationResult{
|
|
StepID: "step_01_search",
|
|
Action: StepActionAddStep,
|
|
Reason: "检测到产品使用动物源牛心包,需动态追加生物相容性专题调研",
|
|
NewAssumptions: []AssumptionItem{
|
|
{
|
|
ID: "a2",
|
|
Topic: "animal_origin",
|
|
Statement: "需执行GB/T 16886及ISO 22442动物源医疗器械病毒灭活评价",
|
|
Source: "inferred",
|
|
},
|
|
},
|
|
DynamicStepsToAdd: []StepSpec{
|
|
{
|
|
ID: "step_01_biocompatibility",
|
|
Role: "biocompatibility_expert",
|
|
Title: "动物源生物相容性与病毒灭活专项评估",
|
|
SubWorkspace: "tasks/01_biocompatibility",
|
|
Mode: "execute",
|
|
},
|
|
},
|
|
StepsToSkip: []string{"step_02_market"},
|
|
}
|
|
|
|
data, err := json.Marshal(res)
|
|
if err != nil {
|
|
t.Fatalf("marshal EvaluationResult failed: %v", err)
|
|
}
|
|
|
|
var parsed EvaluationResult
|
|
if err := json.Unmarshal(data, &parsed); err != nil {
|
|
t.Fatalf("unmarshal EvaluationResult failed: %v", err)
|
|
}
|
|
|
|
if parsed.Action != StepActionAddStep {
|
|
t.Errorf("expected action %s, got %s", StepActionAddStep, parsed.Action)
|
|
}
|
|
if len(parsed.DynamicStepsToAdd) != 1 {
|
|
t.Errorf("expected 1 dynamic step to add, got %d", len(parsed.DynamicStepsToAdd))
|
|
}
|
|
if len(parsed.StepsToSkip) != 1 || parsed.StepsToSkip[0] != "step_02_market" {
|
|
t.Errorf("expected steps to skip ['step_02_market'], got %v", parsed.StepsToSkip)
|
|
}
|
|
}
|