From 8bf0a62c5cf3628416b82c3ea68634dee9ba18f9 Mon Sep 17 00:00:00 2001 From: Vladimir Panteleev Date: Sat, 3 Jan 2026 16:34:04 +0000 Subject: [PATCH 1/2] ci(test/run-unittest): include test name in error messages --- test/run-unittest.d | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/run-unittest.d b/test/run-unittest.d index ae6fad4331..c877daf60b 100644 --- a/test/run-unittest.d +++ b/test/run-unittest.d @@ -71,7 +71,7 @@ int main(string[] args) if (exists(min_frontend) && frontend.length && cmp(frontend, min_frontend.readText) < 0) continue; log("Running " ~ script ~ "..."); if (spawnShell(script.name, ["DUB":dub, "DC":dc, "CURR_DIR":curr_dir]).wait) - logError("Script failure."); + logError(script.name.baseName, ": Script failure."); else log(script.name.baseName, " status: Ok"); } @@ -86,7 +86,7 @@ int main(string[] args) if (frontend.length && exists(min_frontend) && cmp(frontend, min_frontend.readText) < 0) continue; log("Running " ~ script ~ "..."); if (spawnProcess([dub, script.name], ["DUB":dub, "DC":dc, "CURR_DIR":curr_dir]).wait) - logError("Script failure."); + logError(script.name.baseName, ": Script failure."); else log(script.name, " status: Ok"); } @@ -123,13 +123,13 @@ int main(string[] args) if (spawnProcess([dub, "build", "--force", "--compiler", dc], ["DUB":dub, "DC":dc, "CURR_DIR":curr_dir], ProcessConfig.none, pack.name).wait) log(pack.name.baseName, " status: Ok"); else - logError("Failure expected, but build passed."); + logError(pack.name.baseName, ": Failure expected, but build passed."); } else { log("Building ", pack.name.baseName, "..."); if (spawnProcess([dub, "build", "--force", "--compiler", dc], ["DUB":dub, "DC":dc, "CURR_DIR":curr_dir], ProcessConfig.none, pack.name).wait) - logError("Script failure."); + logError(pack.name.baseName, ": Build failure."); else log(pack.name.baseName, " status: Ok"); } @@ -150,7 +150,7 @@ int main(string[] args) { log("Running ", pack.name.baseName, "..."); if (spawnProcess([dub, "run", "--force", "--compiler", dc], ["DUB":dub, "DC":dc, "CURR_DIR":curr_dir], ProcessConfig.none, pack.name).wait) - logError("Run failure."); + logError(pack.name.baseName, ": Run failure."); else log(pack.name.baseName, " status: Ok"); } @@ -167,7 +167,7 @@ int main(string[] args) { log("Testing ", pack.name.baseName, "..."); if (spawnProcess([dub, "test", "--force", "--root", pack.name, "--compiler", dc], ["DUB":dub, "DC":dc, "CURR_DIR":curr_dir]).wait) - logError("Test failure."); + logError(pack.name.baseName, ": Test failure."); else log(pack.name.baseName, " status: Ok"); } From 15dcaddfec42760e75589428a06e5810830e7438 Mon Sep 17 00:00:00 2001 From: Vladimir Panteleev Date: Sat, 3 Jan 2026 16:35:15 +0000 Subject: [PATCH 2/2] ci(test/run-unittest): display list of failed tests at end of output --- test/run-unittest.d | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/test/run-unittest.d b/test/run-unittest.d index c877daf60b..28813b8003 100644 --- a/test/run-unittest.d +++ b/test/run-unittest.d @@ -10,7 +10,7 @@ import common; int main(string[] args) { - import std.algorithm, std.file, std.format, std.stdio, std.path, std.process, std.string; + import std.algorithm, std.array, std.file, std.format, std.stdio, std.path, std.process, std.string; alias ProcessConfig = std.process.Config; //** if [ -z ${DUB:-} ]; then @@ -182,9 +182,18 @@ int main(string[] args) auto logLines = readText("test.log").splitLines; foreach (line; logLines) writeln(line); - auto errCnt = logLines.count!(a => a.startsWith("[ERROR]")); + auto errorLines = logLines.filter!(a => a.startsWith("[ERROR]")).array; auto passCnt = logLines.count!(a => a.startsWith("[INFO]") && a.endsWith("status: Ok")); - writeln(passCnt , "/", errCnt + passCnt, " tests succeeded."); + writeln(); + writeln(passCnt , "/", errorLines.length + passCnt, " tests succeeded."); + + if (errorLines.length > 0) + { + writeln(); + writeln("Failed tests:"); + foreach (line; errorLines) + writeln(" ", line); + } return any_errors; }