src/ocr-extract.js: RANK_PATTERN enthielt [Xx], obwohl der Text an dieser Stelle bereits vollstaendig grossgeschrieben ist (normalizeToken laeuft vorher) - das kleine x konnte nie ankommen. Auf X reduziert, mit Kommentar begruendet. Die uebrigen Muster im Modul (CAPACITY_PATTERN, SPEED_PATTERN, PART_NUMBER_PATTERN, das formFactor-Muster, DATE_CODE_PATTERN) geprueft: keine weiteren unerreichbaren Zweige, alle nutzen bereits ausschliesslich Grossbuchstaben-Zeichenklassen bzw. Ziffern. test/ocr-extract.test.js: Testname behauptete "nur einer plausibel", der Referenztext enthaelt aber zwei plausible Datumscode-Kandidaten (1234 und 1908) - der Test belegt tatsaechlich, dass bei mehreren plausiblen Kandidaten der zuletzt vorkommende gewinnt. Umbenannt entsprechend. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
72 lines
2.4 KiB
JavaScript
72 lines
2.4 KiB
JavaScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { extractFields } from '../src/ocr-extract.js';
|
|
|
|
const REFERENZ = `SAMSUNG
|
|
Made in Philippines
|
|
K136000908252DF287
|
|
64GB 4DRx4 PC4-2400T-LD1-11-MC0
|
|
M386A8K40BM1-CRC4Y S
|
|
1908`;
|
|
|
|
test('liest alle Felder aus dem Referenz-Etikett', () => {
|
|
const spec = extractFields(REFERENZ);
|
|
assert.equal(spec.capacityGb, 64);
|
|
assert.equal(spec.rank, '4DRx4');
|
|
assert.equal(spec.speed, 'PC4-2400');
|
|
assert.equal(spec.partNumber, 'M386A8K40BM1-CRC4Y');
|
|
assert.equal(spec.dateCode, '1908');
|
|
});
|
|
|
|
test('repariert eine Verwechslung in der Geschwindigkeit', () => {
|
|
const spec = extractFields('64GB 4DRx4 PC4-24O0T-LD1-11-MC0');
|
|
assert.equal(spec.speed, 'PC4-2400');
|
|
});
|
|
|
|
test('repariert eine Verwechslung in der Kapazitaet', () => {
|
|
const spec = extractFields('BGB 1Rx8 PC4-2400');
|
|
assert.equal(spec.capacityGb, 8, 'B wird als 8 gelesen');
|
|
assert.equal(spec.rank, '1Rx8');
|
|
});
|
|
|
|
test('erkennt die Bauform aus dem Klartext, wenn vorhanden', () => {
|
|
const spec = extractFields('32GB 2Rx4 PC4-2666 RDIMM');
|
|
assert.equal(spec.formFactor, 'RDIMM');
|
|
});
|
|
|
|
test('laesst Felder offen, die nicht im Text stehen', () => {
|
|
const spec = extractFields('Oracle PN: 7325773');
|
|
assert.equal(spec.capacityGb, null);
|
|
assert.equal(spec.speed, null);
|
|
assert.equal(spec.rank, null);
|
|
});
|
|
|
|
test('unbekannte Geschwindigkeit bleibt null statt falsch geraten', () => {
|
|
const spec = extractFields('64GB 4DRx4 PC4-9999');
|
|
assert.equal(spec.speed, null);
|
|
assert.equal(spec.capacityGb, 64);
|
|
});
|
|
|
|
test('leerer Text liefert ein leeres Spec', () => {
|
|
const spec = extractFields('');
|
|
assert.equal(spec.capacityGb, null);
|
|
assert.equal(spec.partNumber, null);
|
|
});
|
|
|
|
test('waehlt bei der Teilenummer den laengsten Bindestrich-Kandidaten, nicht den ersten', () => {
|
|
const spec = extractFields(
|
|
'SAMSUNG\nAB1234SN-001\n64GB 4DRx4 PC4-2400\nM386A8K40BM1-CRC4Y\n1908',
|
|
);
|
|
assert.equal(spec.partNumber, 'M386A8K40BM1-CRC4Y');
|
|
});
|
|
|
|
test('bei mehreren plausiblen Datumscode-Kandidaten gewinnt der zuletzt vorkommende', () => {
|
|
const spec = extractFields('SAMSUNG\n1234 5678\n64GB 2Rx4 PC4-2666\n9012\n1908');
|
|
assert.equal(spec.dateCode, '1908');
|
|
});
|
|
|
|
test('laesst den Datumscode null, wenn kein Kandidat als Jahr-Woche plausibel ist', () => {
|
|
const spec = extractFields('SAMSUNG\n9999 0060\n64GB 2Rx4 PC4-2666');
|
|
assert.equal(spec.dateCode, null);
|
|
});
|