OQ3: internal/duckstats + bin/qa/stats.go. Zig stays Ladybug-only. mikefarah/yq for small structured slices. Gitea #30.
52 lines
923 B
Go
52 lines
923 B
Go
package duckstats
|
|
|
|
import (
|
|
"os"
|
|
"testing"
|
|
)
|
|
|
|
func TestQuantilesEmpty(t *testing.T) {
|
|
_, err := Quantiles(nil)
|
|
if err == nil {
|
|
t.Fatal("empty slice must error")
|
|
}
|
|
}
|
|
|
|
func TestQuantilesOdd(t *testing.T) {
|
|
s, err := Quantiles([]float64{1, 2, 3, 4, 5})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if s.N != 5 {
|
|
t.Fatalf("n=%d", s.N)
|
|
}
|
|
if s.Min != 1 || s.Max != 5 {
|
|
t.Fatalf("min=%v max=%v", s.Min, s.Max)
|
|
}
|
|
if s.P50 != 3 {
|
|
t.Fatalf("p50=%v want 3", s.P50)
|
|
}
|
|
if s.Avg != 3 {
|
|
t.Fatalf("avg=%v want 3", s.Avg)
|
|
}
|
|
if s.P95 < 4.5 || s.P95 > 5 {
|
|
t.Fatalf("p95=%v want in [4.5,5]", s.P95)
|
|
}
|
|
}
|
|
|
|
func TestCountJSONL(t *testing.T) {
|
|
dir := t.TempDir()
|
|
p := dir + "/rows.jsonl"
|
|
body := "{\"ms\":1}\n{\"ms\":2}\n{\"ms\":3}\n"
|
|
if err := os.WriteFile(p, []byte(body), 0o600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
n, err := CountJSONL(p)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if n != 3 {
|
|
t.Fatalf("count=%d want 3", n)
|
|
}
|
|
}
|