Files
wehub-resource-sync e904b667c6
Build/Publish Develop Docs / deploy (push) Failing after 1s
PaddleOCR Code Style Check / check-code-style (push) Failing after 1s
PaddleOCR PR Tests GPU / detect-changes (push) Failing after 1s
PaddleOCR PR Tests / detect-changes (push) Failing after 1s
PaddleOCR PR Tests GPU / test-pr-gpu (push) Has been cancelled
PaddleOCR PR Tests / test-pr (push) Has been cancelled
PaddleOCR PR Tests GPU / test-pr-gpu-impl (push) Has been cancelled
PaddleOCR PR Tests / test-pr-python (3.13) (push) Has been cancelled
PaddleOCR PR Tests / test-pr-python (3.8) (push) Has been cancelled
PaddleOCR PR Tests / test-pr-python (3.9) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 11:59:26 +08:00

131 lines
3.6 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
cloneDefaultOcrConfig,
normalizeOrtOptions,
resolvePaddleOCROptions,
resolveWorkerOptions,
validateLoadedModelName
} from "../src/pipelines/ocr/shared";
describe("OCR shared option resolution", () => {
it("normalizes ORT options and reuses the same backend fallback", () => {
const defaultOrt = normalizeOrtOptions();
expect(defaultOrt).toMatchObject({
backend: expect.any(String)
});
expect(normalizeOrtOptions({ backend: "invalid", proxy: true })).toEqual({
backend: defaultOrt.backend,
proxy: true
});
expect(
normalizeOrtOptions({
backend: "wasm",
wasmPaths: "/wasm/",
numThreads: 2,
simd: true,
proxy: false
})
).toEqual({
backend: "wasm",
wasmPaths: "/wasm/",
numThreads: 2,
simd: true,
proxy: false
});
});
it("resolves worker options from booleans and custom factories", () => {
const createWorker = () => ({});
expect(resolveWorkerOptions(false)).toEqual({
enabled: false,
createWorker: null
});
expect(resolveWorkerOptions(true)).toEqual({
enabled: true,
createWorker: null
});
expect(resolveWorkerOptions({ createWorker })).toEqual({
enabled: true,
createWorker
});
expect(resolveWorkerOptions({})).toEqual({
enabled: true,
createWorker: null
});
});
it("rejects unsupported worker option types", () => {
expect(() => resolveWorkerOptions("yes")).toThrow(
/worker must be a boolean or an options object/i
);
});
it("returns ortOptions, assets, and model selection for explicit model names", () => {
const options = resolvePaddleOCROptions({
text_detection_model_name: "PP-OCRv5_mobile_det",
text_recognition_model_name: "PP-OCRv5_mobile_rec",
ortOptions: {
backend: "webgpu",
proxy: true
}
});
expect(options.ortOptions).toEqual({
backend: "webgpu",
proxy: true
});
expect(options.pipelineConfig.assets.det?.url).toMatch(/PP-OCRv5_mobile_det.*\.tar$/);
expect(options.pipelineConfig.assets.rec?.url).toMatch(/PP-OCRv5_mobile_rec.*\.tar$/);
expect(options.pipelineConfig.modelSelection).toEqual({
textDetectionModelName: "PP-OCRv5_mobile_det",
textRecognitionModelName: "PP-OCRv5_mobile_rec"
});
});
it("rejects incomplete pipeline model selection", () => {
expect(() =>
resolvePaddleOCROptions({
pipelineConfig: {
pipeline_name: "OCR",
SubModules: {
TextDetection: {
model_name: "PP-OCRv5_mobile_det"
}
}
}
})
).toThrow(/must define both "SubModules.TextDetection" and "SubModules.TextRecognition"/i);
});
it("clones the default OCR config deeply", () => {
const cloned = cloneDefaultOcrConfig();
cloned.det.postprocess.thresh = 0.99;
expect(cloned.det.postprocess.thresh).toBe(0.99);
const freshClone = cloneDefaultOcrConfig();
expect(freshClone.det.postprocess.thresh).not.toBe(0.99);
});
it("validates loaded model names against inference.yml (roles match pipeline initialize)", () => {
expect(() =>
validateLoadedModelName(
"TextDetection",
"PP-OCRv5_mobile_det",
"Global:\n model_name: PP-OCRv5_mobile_det"
)
).not.toThrow();
expect(() =>
validateLoadedModelName(
"TextDetection",
"PP-OCRv5_mobile_det",
"Global:\n model_name: other"
)
).toThrow(/requested model_name is "PP-OCRv5_mobile_det"/i);
});
});