Files
fileworkbench/scripts/prepare-offline-tests.py
zemion db873063f8
Verify source and build Android / android (push) Canceled after 0s
initial commit v 0.2.0
2026-09-24 22:49:27 +02:00

37 lines
1.5 KiB
Python

#!/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<Pair<String, () -> 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.")