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