47 lines
2.0 KiB
Python
47 lines
2.0 KiB
Python
"""Verify the bounded complete 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, allow_alignment_changes=True), 'build mismatch'
|
|
before = extract_display_literals(source)
|
|
after = extract_display_literals(result, encoding='gb2312')
|
|
assert len(before) == len(after) == 57
|
|
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(57)), changed
|
|
print('MODIFIED: all 57 display literals translated; all other bytes unchanged; PASS')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|