import test from 'node:test';import assert from 'node:assert/strict';import {readFile} from 'node:fs/promises'; import {createIban,ibanError,bicError,compactIban,formatIban,changedBankError} from '../src/masterBank.mjs'; const examples=JSON.parse(await readFile(new URL('./fixtures/master-bank-php.json',import.meta.url),'utf8')); test('IBAN calculation matches 52 independently executed current PHP-script cases across all 48 country formats',()=>{ assert.equal(examples.length,52);assert.equal(new Set(examples.map(e=>e.country)).size,48); for(const e of examples){assert.equal(createIban(e.country,e.bank,e.account),e.iban,e.country);assert.equal(ibanError(e.iban),'',e.country);} }); test('known IBAN keeps leading zeroes and grouping without numeric precision loss',()=>{ assert.equal(createIban('DE','37040044','532013000'),'DE89370400440532013000');assert.equal(formatIban('DE89370400440532013000'),'DE89 3704 0044 0532 0130 00'); assert.equal(ibanError('IBAN DE89 3704 0044 0532 0130 00'),'');assert.equal(ibanError('de89\t37040044 0532013000'),'');assert.equal(compactIban(null),''); }); test('invalid bank/account lengths, alphabetic positions and unsupported countries never produce proposals',()=>{ for(const args of [['DE','123','1'],['DE','3704004A','1'],['DE','37040044',''],['DE','37040044','12345678901'],['DE','37040044','a'],['GB','1234123456','12345678'],['XX','12345678','1']])assert.throws(()=>createIban(...args)); }); test('checksum and structural faults are distinguished from blank optional bank fields',()=>{ assert.equal(ibanError(''),'');assert.equal(ibanError(null),''); for(const invalid of ['DE88370400440532013000','DE8937040044053201300','DEAB370400440532013000','DE8937040_440532013000','XX89370400440532013000'])assert.notEqual(ibanError(invalid),'',invalid); }); test('BIC supports eight or eleven letters/digits with alphabetic bank/country codes',()=>{ for(const ok of ['',null,'COBADEFF','cobadeffxxx','DABAIE2DXXX'])assert.equal(bicError(ok),''); for(const bad of ['COBADE','COB1DEFF','COBA1EFF','COBADEFFXX','COBA DEFF','COBADEFF!XX'])assert.notEqual(bicError(bad),''); }); test('legacy bank fields remain editable without forcing unrelated corrections; changed invalid values block saving',()=>{ const old={cmp_iban:'LEGACY',cmp_swift:'OLD',cmp_comp:'Vorher'};assert.equal(changedBankError({...old,cmp_comp:'Nachher'},old),''); assert.notEqual(changedBankError({...old,cmp_iban:'BAD'},old),'');assert.notEqual(changedBankError({...old,cmp_swift:'BAD'},old),''); assert.equal(changedBankError({...old,cmp_iban:'',cmp_swift:''},old),'');assert.notEqual(changedBankError(old,{}),''); });