물 분자 전체를 실제 물 영역 안에 포함한 r3 시제품 검증
This commit is contained in:
@@ -1,29 +1,32 @@
|
||||
"""없는 원본·잘못된 Scene·원자 수·부피를 실제 Blender로 거부하는지 검사한다."""
|
||||
"""원본 부재·구조·물 영역 포함·부피 오류를 실제 Blender로 거부한다."""
|
||||
import json
|
||||
from pathlib import Path
|
||||
import subprocess
|
||||
|
||||
ROOT=Path(__file__).resolve().parents[3]
|
||||
BASE=ROOT/'projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2'
|
||||
BASE=ROOT/'projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3'
|
||||
BLENDER='C:/Program Files/Blender Foundation/Blender 5.2/blender.exe'
|
||||
SOURCE=BASE/'generated-source/preview.blend'
|
||||
VERIFY=ROOT/'projects/water-hydrogen-bond-surface-tension/blender/verify_model.py'
|
||||
records=[]
|
||||
|
||||
|
||||
def execute(args, expected):
|
||||
def execute(args, expected, reason=None):
|
||||
command=[BLENDER,'--background','--disable-autoexec','--python-exit-code','1']+args
|
||||
result=subprocess.run(command,cwd=ROOT,capture_output=True,text=True,encoding='utf-8')
|
||||
assert result.returncode==expected,(command,result.stdout,result.stderr)
|
||||
records.append(dict(command=command,exit_code=result.returncode,expected_exit_code=expected,reason=result.stderr.strip().splitlines()[-1:] if result.stderr.strip() else []))
|
||||
if reason:
|
||||
assert reason in result.stderr, (reason,result.stderr)
|
||||
records.append(dict(command=command,exit_code=result.returncode,expected_exit_code=expected,matched_reason=reason,assertion_errors=[line for line in result.stderr.splitlines() if line.startswith('AssertionError:')]))
|
||||
|
||||
|
||||
for name,edit in [('invalid-default','bpy.ops.wm.read_factory_settings(use_empty=True)'),('invalid-atoms',"bpy.data.objects.remove(bpy.data.objects['PairA_H2'],do_unlink=True)"),('invalid-volume',"bpy.data.objects['Droplet'].animation_data.drivers[1].driver.expression='1'")]:
|
||||
for name,edit in [('invalid-default','bpy.ops.wm.read_factory_settings(use_empty=True)'),('invalid-atoms',"bpy.data.objects.remove(bpy.data.objects['PairA_H2'],do_unlink=True)"),('invalid-volume',"bpy.data.objects['Droplet'].animation_data.drivers[1].driver.expression='1'"),('invalid-containment',"bpy.data.objects['Liquid9_H1'].data.vertices[0].co.x=10")]:
|
||||
fixture=BASE/'generated-source'/f'{name}.blend'
|
||||
expression=f'import bpy; bpy.ops.wm.open_mainfile(filepath={str(SOURCE)!r}); {edit}; bpy.ops.wm.save_as_mainfile(filepath={str(fixture)!r})'
|
||||
execute(['--python-expr',expression],0)
|
||||
execute(['--python',str(VERIFY),'--','--source',str(fixture),'--out',str(BASE/'generated-source/invalid-result.json')],1)
|
||||
execute(['--python',str(VERIFY),'--','--source',str(fixture),'--out',str(BASE/'generated-source/invalid-result.json')],1,'물 영역 밖 또는 여백 부족' if name=='invalid-containment' else None)
|
||||
execute(['--python',str(VERIFY),'--','--source',str(BASE/'generated-source/missing.blend'),'--out',str(BASE/'generated-source/invalid-result.json')],1)
|
||||
execute(['--python',str(VERIFY),'--','--source',str(BASE.parent/'r2/generated-source/preview.blend'),'--out',str(BASE/'generated-source/invalid-result.json')],1,'물 영역 밖 또는 여백 부족')
|
||||
execute(['--python',str(VERIFY),'--','--source',str(SOURCE),'--out',str(BASE/'model-check.json')],0)
|
||||
(BASE/'model-test-results.json').write_text(json.dumps(dict(result='GREEN',negative_cases=4,positive_cases=1,executions=records),ensure_ascii=False,indent=2)+'\n',encoding='utf-8')
|
||||
print('4 negative cases RED, real model GREEN')
|
||||
(BASE/'model-test-results.json').write_text(json.dumps(dict(result='GREEN',negative_cases=6,positive_cases=1,executions=records),ensure_ascii=False,indent=2)+'\n',encoding='utf-8')
|
||||
print('실제 실패 사례 6개 RED, 수정 원본 GREEN')
|
||||
|
||||
Reference in New Issue
Block a user