1package skills
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/require"
7)
8
9func TestTracker_MarkLoadedAndIsLoaded(t *testing.T) {
10 t.Parallel()
11
12 activeSkills := []*Skill{
13 {Name: "go-doc"},
14 {Name: "bash"},
15 }
16 tracker := NewTracker(activeSkills)
17
18 // Initially not loaded.
19 require.False(t, tracker.IsLoaded("go-doc"))
20 require.False(t, tracker.IsLoaded("bash"))
21
22 // Mark as loaded.
23 tracker.MarkLoaded("go-doc")
24 require.True(t, tracker.IsLoaded("go-doc"))
25 require.False(t, tracker.IsLoaded("bash"))
26
27 // Mark another.
28 tracker.MarkLoaded("bash")
29 require.True(t, tracker.IsLoaded("go-doc"))
30 require.True(t, tracker.IsLoaded("bash"))
31}
32
33func TestTracker_NonActiveSkillCannotBeMarkedLoaded(t *testing.T) {
34 t.Parallel()
35
36 activeSkills := []*Skill{
37 {Name: "go-doc"},
38 }
39 tracker := NewTracker(activeSkills)
40
41 // Cannot mark non-active skill as loaded.
42 tracker.MarkLoaded("bash")
43 require.False(t, tracker.IsLoaded("bash"))
44
45 // Can mark active skill as loaded.
46 tracker.MarkLoaded("go-doc")
47 require.True(t, tracker.IsLoaded("go-doc"))
48}
49
50func TestTracker_NilSafety(t *testing.T) {
51 t.Parallel()
52
53 var tracker *Tracker
54
55 // Should not panic.
56 tracker.MarkLoaded("go-doc")
57 require.False(t, tracker.IsLoaded("go-doc"))
58}
59
60func TestTracker_BuiltinSkillTracking(t *testing.T) {
61 t.Parallel()
62
63 // Simulate active skills including a builtin skill (crush-config).
64 activeSkills := []*Skill{
65 {Name: "crush-config", Description: "Crush config", Builtin: true},
66 {Name: "go-doc", Description: "Go docs", Builtin: false},
67 }
68 tracker := NewTracker(activeSkills)
69
70 // Initially not loaded.
71 require.False(t, tracker.IsLoaded("crush-config"))
72 require.False(t, tracker.IsLoaded("go-doc"))
73
74 // Mark builtin skill as loaded (simulating read via crush://...).
75 tracker.MarkLoaded("crush-config")
76 require.True(t, tracker.IsLoaded("crush-config"))
77
78 // Mark user skill as loaded.
79 tracker.MarkLoaded("go-doc")
80 require.True(t, tracker.IsLoaded("go-doc"))
81}
82
83func TestTracker_OverriddenBuiltinNotTracked(t *testing.T) {
84 t.Parallel()
85
86 // Simulate scenario where builtin "bash" is overridden by user "bash".
87 // After dedup, only user "bash" is active.
88 activeSkills := []*Skill{
89 {Name: "bash", Description: "User bash override", Builtin: false},
90 }
91 tracker := NewTracker(activeSkills)
92
93 // Trying to mark the builtin "bash" as loaded should not work
94 // because the active skill is the user override.
95 tracker.MarkLoaded("bash")
96 require.True(t, tracker.IsLoaded("bash"))
97
98 // But if we somehow tried to mark a different builtin that's not active,
99 // it wouldn't get marked.
100 tracker.MarkLoaded("nonexistent-builtin")
101 require.False(t, tracker.IsLoaded("nonexistent-builtin"))
102}