返回 DeepSeek-Reasonix
ablation_test.go
根目录 / internal / ablation / ablation_test.go
1 package ablation
2
3 import "testing"
4
5 func TestParseAcceptsSpecFormsAndRejectsUnknownModules(t *testing.T) {
6 for _, tc := range []struct {
7 spec string
8 arm string
9 }{
10 {"", "full"},
11 {"none", "full"},
12 {"NONE", "full"},
13 {"evidence", "no-evidence"},
14 {"planner,evidence", "no-evidence+no-planner"},
15 {"planner evidence", "no-evidence+no-planner"},
16 {" Evidence , Retrieval ", "no-evidence+no-retrieval"},
17 {"all", "no-evidence+no-planner+no-subagent+no-retrieval+no-compaction"},
18 } {
19 set, err := Parse(tc.spec)
20 if err != nil {
21 t.Fatalf("Parse(%q): %v", tc.spec, err)
22 }
23 if got := set.Arm(); got != tc.arm {
24 t.Errorf("Parse(%q).Arm() = %q, want %q", tc.spec, got, tc.arm)
25 }
26 }
27
28 if _, err := Parse("evidence,planer"); err == nil {
29 t.Fatal("a misspelled module must fail loudly, not silently run the control arm")
30 }
31 }
32
33 func TestArmNameIsIndependentOfSpecOrder(t *testing.T) {
34 a, _ := Parse("retrieval,evidence,planner")
35 b, _ := Parse("planner,retrieval,evidence")
36 if a.Arm() != b.Arm() {
37 t.Fatalf("arm names diverge by input order: %q vs %q", a.Arm(), b.Arm())
38 }
39 }
40
41 func TestStringRoundTripsThroughParse(t *testing.T) {
42 for _, spec := range []string{"none", "evidence", "evidence,compaction", "all"} {
43 set, err := Parse(spec)
44 if err != nil {
45 t.Fatalf("Parse(%q): %v", spec, err)
46 }
47 again, err := Parse(set.String())
48 if err != nil {
49 t.Fatalf("Parse(%q): %v", set.String(), err)
50 }
51 if again.Arm() != set.Arm() {
52 t.Errorf("%q round-tripped to %q", set.Arm(), again.Arm())
53 }
54 }
55 }
56
57 func TestZeroValueIsTheControlArm(t *testing.T) {
58 var s Set
59 if !s.Empty() || s.Arm() != "full" {
60 t.Fatalf("zero Set = %q, want the full control arm", s.Arm())
61 }
62 for _, m := range Modules() {
63 if s.Off(m) {
64 t.Errorf("zero Set disabled %s", m)
65 }
66 }
67 }
68
68 lines GO