"""EST 테스트 앱 데이타 자동연결(원본 TfrmDataAutoLink, 맞춤 10e0e58·행 처리 10d2a48).""" import json import subprocess from pathlib import Path ROOT = Path(__file__).resolve().parents[2] def run(code: str): script = f""" const fs = require('fs'), vm = require('vm'); const ctx = vm.createContext({{}}); vm.runInContext(fs.readFileSync('tools/est-test/native-autolink.js', 'utf8'), ctx); process.stdout.write(JSON.stringify(vm.runInContext({json.dumps(code)}, ctx))); """ return json.loads(subprocess.check_output(["node", "-e", script], cwd=ROOT).decode("utf-8")) def test_matching_rules_order_and_overwrite(): result = run( """(() => { const base = () => ({ tables: { LaborcDat: [{ Code: 'L1', Name: '보통 인부', TC: 170000, NC: 170000 }], StuffcDat: [{ Code: 'M1', Name: '레미콘', Size: '25-24-(150)', Unite: 'm3', TC: 90000, GC: 90000 }, { Code: 'M2', Name: '보통인부', TC: 1, GC: 1 }], HeadTitleDat: [{ Code: 'U1', Name: '거푸집', Size: '합판', Unite: '㎡당', TC: 30000, NC: 20000, GC: 10000, SCheck: 3 }], EstMainDat: [ { Name: '공종', Level: 2 }, { Name: '보통인부', Size: '일반', Unite: '인' }, { Name: '레미콘', Size: '25-24-150', Unite: '[m3]' }, { Name: '레미콘', Size: '25-24-150', Unite: 'ton' }, { Name: '거 푸 집', Size: '(합판)', Unite: '㎡' }, { Name: '일반', Size: '보통인부' }, { Name: '순공사비', LinkIndex: 54 }, { Name: '이미', LinkIndex: 5, Code: 'OLD' } ] } }); const p = base(); const n = EstAutoLink.run(p, 'EstMainDat', 'all', false); const r = p.tables.EstMainDat; const q = base(); q.tables.EstMainDat[7].Name = '레미콘'; q.tables.EstMainDat[7].Size = '25-24-150'; q.tables.EstMainDat[7].Unite = 'm3'; EstAutoLink.run(q, 'EstMainDat', '5', true); const u = base(); const cut = EstAutoLink.run(u, 'EstMainDat', 'unlink', false); return { n, rows: r.map((x) => [x.Code ?? null, x.LinkIndex ?? null]), unit: [r[2].GU, r[2].TU], swap: [r[5].Name, r[5].Size], head: [r[4].NU, r[4].GU, r[4].SCheck], over: q.tables.EstMainDat[7].Code, cut, allZero: u.tables.EstMainDat.every((x) => x.LinkIndex === 0) }; })()""" ) assert result["n"] == 4 assert result["rows"] == [ [None, None], ["L1", 6], ["M1", 5], [None, None], ["U1", 103], ["L1", 6], [None, 54], ["OLD", 5], ] assert result["unit"] == [90000, 90000] assert result["swap"] == ["보통인부", "일반"] assert result["head"] == [20000, 10000, 3] assert result["over"] == "M1" assert result["cut"] == 8 and result["allZero"] is True