package onnx
import (
"encoding/json"
"image/png"
"os"
"path/filepath"
"testing"
"chirami/internal/ocr"
)
type fixtureRef struct {
Text string `json:"text"`
Lines []ocr.Line `json:"lines"`
}
func TestPipelineParity(t *testing.T) {
modelsDir := os.Getenv("CHIRAMI_OCR_MODELS")
if modelsDir == "" {
t.Skip("skipping pipeline parity test: CHIRAMI_OCR_MODELS not set")
}
err := InitRuntime("")
if err != nil {
t.Fatalf("InitRuntime: %v", err)
}
pipe, err := NewPipeline(modelsDir)
if err != nil {
t.Fatalf("NewPipeline: %v", err)
}
defer pipe.Close()
refBytes, err := os.ReadFile("testdata/reference.json")
if err != nil {
t.Fatalf("read reference.json: %v", err)
}
var refs map[string]fixtureRef
if err := json.Unmarshal(refBytes, &refs); err != nil {
t.Fatalf("parse reference.json: %v", err)
}
for file, want := range refs {
t.Run(file, func(t *testing.T) {
f, err := os.Open(filepath.Join("testdata", file))
if err != nil {
t.Fatalf("open %s: %v", file, err)
}
defer f.Close()
img, err := png.Decode(f)
if err != nil {
t.Fatalf("decode png: %v", err)
}
res, err := pipe.Recognize(img)
if err != nil {
t.Fatalf("recognize: %v", err)
}
if got := res.Text(); got != want.Text {
t.Errorf("text mismatch: got %q, want %q", got, want.Text)
}
if len(res.Lines) != len(want.Lines) {
t.Fatalf("lines count mismatch: got %d, want %d (%+v vs %+v)",
len(res.Lines), len(want.Lines), res.Lines, want.Lines)
}
for i, l := range res.Lines {
wl := want.Lines[i]
if l.Text != wl.Text || l.Vertical != wl.Vertical {
t.Errorf("line %d mismatch: got {Text:%q Vertical:%v}, want {Text:%q Vertical:%v}",
i, l.Text, l.Vertical, wl.Text, wl.Vertical)
}
}
})
}
}