feat: DuckDB quantiles in-process (gcc CGO), not Ladybug. (#34)
OQ3: internal/duckstats + bin/qa/stats.go. Zig stays Ladybug-only. mikefarah/yq for small structured slices. Gitea #30.
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user