112 lines
2.5 KiB
Go
112 lines
2.5 KiB
Go
package pipeline
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/pys/pdf-count/internal/domain"
|
|
"github.com/pys/pdf-count/internal/ocr"
|
|
)
|
|
|
|
func testPDFDir(t *testing.T) string {
|
|
t.Helper()
|
|
if d := os.Getenv("COUNT_TEST_PDF_DIR"); d != "" {
|
|
if st, err := os.Stat(d); err == nil && st.IsDir() {
|
|
return d
|
|
}
|
|
t.Fatalf("COUNT_TEST_PDF_DIR=%s not a directory", d)
|
|
}
|
|
|
|
var starts []string
|
|
if _, file, _, ok := runtime.Caller(0); ok {
|
|
starts = append(starts, filepath.Dir(file))
|
|
}
|
|
if wd, err := os.Getwd(); err == nil {
|
|
starts = append(starts, wd)
|
|
}
|
|
|
|
for _, start := range starts {
|
|
dir := start
|
|
for i := 0; i < 8; i++ {
|
|
candidate := filepath.Join(dir, "docs", "plan_pruebas", "data")
|
|
if st, err := os.Stat(candidate); err == nil && st.IsDir() {
|
|
return candidate
|
|
}
|
|
parent := filepath.Dir(dir)
|
|
if parent == dir {
|
|
break
|
|
}
|
|
dir = parent
|
|
}
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func listFixturePDFs(t *testing.T, dir string) []string {
|
|
t.Helper()
|
|
entries, err := os.ReadDir(dir)
|
|
if err != nil {
|
|
t.Fatalf("read pdf dir: %v", err)
|
|
}
|
|
var files []string
|
|
for _, e := range entries {
|
|
if e.IsDir() {
|
|
continue
|
|
}
|
|
name := e.Name()
|
|
if strings.EqualFold(filepath.Ext(name), ".pdf") {
|
|
files = append(files, filepath.Join(dir, name))
|
|
}
|
|
}
|
|
return files
|
|
}
|
|
|
|
func TestProcessPDFTimingFixtures(t *testing.T) {
|
|
dir := testPDFDir(t)
|
|
if dir == "" {
|
|
t.Skip("PDF fixtures not found; set COUNT_TEST_PDF_DIR to docs/plan_pruebas/data")
|
|
}
|
|
pdfs := listFixturePDFs(t, dir)
|
|
if len(pdfs) == 0 {
|
|
t.Skip("no PDF files in " + dir)
|
|
}
|
|
|
|
engine, err := ocr.NewEngine("spa", 1)
|
|
if err != nil {
|
|
t.Skipf("tesseract not available: %v", err)
|
|
}
|
|
defer engine.Close()
|
|
|
|
proc := NewProcessor(nil, engine, Options{
|
|
DPI: 200,
|
|
DBSCANEps: 10,
|
|
DBSCANMinSamples: 1,
|
|
LogPipelineTiming: true,
|
|
})
|
|
|
|
t.Logf("pdf_dir=%s files=%d", dir, len(pdfs))
|
|
t.Logf("%-28s %8s %8s %8s %8s %8s %6s %s",
|
|
"file", "render", "ocr", "cluster", "infer", "total", "count", "status")
|
|
|
|
for _, path := range pdfs {
|
|
data, err := os.ReadFile(path)
|
|
if err != nil {
|
|
t.Fatalf("read %s: %v", path, err)
|
|
}
|
|
name := filepath.Base(path)
|
|
res := proc.ProcessPDF(name, data)
|
|
t.Logf("%-28s %6dms %6dms %6dms %6dms %6dms %6d %s",
|
|
name, res.RenderMs, res.OCRMs, res.ClusterMs, res.InferMs, res.TotalMs, res.ServiceCount, res.Status)
|
|
if res.Status == domain.StatusError {
|
|
t.Errorf("%s failed: %s", name, res.Error)
|
|
continue
|
|
}
|
|
if res.TotalMs <= 0 {
|
|
t.Errorf("%s: TotalMs should be > 0", name)
|
|
}
|
|
}
|
|
}
|