Files
Aislo/resources/tester/test_est_data_update.py
T
eomsangdonandClaude Opus 5.5 fb1ddb1be6 feat(est-test): 현재데이타 갱신(Main Data·선택파일)
- 원본 0x10e12c8 규칙: 노임·자재·유류·표준·기계·환율, 품명/규격/단위 맞춤, 단가미갱신 표시
- 서버 /api/main-data 가 원본 설치 main.estx 를 원천으로 제공

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 17:55:43 +09:00

62 lines
3.3 KiB
Python

"""EST 테스트 앱 현재데이타 갱신(원본 TFRMDATAUPDATE → 0x10e12c8 — 노임·자재·유류·표준·기계·환율)."""
import json
import subprocess
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
def run_js(code: str):
runner = f"""
const fs = require('fs'), vm = require('vm');
const ctx = vm.createContext({{ structuredClone }});
vm.runInContext(fs.readFileSync('tools/est-test/native-data-update.js', 'utf8'), ctx);
process.stdout.write(JSON.stringify(vm.runInContext({json.dumps(code)}, ctx)));
"""
return json.loads(subprocess.check_output(["node", "-e", runner], cwd=ROOT).decode("utf-8"))
def test_update_rules():
out = run_js(
r"""(() => {
const U = EstDataUpdate;
const src = { tables: {
LaborcDat: [{ Code: 'X1', Name: '보 통 인 부', Size: '', TC: 200, Cost1: 200, Bimog: 2 }],
StuffcDat: [{ Code: 'S1', Name: '시멘트', Size: '40kg', Unite: '포당', TC: 6000, Cost1: 6000, Page1: '12', Ratio: 5 },
{ Code: 'S2', Name: '경유', TC: 1700, Cost1: 1700 }],
SilJukDat: [{ Code: 'C1', Name: '새 이름', Size: '', Unite: 'm', TC: 99, NC: 50 }],
MachGijunDat: [{ Index: 36, Name: '달러($)', TC: 1400, Bigo: '새' }, { Index: 1, Name: '계수', TC: 0.3 }],
MachTitleDat: [], MachMainDat: [] } };
const mk = () => ({ tables: {
LaborcDat: [{ Code: 'L1', Name: '보통인부', TC: 100, Cost1: 100, Cost1_: 7 }, { Code: 'L2', Name: '없는직종', TC: 1 }],
StuffcDat: [{ Code: 'M1', Name: '시멘트', Size: '40 kg', Unite: '[포]', TC: 5000, Cost1: 5000, Ratio: 1 },
{ Code: 'M2', Name: '경 유', TC: 1600, Cost1: 1600 }],
SilJukDat: [{ Code: 'C1', Name: '옛 이름', TC: 1 }],
MachGijunDat: [{ Index: 36, Name: '달러($)', TC: 1300, Bigo: '옛', TC_: 9 }],
MachTitleDat: [], MachMainDat: [] } });
const a = mk(), ra = U.apply(a, src, { labor: 1, stuff: 1, siljuk: 1, mach: 1, fuel: 1, rate: 1 });
const b = mk(); U.apply(b, src, { stuff: 1 });
const c = mk(); U.apply(c, src, { mach: 1 });
const l = a.tables.LaborcDat;
return {
labor: [l[0].TC, l[0].Code, l[0].Cost1_, l[0].Checked, l[0].Bimog, l[1].Checked],
stuff: [a.tables.StuffcDat[0].TC, a.tables.StuffcDat[0].Page1, a.tables.StuffcDat[0].Code, a.tables.StuffcDat[1].TC],
stuffOnly: [b.tables.StuffcDat[0].TC, b.tables.StuffcDat[0].Ratio, b.tables.StuffcDat[1].TC],
siljuk: [a.tables.SilJukDat[0].Code, a.tables.SilJukDat[0].Name, a.tables.SilJukDat[0].NC],
gijun: a.tables.MachGijunDat.map((r) => [r.Index, r.TC, r.TC_ ?? null]),
rateKept: c.tables.MachGijunDat.find((r) => r.Index === 36).TC,
notices: ra.notices,
fuel: [U.isFuel({ Name: '휘 발 유' }), U.isFuel({ Name: '선박용경유' })],
};
})()"""
)
assert out["labor"] == [200, "L1", 7, False, 2, True]
assert out["stuff"] == [6000, "12", "M1", 1700]
assert out["stuffOnly"] == [6000, 1, 1600]
assert out["siljuk"] == ["C1", "새 이름", 50]
assert out["gijun"] == [[36, 1400, 9], [1, 0.3, None]]
assert out["rateKept"] == 1300
assert out["notices"][0].startswith("노임단가에서 1 개의 찾지못한 데이타가 있습니다.")
assert out["fuel"] == [True, False]