from test_est_rea_parity import run def test_annual_preview_is_financial_only_and_expanded_copy_preserves_assets(): result = run( "math", """(()=>{ const p=EstNative.empty();p.id='123456789012345678901234';p.name='source'; p.options.SourceRefresh=false;p.originalArchive='original binary'; p.drawings=[{name:'drawing',binary:'AA=='}]; p.tables.EstMainDat=[{PkID:1,Code:'R',GN:3,GU:101},{LinkIndex:54}]; p.tables.StuffcDat=[{Code:'M',InputTC:123,ValueIndex:4}]; p.annual=[{name:' first ',formula:'[기준]*0.25'},{name:'second',formula:'[기준]-[first]'}]; const q=EstNative.calculate(p),before=JSON.stringify(q); const preview=EstBusiness.annual(q,false),copy=EstBusiness.annualCopy(q,0); copy.tables.StuffcDat[0].InputTC=456; return {preview,copy,same:before===JSON.stringify(q)}; })()""", ) assert result["same"] assert result["preview"]["errors"] == [] assert result["preview"]["results"][0]["name"] == "first" assert "originalArchive" not in result["preview"]["results"][0]["project"] assert result["copy"]["originalArchive"] == "original binary" assert result["copy"]["drawings"][0]["binary"] == "AA==" assert "id" not in result["copy"] assert result["copy"]["progress"] == result["copy"]["annual"] == [] assert result["copy"]["tables"]["EstMainDat"][0]["TC"] == 75 assert result["preview"]["results"][1]["project"]["tables"]["EstMainDat"][0]["TC"] == 228 def test_annual_copy_rejects_invalid_or_forward_references(): result = run( "math", """(()=>{ const p=EstNative.empty();p.annual=[{name:'first',formula:'[second]'},{name:'second',formula:'[기준]'}]; p.tables.EstMainDat=[{Code:'R',GN:1,GC:100,TC:100,CalcIndex:1}]; try{EstBusiness.annualCopy(p,0);return false;}catch(error){return error.message;} })()""", ) assert "참조 항목 없음" in result