"""Regression check: our SAB output must be byte-identical to sedonac.exe's. Usage: python verify.py [sedona_home] """ import os, sys, subprocess, tempfile, shutil import sab HERE = os.path.dirname(os.path.abspath(__file__)) HOME = sys.argv[1] if len(sys.argv) > 1 else os.path.join(os.path.dirname(HERE), "sedona") def check(sax, reference=None): """Encode `sax` with sab.py; compare against `reference` or a fresh sedonac run.""" tmp = tempfile.mkdtemp() try: if reference is None: work = os.path.join(tmp, os.path.basename(sax)) shutil.copy(sax, work) exe = os.path.join(HOME, "bin", "sedonac.exe") r = subprocess.run([exe, work], capture_output=True, text=True) if r.returncode != 0: print(" sedonac failed:\n" + r.stdout + r.stderr) return False reference = os.path.splitext(work)[0] + ".sab" mine = os.path.join(tmp, "mine.sab") sab.encode(sax, HOME, mine) a = open(reference, "rb").read() b = open(mine, "rb").read() name = os.path.basename(sax) if a == b: print(" PASS %-28s %d bytes identical" % (name, len(a))) return True diffs = [i for i in range(min(len(a), len(b))) if a[i] != b[i]] print(" FAIL %-28s sedonac=%d ours=%d, %d byte diffs" % (name, len(a), len(b), len(diffs))) if diffs: i = diffs[0] lo, hi = max(0, i - 12), i + 12 print(" first diff at offset %d" % i) print(" sedonac %s" % a[lo:hi].hex()) print(" ours %s" % b[lo:hi].hex()) return False finally: shutil.rmtree(tmp, ignore_errors=True) if __name__ == "__main__": print("sedona home: %s" % HOME) ok = check(os.path.join(HERE, "test_normal.sax"), os.path.join(HERE, "test_normal_sedonac.sab")) sys.exit(0 if ok else 1)