8618aa1be3
- frontend/functions/core/format_datetime_short.md - frontend/functions/core/format_datetime_short.test.ts - frontend/functions/core/format_datetime_short.ts - frontend/functions/core/format_duration.md - frontend/functions/core/format_duration.test.ts - frontend/functions/core/format_duration.ts - frontend/functions/core/month_grid.md - frontend/functions/core/month_grid.test.ts - frontend/functions/core/month_grid.ts - frontend/functions/core/string_hash_palette.md - ... Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
70 lines
2.0 KiB
Go
70 lines
2.0 KiB
Go
package datascience
|
|
|
|
import "testing"
|
|
|
|
func TestDurationStatsFrom(t *testing.T) {
|
|
t.Run("slice vacio retorna estadisticas cero", func(t *testing.T) {
|
|
got := DurationStatsFrom([]int64{})
|
|
if got.N != 0 || got.AvgMs != 0 || got.P50Ms != 0 || got.P90Ms != 0 || got.P99Ms != 0 {
|
|
t.Errorf("got %+v, want zero DurationStats", got)
|
|
}
|
|
})
|
|
|
|
t.Run("un solo elemento produce estadisticas identicas", func(t *testing.T) {
|
|
got := DurationStatsFrom([]int64{100})
|
|
if got.N != 1 || got.AvgMs != 100 || got.P50Ms != 100 || got.P90Ms != 100 || got.P99Ms != 100 {
|
|
t.Errorf("got %+v, want all=100", got)
|
|
}
|
|
})
|
|
|
|
t.Run("cinco elementos calcula media y percentiles correctos", func(t *testing.T) {
|
|
// sorted: [10,20,30,40,50], n=5
|
|
// P50: idx=int(4*0.5)=2 → 30
|
|
// P90: idx=int(4*0.9)=int(3.6)=3 → 40
|
|
// P99: idx=int(4*0.99)=int(3.96)=3 → 40
|
|
got := DurationStatsFrom([]int64{50, 10, 30, 40, 20})
|
|
if got.N != 5 {
|
|
t.Errorf("N: got %v, want 5", got.N)
|
|
}
|
|
if got.AvgMs != 30 {
|
|
t.Errorf("AvgMs: got %v, want 30", got.AvgMs)
|
|
}
|
|
if got.P50Ms != 30 {
|
|
t.Errorf("P50Ms: got %v, want 30", got.P50Ms)
|
|
}
|
|
if got.P90Ms != 40 {
|
|
t.Errorf("P90Ms: got %v, want 40", got.P90Ms)
|
|
}
|
|
if got.P99Ms != 40 {
|
|
t.Errorf("P99Ms: got %v, want 40", got.P99Ms)
|
|
}
|
|
})
|
|
|
|
t.Run("input original no se muta", func(t *testing.T) {
|
|
input := []int64{50, 10, 30}
|
|
_ = DurationStatsFrom(input)
|
|
if input[0] != 50 || input[1] != 10 || input[2] != 30 {
|
|
t.Errorf("input mutated: got %v", input)
|
|
}
|
|
})
|
|
|
|
t.Run("diez elementos p90 usa idx truncado", func(t *testing.T) {
|
|
// sorted: [10..100], n=10
|
|
// P50: idx=int(9*0.5)=4 → 50
|
|
// P90: idx=int(9*0.9)=int(8.1)=8 → 90
|
|
got := DurationStatsFrom([]int64{10, 20, 30, 40, 50, 60, 70, 80, 90, 100})
|
|
if got.N != 10 {
|
|
t.Errorf("N: got %v, want 10", got.N)
|
|
}
|
|
if got.AvgMs != 55 {
|
|
t.Errorf("AvgMs: got %v, want 55", got.AvgMs)
|
|
}
|
|
if got.P50Ms != 50 {
|
|
t.Errorf("P50Ms: got %v, want 50", got.P50Ms)
|
|
}
|
|
if got.P90Ms != 90 {
|
|
t.Errorf("P90Ms: got %v, want 90", got.P90Ms)
|
|
}
|
|
})
|
|
}
|