53 lines
3.8 KiB
Python
53 lines
3.8 KiB
Python
"""Package closed native observations; original executable stays local."""
|
|
from pathlib import Path
|
|
import hashlib, json, shutil, sys, zipfile
|
|
|
|
root = Path(sys.argv[1]).resolve()
|
|
run = root / '.local/scenario-selection-native/run-1'
|
|
out = root / 'harness/scenario-selection-evidence-20260924/native'
|
|
def pin(data): return {'bytes': len(data), 'sha256': hashlib.sha256(data).hexdigest()}
|
|
def read(name): return (run/name).read_bytes()
|
|
start = json.loads(read('started.json'))
|
|
finish = json.loads(read('finished.json'))
|
|
assert finish['exitCode'] == 0 and finish['binaryUnchanged'] and finish['fixtureUnchanged']
|
|
assert pin(read('arcadia-studio.exe')) == start['binary']
|
|
baseline = read('baseline.arcadia')
|
|
assert pin(baseline) == start['fixture']
|
|
for name in ['selection-only-saved.arcadia', 'undo-saved.arcadia', 'working.arcadia']:
|
|
assert read(name) == baseline, name
|
|
old = b'{ address { references []; occurrence @updated_report; }; send_y 252; }'
|
|
new = b'{ address { references []; occurrence @updated_report; }; send_y 281.8841247558594; }'
|
|
start_a = baseline.index(b' diagram incident_readable ')
|
|
end_a = baseline.index(b' diagram incident_wide ', start_a)
|
|
saved_a = baseline[start_a:end_a]
|
|
assert saved_a.count(old) == 1
|
|
expected = baseline[:start_a] + saved_a.replace(old, new, 1) + baseline[end_a:]
|
|
assert read('spacing-saved.arcadia') == expected
|
|
assert finish['working'] == pin(read('working.arcadia'))
|
|
for stream in ['stdout', 'stderr']:
|
|
assert pin(read('app.' + stream + '.log')) == finish[stream]
|
|
assert read('app.' + stream + '.log') == b''
|
|
gate = root / '.local/scenario-group-gates' / start['gate']
|
|
assert pin((gate/'result.json').read_bytes()) == start['receipt']
|
|
assert pin((gate/'source-proof.json').read_bytes()) == start['proof']
|
|
assert pin((run.parent/'native.py').read_bytes()) == start['helper']
|
|
files = {name: read(name) for name in ['started.json', 'finished.json', 'baseline.arcadia', 'working.arcadia', 'selection-only-saved.arcadia', 'spacing-saved.arcadia', 'undo-saved.arcadia', 'app.stdout.log', 'app.stderr.log']}
|
|
for path in sorted(run.iterdir()):
|
|
if path.name[:2].isdigit() and (17 <= int(path.name[:2]) <= 44 or int(path.name[:2]) == 46):
|
|
assert path.suffix in ['.json', '.jpg', '.png']
|
|
files['captures/' + path.name] = path.read_bytes()
|
|
for name in ['native.py', 'capture.js']:
|
|
files['helpers/' + name] = (run.parent/name).read_bytes()
|
|
for name in ['result.json', 'source-proof.json']:
|
|
files['build/' + name] = (gate/name).read_bytes()
|
|
out.mkdir(exist_ok=False)
|
|
with zipfile.ZipFile(out/'native.zip', 'x', zipfile.ZIP_DEFLATED) as archive:
|
|
for name, data in sorted(files.items()): archive.writestr(name, data)
|
|
with zipfile.ZipFile(out/'native.zip') as archive:
|
|
assert set(archive.namelist()) == set(files)
|
|
for name, data in files.items(): assert archive.read(name) == data
|
|
manifest = {'kind': 'scenario-selection-native-observations', 'source': start['source'], 'buildRun': start['gate'], 'archive': pin((out/'native.zip').read_bytes()), 'members': {name: pin(data) for name, data in sorted(files.items())}, 'claims': ['selection-only Save all preserves exact source', 'first-press singleton drag changes only saved A updated_report send_y 252 to 281.8841247558594', 'one Undo and Save all restore exact baseline', 'final Save all after A/B/Automatic/A preserves exact baseline', 'ordinary Alt+F4 exit 0; empty stdout/stderr'], 'limits': ['Native Shift-click not exercised; actual Shift widget tests are in Cargo evidence', 'Group movement/removal remain unavailable', 'Screenshots are observations, not automated visual assertions', 'Not the frozen prerelease candidate or a release package']}
|
|
(out/'manifest.json').write_text(json.dumps(manifest, indent=2)+'\n', encoding='utf-8', newline='\n')
|
|
shutil.copy2(__file__, out/'prepare.py')
|
|
print(json.dumps({'output':str(out), 'archive':manifest['archive'], 'members':len(files)}, indent=2))
|