import { test } from 'node:test'; import assert from 'node:assert/strict'; import { KNOWN, emptySpec, canonical, matchKnown, specsCompatible } from '../src/spec.js'; test('canonical bildet verwechselbare Zeichen auf einen Vertreter ab', () => { assert.equal(canonical('PC4-24O0'), canonical('PC4-2400')); assert.equal(canonical('1RX8'), canonical('IRX8')); assert.equal(canonical('BGB'), canonical('868')); assert.equal(canonical('LRDIMM'), canonical('1RD1MM')); }); test('canonical laesst D unangetastet, damit 4DRx4 erhalten bleibt', () => { assert.notEqual(canonical('4DRX4'), canonical('40RX4')); }); test('matchKnown findet den exakten Wert', () => { assert.equal(matchKnown('PC4-2400', KNOWN.speed), 'PC4-2400'); assert.equal(matchKnown('lrdimm', KNOWN.formFactor), 'LRDIMM'); }); test('matchKnown repariert eine Verwechslung', () => { assert.equal(matchKnown('PC4-24O0', KNOWN.speed), 'PC4-2400'); assert.equal(matchKnown('4DRX4', KNOWN.rank), '4DRx4'); }); test('matchKnown liefert null bei unbekanntem Wert', () => { assert.equal(matchKnown('PC4-9999', KNOWN.speed), null); assert.equal(matchKnown('', KNOWN.speed), null); }); test('matchKnown funktioniert auch mit Zahlenlisten', () => { assert.equal(matchKnown('64', KNOWN.capacityGb), 64); assert.equal(matchKnown('6A', KNOWN.capacityGb), null); }); test('specsCompatible vergleicht nur beidseitig gesetzte Felder', () => { const full = { capacityGb: 64, formFactor: 'LRDIMM', rank: '4DRx4', speed: 'PC4-2400', partNumber: 'M386A8K40BM1-CRC4Y', dateCode: '1908' }; const withoutPartNumber = { ...full, partNumber: null, dateCode: null }; assert.equal(specsCompatible(full, withoutPartNumber), true); }); test('specsCompatible erkennt einen echten Unterschied', () => { const a = { ...emptySpec(), capacityGb: 64, speed: 'PC4-2400' }; const b = { ...emptySpec(), capacityGb: 32, speed: 'PC4-2400' }; assert.equal(specsCompatible(a, b), false); }); test('specsCompatible trennt gleiche Spec mit unterschiedlicher Teilenummer', () => { const samsung = { ...emptySpec(), capacityGb: 64, speed: 'PC4-2400', partNumber: 'M386A8K40BM1-CRC4Y' }; const hynix = { ...emptySpec(), capacityGb: 64, speed: 'PC4-2400', partNumber: 'HMAA8GL7AMR4N-UH' }; assert.equal(specsCompatible(samsung, hynix), false); }); test('specsCompatible toleriert eine Verwechslung in der Teilenummer', () => { const a = { ...emptySpec(), capacityGb: 64, partNumber: 'M386A8K40BM1-CRC4Y' }; const b = { ...emptySpec(), capacityGb: 64, partNumber: 'M386A8K4OBM1-CRC4Y' }; assert.equal(specsCompatible(a, b), true); }); test('matchKnown findet einen Zahlenwert in der Liste', () => { assert.equal(matchKnown(64, KNOWN.capacityGb), 64); assert.equal(matchKnown(128, KNOWN.capacityGb), 128); }); test('canonical behandelt Zahlen wie Zeichenketten', () => { assert.equal(canonical(64), canonical('64')); assert.equal(canonical(128), canonical('128')); }); test('canonical mit null ergibt Leerzeichenkette', () => { assert.equal(canonical(null), ''); }); test('canonical mit undefined ergibt Leerzeichenkette', () => { assert.equal(canonical(undefined), ''); }); test('matchKnown mit null ergibt null', () => { assert.equal(matchKnown(null, KNOWN.capacityGb), null); }); test('matchKnown mit undefined ergibt null', () => { assert.equal(matchKnown(undefined, KNOWN.capacityGb), null); });