- 원본 변환 전 검사 1·8·10·11 규칙으로 목록 표시 - 비목값 자리수 지정만 풀고 다시 계산 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
43 lines
2.1 KiB
Python
43 lines
2.1 KiB
Python
"""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]
|