package workflowdef import ( "os" "path/filepath" "runtime" "strings" "testing" ) // rdevTemplateDepthAllowlist 已补强模板;随 S0/S1 批次增长。 var rdevTemplateDepthAllowlist = []string{ "rd_design_input_spec", "rd_proposal", "rd_design_input_list", "rd_system_design", "rd_regs_stds", "rd_adverse_events", "rd_sw_plan", "rd_sw_reqs", "rd_sw_config", "rd_risk_plan", "rd_design_plan", "rd_user_needs", "rd_hazard_analysis", "rd_system_reqs", "rd_planning_review", "rd_req_review", "rd_input_phase_review", "rd_output_review", "rd_verification_review", "rd_transfer_review", "rd_drawings_3d", "rd_product_bom", "rd_ee_bom", "rd_pcba", "rd_electrical_sys", "rd_process_flow", "rd_packaging", "rd_purchase_spec", "rd_sw_arch", "rd_sw_ui", "rd_ifu", "rd_incoming_iqc", "rd_ipqc", "rd_fqc", "rd_tech_req", "rd_risk_report", "rd_design_output_list", "rd_prototype_photos", "rd_design_vv", "rd_shelf_life", "rd_lifetime", "rd_biocompatibility", "rd_cleaning", "rd_emc_safety", "rd_risk_report_v", "rd_sw_release", "rd_sw_unit_test", "rd_sw_sys_test", "rd_qualified_suppliers", "rd_dmr_list", "rd_pack_ship", "rd_risk_report_t", "rd_validation_plan", "rd_use_error", "rd_animal_study", "rd_sw_quality", "rd_clinical", "rd_risk_report_val", "rd_user_test", "rd_design_validation_report", } func TestRDevTemplateDepthLint(t *testing.T) { _, thisFile, _, _ := runtime.Caller(0) repoRoot := filepath.Clean(filepath.Join(filepath.Dir(thisFile), "../..")) templatesDir := filepath.Join(repoRoot, "templates", "docs") for _, key := range rdevTemplateDepthAllowlist { path := filepath.Join(templatesDir, key+".md") b, err := os.ReadFile(path) if err != nil { t.Fatalf("%s: read: %v", key, err) } body := string(b) if strings.Contains(body, "按本阶段专业结构写") { t.Errorf("%s: still contains generic placeholder 「按本阶段专业结构写」", key) } headingCount := 0 for _, line := range strings.Split(body, "\n") { if strings.HasPrefix(line, "## ") { headingCount++ } } if headingCount < 4 { t.Errorf("%s: want >=4 ## headings, got %d", key, headingCount) } if !strings.Contains(body, "| RD-") { t.Errorf("%s: missing traceability row with | RD-", key) } if !strings.Contains(body, "## 待确认清单") { t.Errorf("%s: missing ## 待确认清单", key) } if !strings.Contains(body, "## 签署") { t.Errorf("%s: missing ## 签署", key) } } }