import assert from 'node:assert/strict'; import test from 'node:test'; import { assessmentReady, diagnosticReady, forces, newCompetitivenessDraft, readCompetitivenessDraft, } from '../../resources/js/lib/cluster-competitiveness.ts'; function complete() { const draft = newCompetitivenessDraft('cluster-a', 'Energia'); draft.region = 'Distrito de demonstração'; for (const force of forces) Object.assign(draft.forces[force], { pressure: 'medium', evidence: 'Observação de demonstração', source: 'Fonte de demonstração, p. 2', period: '2025', rationale: 'Pressão fundamentada na observação', limitations: 'Amostra parcial', opportunity: 'Investigar capacidade de armazenamento', }); return draft; } void test('ausência de dados permanece indeterminada nas cinco forças independentes', () => { const draft = newCompetitivenessDraft('cluster-a', 'Energia'); assert.equal(forces.length, 5); assert.equal(diagnosticReady(draft), false); draft.forces.buyers.evidence = 'Observação'; assert.equal(draft.forces.suppliers.evidence, ''); assert.ok(forces.every((force) => draft.forces[force].pressure === '')); }); void test('classificação exige todos os fundamentos; âmbito é necessário para o diagnóstico', () => { const draft = complete(); assert.equal(diagnosticReady(draft), true); for (const field of [ 'evidence', 'source', 'period', 'rationale', 'limitations', 'opportunity', ]) { const row = { ...draft.forces.buyers, [field]: ' ' }; assert.equal(assessmentReady(row), false, field); } draft.region = ''; assert.equal(diagnosticReady(draft), false); }); void test('ficheiro conserva rascunhos, dados e incertezas sem modificar o original', () => { const draft = complete(); draft.forces.entrants.pressure = ''; const restored = readCompetitivenessDraft( JSON.stringify(draft), 'cluster-a', ); assert.deepEqual(restored, draft); restored.forces.buyers.source = 'Outra fonte'; assert.notEqual(restored.forces.buyers.source, draft.forces.buyers.source); assert.equal(diagnosticReady(restored), false); }); void test('recuperação rejeita outro cluster, versões, forças ausentes e campos inválidos', () => { assert.throws(() => readCompetitivenessDraft(JSON.stringify(complete()), 'cluster-b'), ); for (const mutate of [ (d) => { d.version = 2; }, (d) => { delete d.forces.buyers; }, (d) => { d.forces.buyers.pressure = 'zero'; }, (d) => { d.forces.buyers.source = 42; }, (d) => { d.forces.buyers.source = 'x'.repeat(5001); }, (d) => { d.region = null; }, ]) { const draft = complete(); mutate(draft); assert.throws(() => readCompetitivenessDraft(JSON.stringify(draft), 'cluster-a'), ); } assert.throws(() => readCompetitivenessDraft('null', 'cluster-a')); assert.throws(() => readCompetitivenessDraft('x'.repeat(250001), 'cluster-a'), ); });