"""Verify the bounded first five tutorial groups against an original backup.""" import argparse import hashlib import json from pathlib import Path from script_text import extract_display_literals, patch_display_calls ORIGINAL_SHA256 = 'bd959758223b976ffac35b4ef7d94661f62060c1134316eddb559772d544e02c' def main(): p = argparse.ArgumentParser(description=__doc__) p.add_argument('mode', choices=['baseline', 'modified', 'rollback']) p.add_argument('original', type=Path) p.add_argument('candidate', type=Path) args = p.parse_args() source, result = args.original.read_bytes(), args.candidate.read_bytes() assert hashlib.sha256(source).hexdigest() == ORIGINAL_SHA256, 'original hash mismatch' if args.mode in ('baseline', 'rollback'): assert result == source, 'original bytes not restored' assert extract_display_literals(result)[0].text == 'Tutorial' print(args.mode.upper() + ': original bytes and English tutorial restored; PASS') return mapping = json.loads(Path(__file__).with_name('tutorial_cn.json').read_text(encoding='utf-8')) assert result == patch_display_calls(source, mapping, allow_alignment_changes=True), 'build mismatch' before = extract_display_literals(source) after = extract_display_literals(result, encoding='gb2312') assert len(before) == len(after) == 55 changed = [] left = right = 0 for i, (a, b) in enumerate(zip(before, after)): assert source[left:a.start] == result[right:b.start], 'non-display bytes changed' assert (a.call, a.argument) == (b.call, b.argument) if a.text != b.text: changed.append(i) assert b.text == mapping[a.text] else: assert source[a.start:a.end] == result[b.start:b.end] left, right = a.end, b.end assert source[left:] == result[right:], 'trailing bytes changed' assert changed == list(range(15)), changed print('MODIFIED: first 15 of 55 literals translated; all other bytes unchanged; PASS') if __name__ == '__main__': main()