37 lines
1.5 KiB
Python
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.")
|