Die Zaehlanzeige sprang beim Nutzer im Dauerbetrieb wild zwischen etwa 3 und 60, obwohl dasselbe Verfahren an einem Standfoto stabil 18 lieferte - eine Schaetzung wird durch staendiges Neuanzeigen nicht praeziser, nur unruhig. "Zählen" laeuft jetzt wie "Text erkennen" auf Knopfdruck: eine Aufnahme nimmt binnen rund einer Sekunde fuenf Bilder aus dem Zielrahmen auf, zaehlt jedes einzeln (count-objects.js unveraendert) und zeigt deren Median (neues Modul count-capture.js). Das Ergebnis bleibt stehen, bis erneut angetippt wird; die Diagnosezeile zeigt zusaetzlich die fuenf Einzelmessungen. Der gleitende Median ueber neun Durchlaeufe der Dauerzaehlung (count-history.js) entfaellt, da die Aufnahme dieselbe Robustheit bereits selbst leistet. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
57 lines
2.4 KiB
JavaScript
57 lines
2.4 KiB
JavaScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { SCAN_MODES, getScanMode } from '../src/scan-modes.js';
|
|
|
|
test('genau vier Funktionen in fester Reihenfolge', () => {
|
|
assert.equal(SCAN_MODES.length, 4);
|
|
assert.deepEqual(SCAN_MODES.map((mode) => mode.id), ['barcode', 'qrcode', 'ocr', 'count']);
|
|
});
|
|
|
|
test('Funktion 1 (Strichcode): eindimensionale Codearten, laufende Suche, keine Texterkennung', () => {
|
|
const mode = getScanMode('barcode');
|
|
assert.equal(mode.label, 'Strichcode');
|
|
assert.deepEqual(mode.barcodeFormats, [
|
|
'Code128', 'Code39', 'Code93', 'ITF', 'EAN13', 'EAN8', 'UPCA', 'UPCE', 'Codabar',
|
|
]);
|
|
assert.equal(mode.continuousSearch, true);
|
|
assert.equal(mode.useOcr, false);
|
|
});
|
|
|
|
test('Funktion 2 (QR-Code): QR-Varianten und DataMatrix, Aztec, PDF417', () => {
|
|
const mode = getScanMode('qrcode');
|
|
assert.equal(mode.label, 'QR-Code');
|
|
assert.deepEqual(mode.barcodeFormats, [
|
|
'QRCode', 'MicroQRCode', 'RMQRCode', 'DataMatrix', 'Aztec', 'PDF417',
|
|
]);
|
|
assert.ok(mode.barcodeFormats.includes('DataMatrix'), 'Funktion 2 muss DataMatrix lesen (Etiketten der Ware tragen DataMatrix)');
|
|
assert.equal(mode.continuousSearch, true);
|
|
assert.equal(mode.useOcr, false);
|
|
});
|
|
|
|
test('die vier Funktionen haben paarweise verschiedene Kennungen und Beschriftungen', () => {
|
|
const ids = SCAN_MODES.map((mode) => mode.id);
|
|
const labels = SCAN_MODES.map((mode) => mode.label);
|
|
assert.equal(new Set(ids).size, ids.length, 'Kennungen muessen paarweise verschieden sein');
|
|
assert.equal(new Set(labels).size, labels.length, 'Beschriftungen muessen paarweise verschieden sein');
|
|
});
|
|
|
|
test('Funktion 3 (Text erkennen): keine Codearten, keine laufende Suche, Texterkennung', () => {
|
|
const mode = getScanMode('ocr');
|
|
assert.equal(mode.label, 'Text erkennen');
|
|
assert.deepEqual(mode.barcodeFormats, []);
|
|
assert.equal(mode.continuousSearch, false);
|
|
assert.equal(mode.useOcr, true);
|
|
});
|
|
|
|
test('Funktion 4 (Zählen): keine Codearten, keine laufende Codesuche, keine Texterkennung - auf Knopfdruck wie Funktion 3', () => {
|
|
const mode = getScanMode('count');
|
|
assert.equal(mode.label, 'Zählen');
|
|
assert.deepEqual(mode.barcodeFormats, []);
|
|
assert.equal(mode.continuousSearch, false);
|
|
assert.equal(mode.useOcr, false);
|
|
});
|
|
|
|
test('unbekannte Kennung wirft statt undefined zurueckzugeben', () => {
|
|
assert.throws(() => getScanMode('unbekannt'));
|
|
});
|