crashtest.run
Functions to run tests, collect results, and produce run reports.
compare_opcodes
def compare_opcodes(original_code: Bytecode, recompiled_code: Bytecode, class_name: str) -> OpcodeComparison
Compare per-method opcode sequences between original and recompiled bytecode.
file_to_name
def file_to_name(file: str) -> str
gen_id
def gen_id() -> str
Generate a unique ID for a test run.
gen_status
def gen_status(results: List[TestCase]) -> Tuple[str, str]
Generate a status message and color based on test results. Returns a tuple of (status_message, color_hex).
Colors:
- Green (#22C55E): All tests passed
- Yellow (#EAB308): < 10% failures
- Orange (#F97316): 10-20% failures
- Red-Orange (#EF4444): 20-50% failures
- Red (#DC2626): > 50% failures
- Dark Red (#991B1B): All tests failed
get_repo_info
def get_repo_info() -> GitInfo
Get the git branch and commit hash, if available.
op_similarity
def op_similarity(a: List[str], b: List[str]) -> float
Sequence similarity of two opcode name lists, 0.0-1.0.
op_source_lines
def op_source_lines(func: Function) -> List[int]
Per-op source line numbers (1-indexed), parallel to to_asm_resolved's output
line-for-line. Each op's debug entry points back into whatever source file was
compiled to produce this bytecode (the original .hx for the original function,
or the decompiled pseudocode .hx for the recompiled one) — this is what lets the
UI match a diffed opcode line up with the source line that produced it. -1 where
no debug info is available.
recompile_pseudo
def recompile_pseudo(pseudo_content: str, class_name: str, original_path: Path) -> Tuple[Optional[Bytecode], Optional[str], BehavioralComparison]
Compile pseudo, then compare behavior unless this shipped fixture is exempt.
run
def run() -> bool
Run all tests.
run_case
def run_case(case: str, id: int) -> TestCase
Runs a single test case by decompiling the main class in the file. It generates both class-level pseudocode and a combined IR view of all methods, then recompiles and executes both versions. Opcode similarity is diagnostic only.
run_case_isolated
def run_case_isolated(case: str, id: int) -> TestCase
Runs run_case in a subprocess, enforcing TIME_LIMIT_SECONDS and
MEMORY_LIMIT_MB. Exceeding either is reported as a failed case rather than
hanging or OOMing the host.
run_single_case
def run_single_case(args: Any) -> bool
Run a single test case by name and print results to the terminal.
sweep
def sweep(bytecode_path: str, count: int, out_path: str) -> None
Decompile the first count functions of a bytecode image to a file.
to_asm_resolved
def to_asm_resolved(func: Function, code: Bytecode) -> str
Like to_asm but resolves constant-pool indices to their actual values.