"""EST 테스트 앱 조달청 XML 검사·자리수자동수정(원본 TfrmJDLConvert 검사 1·8·10·11, TfrmXMLDigetCheck).""" import json import subprocess from pathlib import Path ROOT = Path(__file__).resolve().parents[2] def test_rules_and_fix(): script = """ const fs = require('fs'), vm = require('vm'); const ctx = vm.createContext({ structuredClone }); for (const f of ['native-math.js', 'native-formula.js', 'native-text.js', 'native-xml-check.js']) vm.runInContext(fs.readFileSync('tools/est-test/' + f, 'utf8'), ctx); ctx.p = { tables: { CostMainDat: [ { Index: 1, Code: 'D1', Name: '터파기' }, { SCheck: -1, Diget: 2, LineData: '노무' }, { SCheck: 0, LinkIndex: 5, Diget: 1, LineData: '플래그 전 재료' }, { Index: -20 }, { LinkIndex: 6, DigetIndex: 1, LineData: '노임 연결' }, { LinkIndex: 61 }, { LinkIndex: 5, Diget: 3, LineData: '소계 뒤 재료' } ], StuffcDat: [{ Code: 'M1', Index: 1, Name: '가', Size: '규' }, { Code: 'M1', Index: 2, Name: '나' }, { Code: 'm2', Index: 3 }], MachTitleDat: [{ Code: 'E0000000233' }, { Code: 'E1234567890123456' }] } }; const list = vm.runInContext('EstXmlCheck.check(p)', ctx).map((e) => [e.kind, e.table, e.index, e.text]); const fixed = vm.runInContext('EstXmlCheck.fix(p)', ctx); const after = vm.runInContext('EstXmlCheck.check(p).filter((e) => e.kind === 1).length', ctx); const kept = vm.runInContext('[p.tables.CostMainDat[2].Diget, p.tables.CostMainDat[6].Diget, p.tables.CostMainDat[1].Diget]', ctx); process.stdout.write(JSON.stringify({ list, fixed, after, kept })); """ result = json.loads(subprocess.check_output(["node", "-e", script], cwd=ROOT).decode("utf-8")) assert result["list"] == [ [1, "CostMainDat", 1, "노무"], [1, "CostMainDat", 4, "노임 연결"], [8, "StuffcDat", 1, "1.가(규) 와 코드 중복"], [10, "StuffcDat", 2, "코드에 소문자사용"], [11, "MachTitleDat", 0, "장비코드 길이가틀림(17자리)"], ] assert result["fixed"] == 2 and result["after"] == 0 assert result["kept"] == [1, 3, 0]