Files
Aislo/resources/tester/test_est_autolink.py
T
eomsangdonandClaude Opus 5.5 e41a20b89b feat(est-test): 데이타 자동연결
- 원본 처리 근거대로 품명·규격·단위 정규화 맞춤으로 현재 공사 단가 표에 연결
- 9개 선택·Over Write·노임 맞바꿈·전체연결 끊기

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 20:54:07 +09:00

64 lines
2.8 KiB
Python

"""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