Der Auftraggeber hatte Funktion 2 ausdruecklich auf QR beschraenkt, obwohl die 2D-Codes auf seinen RAM-Etiketten DataMatrix sind. Am Geraet zeigte sich, dass die Funktion auf seiner Ware nichts fand - er hat die Entscheidung revidiert. Funktion 2 liest jetzt zusaetzlich zu QRCode/MicroQRCode/RMQRCode auch DataMatrix, Aztec und PDF417 und heisst in der Oberflaeche "2D-Code" statt "QR-Code". Die Kennung bleibt aus historischen Gruenden `qrcode`. Veralteten Kommentar in scan-modes.js berichtigt, Test auf die neue Codeliste/Beschriftung umgestellt (statt geloescht) und einen Test ergaenzt, der paarweise verschiedene Kennungen/Beschriftungen der drei Funktionen erzwingt. README-Funktionstabelle und Geraete-Checkliste entsprechend angepasst. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
80 lines
3.3 KiB
JavaScript
80 lines
3.3 KiB
JavaScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { buildRecognitionAdapters } from '../src/scan-recognition.js';
|
|
import { recognize } from '../src/pipeline.js';
|
|
|
|
test('Funktion 1: Texterkennung wird nicht aufgerufen, auch wenn kein Code gefunden wird', async () => {
|
|
let ocrCalled = false;
|
|
const adapters = buildRecognitionAdapters('barcode', {
|
|
decodeBarcodes: async () => [],
|
|
runOcr: async () => { ocrCalled = true; return 'irgendein Text'; },
|
|
});
|
|
const result = await recognize({}, adapters);
|
|
assert.equal(ocrCalled, false, 'runOcr darf in Funktion 1 nie aufgerufen werden');
|
|
assert.equal(result.confidence, 'red');
|
|
});
|
|
|
|
test('Funktion 2: Texterkennung wird nicht aufgerufen, auch wenn kein Code gefunden wird', async () => {
|
|
let ocrCalled = false;
|
|
const adapters = buildRecognitionAdapters('qrcode', {
|
|
decodeBarcodes: async () => [],
|
|
runOcr: async () => { ocrCalled = true; return 'irgendein Text'; },
|
|
});
|
|
const result = await recognize({}, adapters);
|
|
assert.equal(ocrCalled, false, 'runOcr darf in Funktion 2 nie aufgerufen werden');
|
|
assert.equal(result.confidence, 'red');
|
|
});
|
|
|
|
test('Funktion 3: Barcode-Dekodierung wird nicht aufgerufen', async () => {
|
|
let barcodeCalled = false;
|
|
const adapters = buildRecognitionAdapters('ocr', {
|
|
decodeBarcodes: async () => { barcodeCalled = true; return []; },
|
|
runOcr: async () => '64GB 4DRx4 PC4-2400T-LD1-11-MC0 M386A8K40BM1-CRC4Y 1908',
|
|
});
|
|
const result = await recognize({}, adapters);
|
|
assert.equal(barcodeCalled, false, 'decodeBarcodes darf in Funktion 3 nie aufgerufen werden');
|
|
assert.equal(result.source, 'ocr');
|
|
assert.equal(result.confidence, 'yellow');
|
|
});
|
|
|
|
test('Funktion 1: ein gelesener Strichcode fuehrt zu Gruen', async () => {
|
|
const adapters = buildRecognitionAdapters('barcode', {
|
|
decodeBarcodes: async () => ['M386A8K40BM1-CRC4Y'],
|
|
runOcr: async () => '',
|
|
});
|
|
const result = await recognize({}, adapters);
|
|
assert.equal(result.source, 'barcode');
|
|
assert.equal(result.confidence, 'green');
|
|
});
|
|
|
|
test('Funktion 3: kein brauchbarer Text fuehrt zu Rot, nicht zu Gruen', async () => {
|
|
const adapters = buildRecognitionAdapters('ocr', {
|
|
decodeBarcodes: async () => { throw new Error('darf nicht aufgerufen werden'); },
|
|
runOcr: async () => 'Made in Philippines',
|
|
});
|
|
const result = await recognize({}, adapters);
|
|
assert.equal(result.source, 'none');
|
|
assert.equal(result.confidence, 'red');
|
|
});
|
|
|
|
test('decodeBarcodes bekommt die Codearten der jeweiligen Funktion uebergeben', async () => {
|
|
let receivedFormats = null;
|
|
const adapters = buildRecognitionAdapters('qrcode', {
|
|
decodeBarcodes: async (_imageData, formats) => { receivedFormats = formats; return []; },
|
|
runOcr: async () => '',
|
|
});
|
|
await adapters.decodeBarcodes({});
|
|
assert.deepEqual(receivedFormats, ['QRCode', 'MicroQRCode', 'RMQRCode', 'DataMatrix', 'Aztec', 'PDF417']);
|
|
});
|
|
|
|
test('Funktion 3 uebergibt keine Codearten, weil decodeBarcodes gar nicht aufgerufen wird', async () => {
|
|
let called = false;
|
|
const adapters = buildRecognitionAdapters('ocr', {
|
|
decodeBarcodes: async () => { called = true; return []; },
|
|
runOcr: async () => '',
|
|
});
|
|
const codes = await adapters.decodeBarcodes({});
|
|
assert.deepEqual(codes, []);
|
|
assert.equal(called, false);
|
|
});
|