Files

73 lines
2.5 KiB
Python

#!/usr/bin/env python3
"""Ad-hoc test harness (not part of the shipped installer): applies various
plugin subsets against a fresh copy of the crosspoint-reader source and
reports success/failure per combination. Requires a pristine repo template
directory and a scratch working directory as arguments.
"""
import itertools
import os
import shutil
import sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from framework.discovery import discover_all, build_selected
from framework.engine import apply, Context, PatchError
PLUGINS_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "plugins")
def run_case(template_dir, scratch_dir, names):
if os.path.exists(scratch_dir):
shutil.rmtree(scratch_dir)
shutil.copytree(template_dir, scratch_dir)
ctx = Context(repo_dir=scratch_dir, yes_all=True, prompt=False)
selected = build_selected(names, PLUGINS_DIR, ctx)
apply(ctx, selected)
def main():
template_dir = sys.argv[1]
scratch_root = sys.argv[2]
cases_arg = sys.argv[3] if len(sys.argv) > 3 else "all"
all_names = sorted(discover_all(PLUGINS_DIR).keys())
print(f"Discovered plugins: {all_names}")
if cases_arg == "all":
cases = [[n] for n in all_names]
cases.append(all_names)
cases.append(["darkmode", "smallerfonts"])
cases.append(["bookerly", "smallerfonts"])
cases.append(["bookerly"])
cases.append(["githubsync"])
cases.append(["hardcover", "pong"])
cases.append(["lockscreen", "darkmode", "pong"])
else:
cases = [cases_arg.split(",")]
results = []
for names in cases:
label = "+".join(names)
scratch_dir = os.path.join(scratch_root, label.replace("/", "_"))
try:
run_case(template_dir, scratch_dir, names)
print(f"OK {label}")
results.append((label, True, ""))
except PatchError as e:
print(f"FAIL {label}: {e}")
results.append((label, False, str(e)))
except Exception as e:
print(f"ERROR {label}: {type(e).__name__}: {e}")
results.append((label, False, f"{type(e).__name__}: {e}"))
print("\n=== Summary ===")
n_ok = sum(1 for _, ok, _ in results if ok)
for label, ok, msg in results:
print(f"{'OK' if ok else 'FAIL'} {label}" + (f" -- {msg}" if not ok else ""))
print(f"\n{n_ok}/{len(results)} passed")
sys.exit(0 if n_ok == len(results) else 1)
if __name__ == "__main__":
main()