Files
immich/web/src/lib/utils/ocr-utils.spec.ts
midzelis ed04d87273 feat(web): OCR overlay interactivity during zoom
Change-Id: Id62e1a0264df2de0f3177a59b24bc5176a6a6964
2026-03-23 13:16:08 +00:00

116 lines
2.6 KiB
TypeScript

import type { OcrBoundingBox } from '$lib/stores/ocr.svelte';
import type { Size } from '$lib/utils/container-utils';
import { getOcrBoundingBoxes } from '$lib/utils/ocr-utils';
describe('getOcrBoundingBoxes', () => {
it('should scale normalized coordinates by display dimensions', () => {
const ocrData: OcrBoundingBox[] = [
{
id: 'box1',
assetId: 'asset1',
x1: 0.1,
y1: 0.2,
x2: 0.9,
y2: 0.2,
x3: 0.9,
y3: 0.8,
x4: 0.1,
y4: 0.8,
boxScore: 0.95,
textScore: 0.9,
text: 'hello',
},
];
const imageSize: Size = { width: 1000, height: 500 };
const boxes = getOcrBoundingBoxes(ocrData, imageSize);
expect(boxes).toHaveLength(1);
expect(boxes[0].id).toBe('box1');
expect(boxes[0].text).toBe('hello');
expect(boxes[0].confidence).toBe(0.9);
expect(boxes[0].points).toEqual([
{ x: 100, y: 100 },
{ x: 900, y: 100 },
{ x: 900, y: 400 },
{ x: 100, y: 400 },
]);
});
it('should map full-image box to full display area', () => {
const ocrData: OcrBoundingBox[] = [
{
id: 'box1',
assetId: 'asset1',
x1: 0,
y1: 0,
x2: 1,
y2: 0,
x3: 1,
y3: 1,
x4: 0,
y4: 1,
boxScore: 0.9,
textScore: 0.8,
text: 'test',
},
];
const imageSize: Size = { width: 600, height: 400 };
const boxes = getOcrBoundingBoxes(ocrData, imageSize);
expect(boxes[0].points).toEqual([
{ x: 0, y: 0 },
{ x: 600, y: 0 },
{ x: 600, y: 400 },
{ x: 0, y: 400 },
]);
});
it('should return empty array for empty input', () => {
expect(getOcrBoundingBoxes([], { width: 800, height: 600 })).toEqual([]);
});
it('should handle multiple boxes', () => {
const ocrData: OcrBoundingBox[] = [
{
id: 'a',
assetId: 'asset1',
x1: 0,
y1: 0,
x2: 0.5,
y2: 0,
x3: 0.5,
y3: 0.5,
x4: 0,
y4: 0.5,
boxScore: 0.9,
textScore: 0.8,
text: 'first',
},
{
id: 'b',
assetId: 'asset1',
x1: 0.5,
y1: 0.5,
x2: 1,
y2: 0.5,
x3: 1,
y3: 1,
x4: 0.5,
y4: 1,
boxScore: 0.9,
textScore: 0.7,
text: 'second',
},
];
const imageSize: Size = { width: 200, height: 200 };
const boxes = getOcrBoundingBoxes(ocrData, imageSize);
expect(boxes).toHaveLength(2);
expect(boxes[0].text).toBe('first');
expect(boxes[1].text).toBe('second');
});
});