#!/usr/bin/env python3 """Run the same @Test method bodies offline, omitting only JUnit/Kotlin runner annotations.""" from pathlib import Path import re import shutil root = Path(__file__).resolve().parent.parent out = root / "out/offline-tests/generated" shutil.rmtree(out, ignore_errors=True) out.mkdir(parents=True) cases = [] for source in sorted(list((root / "core/src/commonTest").rglob("*Tests.kt")) + list((root / "platform-jvm/src/test").rglob("*Tests.kt"))): text = source.read_text() package = re.search(r"^package ([\w.]+)", text, re.M).group(1) cls = re.search(r"^class (\w+Tests)", text, re.M).group(1) for method in re.findall(r"@Test\s+fun (\w+)\(", text): cases.append((f"{cls}.{method}", f"{package}.{cls}().{method}()")) text = re.sub(r"^import (?:kotlin\.test|org\.junit)\.Test\s*$", "", text, flags=re.M).replace("@Test ", "") (out / source.name).write_text(text) runner = """package dev.fileworkbench.testing fun main() { val cases: List Unit>> = listOf( """ runner += ",\n".join(f' "{name}" to {{ {call} }}' for name, call in cases) runner += """ ) var failed = 0 for ((name, run) in cases) { try { run(); println("PASS $name") } catch (e: Throwable) { failed++; println("FAIL $name: ${e.message}"); e.printStackTrace() } } println("RESULT: ${cases.size - failed}/${cases.size} checks passed") check(failed == 0) { "$failed checks failed" } } """ (out / "OfflineRunner.kt").write_text(runner) print(f"Prepared {len(cases)} production-core/JVM checks.")