Files

27 lines
2.1 KiB
Python

from pathlib import Path
import subprocess,sys,json,hashlib
out=Path(__file__).parent;root=Path('/home/jwoltje/.t3/worktrees/mosaic-stack/herb-row214-r2');model=root/'packages/webui/editor/model.mjs';good=model.read_bytes();(out/'model.good.mjs').write_bytes(good)
initial={str(p.relative_to(root)):hashlib.sha256(p.read_bytes()).hexdigest() for p in [model,root/'packages/webui/src/public/editor.js',root/'packages/webui/editor/BUILD.json',root/'packages/webui/src/public/editor.css']}
def step(name,cwd,cap,args):return subprocess.run([sys.executable,str(out/'step.py'),name,str(cwd),str(cap),*args]).returncode
specs=[('serializer-removal','wikilinks are inline atoms and survive'),('invalid-escaping','wikilink DOM paste accepts')]
results=[]
for name,pattern in specs:
changed=good.decode()
if name=='serializer-removal':
start=changed.index(' wikilink(state, node) {');end=changed.index(' raw_block(state, node)',start);changed=changed[:start]+changed[end:]
else:
old="else escapedText(state, oneLine(String(source ?? '')));";assert changed.count(old)==1;changed=changed.replace(old,"else state.text(oneLine(String(source ?? '')));")
try:
model.write_text(changed)
assert step(name+'-build',root/'packages/webui',90,['node','editor/build.mjs'])==0
rc=step(name+'-red',root,180,['node','--test','--test-concurrency=1','--test-name-pattern='+pattern,'packages/webui/tests/editor-wikilink.test.mjs'])
if rc!=1:raise RuntimeError('mutant not killed or timed out: '+str(rc))
finally:
model.write_bytes(good)
if step(name+'-restore-build',root/'packages/webui',90,['node','editor/build.mjs'])!=0:raise RuntimeError('restore build failed')
assert step(name+'-restore-green',root,180,['node','--test','--test-concurrency=1','--test-name-pattern='+pattern,'packages/webui/tests/editor-wikilink.test.mjs'])==0
for p,h in initial.items():assert hashlib.sha256((root/p).read_bytes()).hexdigest()==h,p
results.append({'name':name,'killed':True,'restored':True,'restoredHashesEqual':True})
(out/'mutants.json').write_text(json.dumps(results,indent=2)+'\n')
print('MUTANT_COMPLETE',name,flush=True)