// Decoupe d'une note de commandes (js/app.js parseCommandNote). const test = require('node:test'); const assert = require('node:assert/strict'); const { loadApp } = require('./harness.js'); const T = loadApp().__test; const plain = (x) => JSON.parse(JSON.stringify(x)); test('groupes "# titre", une commande par ligne, lignes vides ignorees', () => { const r = T.parseCommandNote('# Prod\r\nssh a@1\n\n ssh a@2 \n# Base\npsql -h x\n'); assert.deepEqual(plain(r), [ { group: 'Prod', cmd: 'ssh a@1' }, { group: 'Prod', cmd: 'ssh a@2' }, { group: 'Base', cmd: 'psql -h x' }, ]); }); test('commandes avant tout titre : groupe vide', () => { assert.equal(T.parseCommandNote('ls -la\n# G\npwd')[0].group, ''); }); test('"## titre" et "#" seul', () => { const r = T.parseCommandNote('## Deux\na\n#\nb'); assert.equal(r[0].group, 'Deux'); assert.equal(r[1].group, ''); }); test('masque : premier mot, milieu masque, 3 derniers caracteres', () => { assert.equal(T.maskCommand('ssh admin@10.0.0.11'), 'ssh ' + '•'.repeat(12) + '.11'); assert.equal(T.maskCommand('psql -h 10.0.0.20'), 'psql ' + '•'.repeat(9) + '.20'); }); test('masque : fin courte masquee en entier, pas d\'espace', () => { assert.equal(T.maskCommand('ls -la'), 'ls •••'); assert.equal(T.maskCommand('hostname'), '•••••ame'); assert.equal(T.maskCommand(''), ''); }); test('lignes continuees (\\, `, ^) : une seule commande, sur une ligne', () => { const note = [ '# D', 'docker run -d \\', ' -p 8080:80 \\', ' nginx', 'Get-Item a `', ' -Force', 'dir ^', ' /s', ].join('\n'); const r = T.parseCommandNote(note); assert.deepEqual(plain(r).map(x => x.cmd), [ 'docker run -d -p 8080:80 nginx', 'Get-Item a -Force', 'dir /s', ]); assert.equal(r[0].group, 'D'); }); test('continuation coupee par une ligne vide ou la fin du texte', () => { assert.deepEqual(plain(T.parseCommandNote('a \\\n\nb')).map(x => x.cmd), ['a', 'b']); assert.deepEqual(plain(T.parseCommandNote('a \\')).map(x => x.cmd), ['a']); }); test('un "#" apres une continuation fait partie de la commande', () => { assert.equal(T.parseCommandNote('echo \\\n#x')[0].cmd, 'echo #x'); }); test('texte vide ou absent', () => { assert.equal(T.parseCommandNote('').length, 0); assert.equal(T.parseCommandNote(null).length, 0); });