From 65af6c59d64ee4f9a59bfba06d500cdfbb3ba2d2 Mon Sep 17 00:00:00 2001 From: gayanMatch Date: Fri, 9 Jan 2026 13:57:58 -0600 Subject: [PATCH] Fix #3746: Scripted should fail when no tests match the pattern --- .../src/main/scala/sbt/internal/scripted/ScriptedTests.scala | 3 +++ project/Scripted.scala | 2 +- .../src/main/scala/sbt/scriptedtest/ScriptedTests.scala | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/internal/util-scripted/src/main/scala/sbt/internal/scripted/ScriptedTests.scala b/internal/util-scripted/src/main/scala/sbt/internal/scripted/ScriptedTests.scala index 4ff8a1567..c9db381c5 100644 --- a/internal/util-scripted/src/main/scala/sbt/internal/scripted/ScriptedTests.scala +++ b/internal/util-scripted/src/main/scala/sbt/internal/scripted/ScriptedTests.scala @@ -33,6 +33,9 @@ object ScriptedRunnerImpl { case ScriptedTest(group, name) => runner.scriptedTest(group, name, logger, context) } + if (tests.nonEmpty && allTests.isEmpty) { + sys.error(s"No tests found matching: ${tests.mkString(", ")}") + } runAll(allTests) } def runAll(tests: Seq[() => Option[String]]): Unit = { diff --git a/project/Scripted.scala b/project/Scripted.scala index 9bd2f3649..919199c80 100644 --- a/project/Scripted.scala +++ b/project/Scripted.scala @@ -104,7 +104,7 @@ object Scripted { launcherJar: File, logger: Logger ): Unit = { - logger.info(s"About to run tests: ${args.mkString("\n * ", "\n * ", "\n")}") + logger.info(s"Tests selected: ${args.mkString("\n * ", "\n * ", "\n")}") logger.info("") // Force Log4J to not use a thread context classloader otherwise it throws a CCE diff --git a/scripted-sbt/src/main/scala/sbt/scriptedtest/ScriptedTests.scala b/scripted-sbt/src/main/scala/sbt/scriptedtest/ScriptedTests.scala index e9c95a4fd..30bd860e4 100644 --- a/scripted-sbt/src/main/scala/sbt/scriptedtest/ScriptedTests.scala +++ b/scripted-sbt/src/main/scala/sbt/scriptedtest/ScriptedTests.scala @@ -589,6 +589,10 @@ class ScriptedRunner { val groupCount = if (parallelExecution) instances else Int.MaxValue val scriptedRunners = runner.batchScriptedRunner(scriptedTests, addTestFile, groupCount, prop, logger) + // Fail if user provided test patterns but none matched any existing test directories + if (tests.nonEmpty && scriptedRunners.isEmpty) { + sys.error(s"No tests found matching: ${tests.mkString(", ")}") + } if (parallelExecution && instances > 1) { import scala.collection.parallel.CollectionConverters.* val parallelRunners = scriptedRunners.toArray.par