@@ -104,65 +104,73 @@ func TestCalculateStreaks(t *testing.T) {
104104 }
105105}
106106
107- func newAIStatsContainer (projects [] wakatime.StatsItem ) * DataContainer {
107+ func newAIStatsContainer (stats * wakatime.Stats ) * DataContainer {
108108 d := NewDataContainer (log .Default (), & ClientManager {}, & config.Config {})
109- if projects != nil {
110- d .Data .WakaTime = & wakatime.Stats {}
111- d .Data .WakaTime .Data .Projects = projects
109+ if stats != nil {
110+ d .Data .WakaTime = stats
112111 }
113112 return d
114113}
115114
115+ func aiStats (setup func (s * wakatime.Stats )) * wakatime.Stats {
116+ s := & wakatime.Stats {}
117+ setup (s )
118+ return s
119+ }
120+
116121func TestCalculateAIStats (t * testing.T ) {
117122 tests := []struct {
118- name string
119- projects [] wakatime.StatsItem
120- want AIStats
123+ name string
124+ stats * wakatime.Stats
125+ want AIStats
121126 }{
122127 {
123- name : "no wakatime data" ,
124- projects : nil ,
125- want : AIStats {},
128+ name : "no wakatime data" ,
129+ stats : nil ,
130+ want : AIStats {},
126131 },
127132 {
128- name : "wakatime present but no AI activity" ,
129- projects : [] wakatime.StatsItem {{ Name : "proj" }} ,
130- want : AIStats {},
133+ name : "wakatime present but no AI activity" ,
134+ stats : aiStats ( func ( s * wakatime.Stats ) {}) ,
135+ want : AIStats {},
131136 },
132137 {
133- name : "aggregates additions and tokens across projects" ,
134- projects : []wakatime.StatsItem {
135- {Name : "alpha" , AIAdditions : 100 , HumanAdditions : 50 , AIInputTokens : 1000 , AIOutputTokens : 2000 , AIAveragePromptLength : 100 },
136- {Name : "beta" , AIAdditions : 200 , HumanAdditions : 150 , AIInputTokens : 3000 , AIOutputTokens : 4000 , AIAveragePromptLength : 200 },
137- },
138+ name : "reads top-level totals including doc-compliant avg prompt" ,
139+ stats : aiStats (func (s * wakatime.Stats ) {
140+ s .Data .AIAdditions = 300
141+ s .Data .HumanAdditions = 200
142+ s .Data .AIInputTokens = 4000
143+ s .Data .AIOutputTokens = 6000
144+ s .Data .AIAvgPromptLength = 175
145+ }),
138146 want : AIStats {
139147 AIAdditions : 300 ,
140148 HumanAdditions : 200 ,
141149 AIInputTokens : 4000 ,
142150 AIOutputTokens : 6000 ,
143- AvgPromptLength : ( 100 * 1000 + 200 * 3000 ) / 4000.0 , // 175
151+ AvgPromptLength : 175 ,
144152 HasData : true ,
145153 },
146154 },
147155 {
148- name : "skips projects with zero ai_input_tokens for prompt-length avg" ,
149- projects : []wakatime.StatsItem {
150- {Name : "with-ai" , AIAdditions : 10 , AIInputTokens : 500 , AIAveragePromptLength : 80 },
151- {Name : "no-ai" , HumanAdditions : 100 , AIAveragePromptLength : 9999 }, // bogus, should be ignored
152- },
156+ name : "exposes raw ai_prompt_length when avg field is missing" ,
157+ stats : aiStats (func (s * wakatime.Stats ) {
158+ s .Data .AIAdditions = 10
159+ s .Data .AIInputTokens = 500
160+ s .Data .AIPromptLength = 484803
161+ }),
153162 want : AIStats {
154- AIAdditions : 10 ,
155- HumanAdditions : 100 ,
156- AIInputTokens : 500 ,
157- AvgPromptLength : 80 ,
158- HasData : true ,
163+ AIAdditions : 10 ,
164+ AIInputTokens : 500 ,
165+ PromptLength : 484803 ,
166+ HasData : true ,
159167 },
160168 },
161169 {
162170 name : "AI additions without tokens still triggers HasData" ,
163- projects : [] wakatime.StatsItem {
164- { Name : "p" , AIAdditions : 5 },
165- },
171+ stats : aiStats ( func ( s * wakatime.Stats ) {
172+ s . Data . AIAdditions = 5
173+ }) ,
166174 want : AIStats {
167175 AIAdditions : 5 ,
168176 HasData : true ,
@@ -172,7 +180,7 @@ func TestCalculateAIStats(t *testing.T) {
172180
173181 for _ , tt := range tests {
174182 t .Run (tt .name , func (t * testing.T ) {
175- d := newAIStatsContainer (tt .projects )
183+ d := newAIStatsContainer (tt .stats )
176184 got := d .CalculateAIStats ()
177185
178186 if got .AIAdditions != tt .want .AIAdditions {
@@ -190,6 +198,9 @@ func TestCalculateAIStats(t *testing.T) {
190198 if math .Abs (got .AvgPromptLength - tt .want .AvgPromptLength ) > 0.001 {
191199 t .Errorf ("AvgPromptLength: got %v, want %v" , got .AvgPromptLength , tt .want .AvgPromptLength )
192200 }
201+ if got .PromptLength != tt .want .PromptLength {
202+ t .Errorf ("PromptLength: got %d, want %d" , got .PromptLength , tt .want .PromptLength )
203+ }
193204 if got .HasData != tt .want .HasData {
194205 t .Errorf ("HasData: got %v, want %v" , got .HasData , tt .want .HasData )
195206 }
0 commit comments