import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import test from 'node:test'; import { fileURLToPath } from 'node:url'; // AURORA-1905: в 1-3 кв. "Комментарий" (adj_comment) уже шёл сразу после // "Корректировки из резерва" (adj_reserve), перед "Скорректированный план" // (corrected_plan); в 4 кв. порядок был нарушен (corrected_plan раньше adj_comment). const SHEETS = ['AHR', 'CAP', 'OPER']; function extractDataAccessorKeys(source) { // Пропускаем секцию "colors" (плоская карта, свой, не относящийся к // расположению столбцов порядок) — берём только дерево "columns". const columnsStart = source.indexOf('\n\t\tcolumns: ['); const columnsSource = columnsStart === -1 ? source : source.slice(columnsStart); const matches = columnsSource.matchAll(/accessorKey:\s*'(data\.[^']+)'/g); return [...matches].map((m) => m[1]); } for (const sheet of SHEETS) { test(`FORM_1/${sheet}.js: q4 adj_reserve -> adj_comment -> corrected_plan`, () => { const path = fileURLToPath(new URL(`../constants/FORM_1/${sheet}.js`, import.meta.url)); const keys = extractDataAccessorKeys(readFileSync(path, 'utf8')); const reserveIndex = keys.indexOf('data.q4.adj_reserve'); const commentIndex = keys.indexOf('data.q4.adj_comment'); const planIndex = keys.indexOf('data.q4.corrected_plan'); assert.notEqual(reserveIndex, -1, 'data.q4.adj_reserve не найден'); assert.notEqual(commentIndex, -1, 'data.q4.adj_comment не найден'); assert.notEqual(planIndex, -1, 'data.q4.corrected_plan не найден'); assert.ok(reserveIndex < commentIndex, 'adj_comment должен идти после adj_reserve'); assert.ok(commentIndex < planIndex, 'adj_comment должен идти перед corrected_plan'); }); }