aboutsummaryrefslogtreecommitdiff
path: root/tests/summarize.py
blob: 5006dc084a6715a5d0dd4beeeb326c94090df7f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

#!/usr/bin/env python3
"""Summarize retained case results locally and in GitHub Actions."""

import argparse
import json
import os
from pathlib import Path


def summarize(directory):
    results = [json.loads(path.read_text(encoding="utf-8"))
               for path in sorted(directory.glob("*/*/result.json"))]
    if not results:
        return "No compiler case results were produced; inspect the build/CTest log.\n"
    failures = [result for result in results if not result["passed"]]
    lines = [f"Compiler cases: {len(results) - len(failures)}/{len(results)} passed.", "",
             "| Group | Passed | Total |", "|---|---:|---:|"]
    for suite in ["i", "ii", "iii"]:
        subset = [result for result in results if result["case"].startswith(suite + "/")]
        lines.append(f"| {suite} | {sum(result['passed'] for result in subset)} | {len(subset)} |")
    lines += ["", f"Commit: `{results[0]['commit']}`. Seed: `{results[0]['seed']}`.",
              "Fixed expectations: pending human review."]
    if failures:
        lines += ["", "Failures:", ""]
        for result in failures:
            stages = ", ".join(failure["stage"] for failure in result["failures"])
            lines.append(f"- `{result['case']}` ({stages}); see its `result.json` and command logs.")
    return "\n".join(lines) + "\n"


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("directory", type=Path)
    args = parser.parse_args()
    summary = summarize(args.directory)
    print(summary, end="")
    args.directory.mkdir(parents=True, exist_ok=True)
    (args.directory / "summary.md").write_text(summary, encoding="utf-8")
    if os.environ.get("GITHUB_STEP_SUMMARY"):
        with open(os.environ["GITHUB_STEP_SUMMARY"], "a", encoding="utf-8") as output:
            output.write(summary)