Files
Aislo/resources/tester/test_est_sources.py
T
eomsangdonandClaude Opus 5.5 7222577442 feat(est-test): 발췌근거 출처 열 이름·보이기
- 원본 barbtnColumn: 자재·노임 단가의 출처 열(Cost1~6) 이름·쪽수·보기 편집, 자재는 8가지 출처 이름·중복 거부
- 숨긴 출처는 최저·평균·최고 단가 고르기에서 제외(브라우저·서버 같은 엔진)

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

61 lines
2.5 KiB
Python

"""EST 테스트 앱 발췌근거(원본 barbtnColumn — 가격 출처 열 이름·보이기, 숨긴 출처는 단가 고르기에서 제외)."""
import json
import subprocess
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
FILES = [
"native-math.js",
"native-formula.js",
"native-machine.js",
"native-rows.js",
"native-text.js",
"native-quantity.cjs",
"native-wonga.js",
"native-sources.js",
"native-engine.js",
"native-model.js",
]
def run_js(code: str):
runner = f"""
const fs = require('fs'), vm = require('vm');
const ctx = vm.createContext({{ structuredClone, console }});
for (const f of {json.dumps(FILES)})
vm.runInContext(fs.readFileSync('tools/est-test/' + f, 'utf8'), ctx, {{ filename: f }});
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_hidden_source_leaves_price_choice_and_labels():
out = run_js(
r"""(() => {
const p = EstNative.empty();
p.options.SourceRefresh = false;
p.tables.StuffcDat = [{ Code: 'M1', Name: '철근', Cost1: 100, Cost2: 80, Cost3: 120, ValueIndex: 0 },
{ Code: 'M2', Name: '모래', Cost1: 100, Cost2: 80, Cost3: 120, ValueIndex: 2 }];
const tc = (q) => EstNative.calculate(q).tables.StuffcDat.map((r) => r.GC);
const before = tc(p);
const list = EstSources.get(p.options, 'StuffcDat');
list[1] = { caption: '물가자료', page: '120', visible: false };
list[2] = { caption: '유통물가', page: '', visible: false };
EstSources.set(p.options, 'StuffcDat', list);
const after = tc(p);
let dup = '';
try { EstSources.set(p.options, 'StuffcDat', list.map(() => ({ caption: '가격정보' }))); } catch (e) { dup = e.message; }
EstSources.set(p.options, 'LaborcDat', list.map(() => ({ caption: '같음' })));
return { before, after, dup, label: EstSources.label(p.options, 'StuffcDat', 'Cost2'),
other: EstSources.label(p.options, 'EstMainDat', 'Cost2'),
cols: EstSources.columns(p.options, 'StuffcDat', ['Code', 'Cost1', 'Cost2', 'Cost3', 'TC']) };
})()"""
)
assert out["before"] == [80, 120]
assert out["after"] == [100, 100]
assert out["dup"] == "같은 발췌근거가 있습니다."
assert out["label"] == "물가자료 (120)"
assert out["other"] == ""
assert out["cols"] == ["Code", "Cost1", "TC"]