94 lines
6.2 KiB
Python
94 lines
6.2 KiB
Python
import json
|
|
import subprocess
|
|
from pathlib import Path
|
|
from test_est_rea_parity import run
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
|
|
|
|
def test_jdl_special_unit_detail_with_matching_totals_is_editable():
|
|
project = run("math", "EstNative.empty()")
|
|
script = """const fs=require('fs'),j=require('./tools/est-test/jdl.cjs'),a=require('./tools/est-test/archive.cjs'),schema=require('./tools/est-test/jdl-schema.json'),s=require('./tools/est-test/server.cjs');
|
|
const empty=JSON.parse(fs.readFileSync(0,'utf8')),blank=structuredClone(empty);
|
|
const table=(name,rows)=>Buffer.from(rows.map(r=>schema[name].map(f=>r[f.name]??(f.kind===6?'0':'')).join('\\t')+'\\x05\\r\\n').join(''));
|
|
const files=new Map([['Global.ini',Buffer.from('[BASIC]')],['Main.txt',Buffer.from('0\\tSample\\t02\\x05\\r\\n')],
|
|
['m.txt',table('m.txt',[{F_CODE:'M1',F_DES:'material',F_MPRICE:100}])],
|
|
['unit.txt',table('unit.txt',[{F_CODE:'U1',F_DES:'unit',F_MPRICE:300,F_LPRICE:50}])],
|
|
['unitpart.txt',table('unitpart.txt',[{F_CODE:'U1',F_SEQ:'1',F_CODE1:'M1',F_DES:'normal',F_QQTY:2,F_MPRICE:100,F_MCOST:200},
|
|
{F_CODE:'U1',F_SEQ:'2',F_CODE1:'M1',F_DES:'special',F_QQTY:1,F_MCOST:100,F_LCOST:50,F_SPROPER:'1'}])],
|
|
['gongjong.txt',table('gongjong.txt',[{F_CODE:'01',F_DES:'work'}])],
|
|
['mainpart.txt',table('mainpart.txt',[{F_CODE:'01',F_SEQ:'1',F_CODE1:'U1',F_DES:'unit',F_QQTY:1,F_MPRICE:300,F_LPRICE:50}])]]);
|
|
const p=j.read(a.pack(files),empty),before=structuredClone(p.tables.HeadMainDat);p.options.AutoCalc=true;p.options.SourceRefresh=true;
|
|
p.tables.HeadMainDat[2].GC=110;const q=s.calculate(p),out=j.output(q),back=j.read(out.bytes,blank);
|
|
process.stdout.write(JSON.stringify({before,title:q.tables.HeadTitleDat[0],rows:back.tables.HeadMainDat,
|
|
total:back.tables.EstMainDat.at(-1).TC,warnings:p.importWarnings,errors:q.calculation.errors}));"""
|
|
result = json.loads(
|
|
subprocess.check_output(
|
|
["node", "-e", script], input=json.dumps(project).encode(), cwd=ROOT
|
|
)
|
|
)
|
|
assert len(result["before"]) == 3
|
|
assert result["before"][2]["Name"] == "special"
|
|
assert result["before"][2]["CalcIndex"] == 1
|
|
assert result["title"]["TC"] == 360
|
|
assert result["rows"][2]["GC"] == 110
|
|
assert result["rows"][2]["NC"] == 50
|
|
assert result["total"] == 360
|
|
assert any("특수 구성" in warning for warning in result["warnings"])
|
|
assert not result["errors"]
|
|
|
|
|
|
def test_jdl_special_unit_detail_without_source_keeps_recorded_amount():
|
|
project = run("math", "EstNative.empty()")
|
|
script = """const fs=require('fs'),j=require('./tools/est-test/jdl.cjs'),a=require('./tools/est-test/archive.cjs'),schema=require('./tools/est-test/jdl-schema.json');
|
|
const empty=JSON.parse(fs.readFileSync(0,'utf8'));
|
|
const table=(name,rows)=>Buffer.from(rows.map(r=>schema[name].map(f=>r[f.name]??(f.kind===6?'0':'')).join('\\t')+'\\x05\\r\\n').join(''));
|
|
const files=new Map([['Global.ini',Buffer.from('[BASIC]')],['Main.txt',Buffer.from('0\\tSample\\t02\\x05\\r\\n')],
|
|
['unit.txt',table('unit.txt',[{F_CODE:'U1',F_DES:'unit',F_MPRICE:70}])],
|
|
['unitpart.txt',table('unitpart.txt',[{F_CODE:'U1',F_SEQ:'1',F_CODE1:'missing',F_DES:'special',F_QQTY:1,F_MCOST:70,F_SPROPER:'1'}])]]);
|
|
const p=j.read(a.pack(files),empty);process.stdout.write(JSON.stringify({rows:p.tables.HeadMainDat,warnings:p.importWarnings}));"""
|
|
result = json.loads(
|
|
subprocess.check_output(
|
|
["node", "-e", script], input=json.dumps(project).encode(), cwd=ROOT
|
|
)
|
|
)
|
|
assert len(result["rows"]) == 2
|
|
assert result["rows"][1]["GC"] == 70
|
|
assert result["rows"][1]["LinkIndex"] == 0
|
|
assert result["rows"][1]["JdlSourceCode"] == "missing"
|
|
assert any("특수 구성" in warning for warning in result["warnings"])
|
|
|
|
|
|
def test_jdl_special_machine_detail_is_fixed_only_when_amounts_match():
|
|
project = run("math", "EstNative.empty()")
|
|
script = """const fs=require('fs'),j=require('./tools/est-test/jdl.cjs'),a=require('./tools/est-test/archive.cjs'),schema=require('./tools/est-test/jdl-schema.json'),s=require('./tools/est-test/server.cjs');
|
|
const empty=JSON.parse(fs.readFileSync(0,'utf8')),blank=structuredClone(empty);
|
|
const table=(name,rows)=>Buffer.from(rows.map(r=>schema[name].map(f=>r[f.name]??(f.kind===6?'0':'')).join('\\t')+'\\x05\\r\\n').join(''));
|
|
const files=new Map([['Global.ini',Buffer.from('[BASIC]')],['Main.txt',Buffer.from('0\\tSample\\t02\\x05\\r\\n')],
|
|
['junit.txt',table('junit.txt',[{F_CODE:'J1',F_DES:'machine',F_MPRICE:100,F_LPRICE:20},
|
|
{F_CODE:'J2',F_DES:'mismatch',F_MPRICE:50},{F_CODE:'J3',F_DES:'percent',F_MPRICE:50},
|
|
{F_CODE:'J4',F_DES:'weighted',F_MPRICE:100}])],
|
|
['jpart.txt',table('jpart.txt',[{F_CODE:'J1',F_SEQ:'1',F_DES:'normal',F_QQTY:1,F_MPRICE:60},
|
|
{F_CODE:'J1',F_SEQ:'2',F_DES:'special',F_QQTY:1,F_MPRICE:40,F_LPRICE:20,F_SPROPER:'1'},
|
|
{F_CODE:'J2',F_SEQ:'1',F_DES:'mismatch',F_QQTY:1,F_MPRICE:10,F_SPROPER:'1'},
|
|
{F_CODE:'J3',F_SEQ:'1',F_DES:'percent',F_UNIT:'%',F_QQTY:1,F_MPRICE:50,F_SPROPER:'1'},
|
|
{F_CODE:'J4',F_SEQ:'1',F_DES:'weighted part',F_QQTY:2,F_MPRICE:50,F_SPROPER:'1'}])]]);
|
|
const p=j.read(a.pack(files),empty),before=structuredClone(p.tables.MachMainDat);p.options.AutoCalc=true;
|
|
p.tables.MachMainDat[2].GC=50;const q=s.calculate(p),out=j.output(q),back=j.read(out.bytes,blank);
|
|
process.stdout.write(JSON.stringify({before,titles:q.tables.MachTitleDat,back:back.tables.MachMainDat,
|
|
warnings:p.importWarnings,errors:q.calculation.errors}));"""
|
|
result = json.loads(
|
|
subprocess.check_output(
|
|
["node", "-e", script], input=json.dumps(project).encode(), cwd=ROOT
|
|
)
|
|
)
|
|
assert result["before"][2]["Name"] == "special"
|
|
assert result["before"][2]["CalcIndex"] == 1
|
|
assert result["titles"][0]["TC"] == 130
|
|
assert result["back"][2]["GC"] == 50
|
|
assert result["titles"][3]["TC"] == 100
|
|
assert "상세 산식 미변환" in result["before"][4]["Name"]
|
|
assert "상세 산식 미변환" in result["before"][6]["Name"]
|
|
assert any("특수 기계 상세" in warning for warning in result["warnings"])
|
|
assert not result["errors"]
|