Files
dragon-hd/tools/verify_tutorial_step1.py
T

47 lines
2.0 KiB
Python

"""Verify the bounded first tutorial translation 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), '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(12)), changed
print('MODIFIED: first 12 of 55 literals translated; all other bytes unchanged; PASS')
if __name__ == '__main__':
main()