import os import subprocess from pathlib import Path from src.safe_subprocess import run import sys import re ENABLE_SYNTAX_CHECK = False def eval_script(path: Path): result = run(["rdmd", "-unittest", str(path)], timeout_seconds=15) if "might not be correctly installed" in result.stderr: raise Exception("D is not correctly installed") if result.timeout: status = "Timeout" elif result.exit_code == 0: status = "OK" elif "Error:" in result.stderr: status = "SyntaxError" else: status = "Exception" return { "status": status, "exit_code": result.exit_code, "stdout": result.stdout, "stderr": result.stderr, } DIR = "d-keep-code_davinci_001_temp_0.2" def main(): directory = Path(Path(__file__).parent, "..", "datasets", DIR).resolve() count = {"OK": 0, "Timeout": 0, "Exception": 0, "SyntaxError": 0} for filename in os.listdir(directory): path = Path.joinpath(directory, filename) r = eval_script(path) status = r["status"] count[status] += 1 if ENABLE_SYNTAX_CHECK and status == "SyntaxError": error_msgs = r["stderr"].split("\n") with open(path) as source_file: lines = source_file.readlines() unittest_line_start = lines.index("unittest\n") unittest_line_end = len(lines) for err_msg_line in error_msgs: matched_parts = re.match(r"(\/?.*?\.[\w:]+\/.*.d)\(([0-9]+)\): Error: (.*)", err_msg_line[2:-1]) _file, line_num = matched_parts[1], int(matched_parts[2]) if unittest_line_start <= line_num and line_num <= unittest_line_end: print("===============") print(path, "contains error in unit test part") print(error_msgs) print("===============") filename = filename.split(".")[0] print(f"Dlang,{filename},{status}") print(DIR + ":" + str(count)) if __name__ == "__main__": main()