diff --git a/README.md b/README.md index 39ceafc6..2250739a 100644 --- a/README.md +++ b/README.md @@ -328,7 +328,7 @@ If you want to customize plugin's configuration parameters used by compilation s Read [SBT SCoverage Plugin documentation](https://github.com/scoverage/sbt-scoverage) for more information about [excludedPackages and excludedFiles](https://github.com/scoverage/sbt-scoverage?tab=readme-ov-file#exclude-classes-and-packages-and-files). -File and package exclusions are supported for Scala 2 and Scala 3 since version `3.4.2`. +File and package exclusions are supported for Scala 2, Scala [`3.3.4`-`3.4.0`) and `3.4.2`+. ### Checking minimum test coverage level diff --git a/src/it/test_exclusion_Scala3_3_3/invoker.properties b/src/it/test_exclusion_Scala3_3_3/invoker.properties new file mode 100644 index 00000000..3e51a5a6 --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_3/invoker.properties @@ -0,0 +1 @@ +invoker.goals=clean verify site -e -ntp \ No newline at end of file diff --git a/src/it/test_exclusion_Scala3_3_3/pom.xml b/src/it/test_exclusion_Scala3_3_3/pom.xml new file mode 100644 index 00000000..511eca15 --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_3/pom.xml @@ -0,0 +1,51 @@ + + + + 4.0.0 + + + it.scoverage-maven-plugin + integration_tests_parent + 1.0-SNAPSHOT + ../integration_tests_parent/pom.xml + + + test_exclusion + 1.0-SNAPSHOT + jar + Test Scoverage exclusion + Test Scoverage exclusion + + + 3 + 3.3.3 + scala3-library_3 + UTF-8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + net.alchim31.maven + scala-maven-plugin + + + org.scalatest + scalatest-maven-plugin + + + @project.groupId@ + @project.artifactId@ + + .*package02.*;.*package05 + .*Package03HelloService.*;.*Package03ByeService + + + + + diff --git a/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package01/Package01HelloService.scala b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package01/Package01HelloService.scala new file mode 100644 index 00000000..55ada336 --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package01/Package01HelloService.scala @@ -0,0 +1,8 @@ +package org.package01 + +object Package01HelloService { + + // gonna be included in coverage report + def hello: String = "Hello from package01" + +} diff --git a/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package02/nested02/package02nested02objects.scala b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package02/nested02/package02nested02objects.scala new file mode 100644 index 00000000..00f40ebe --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package02/nested02/package02nested02objects.scala @@ -0,0 +1,14 @@ +// gonna be excluded from coverage report by package exclusion +package org.package02.nested02 + +object ImGonnaBeExcludedCauseImInPackage02Nested02 { + + def hello: String = "Hello from package02.nested02" + +} + +object SameStoryBro { + + def hello: String = "Hello from package02.nested02 again" + +} diff --git a/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package02/package02objects.scala b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package02/package02objects.scala new file mode 100644 index 00000000..fca9d0c8 --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package02/package02objects.scala @@ -0,0 +1,14 @@ +// gonna be excluded from coverage report by package exclusion +package org.package02 + +object ImGonnaBeExcludedCauseImInPackage02 { + + def hello: String = "Hello from package02" + +} + +object SameStoryBro { + + def hello: String = "Hello from package02 again" + +} diff --git a/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03ByeService.scala b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03ByeService.scala new file mode 100644 index 00000000..56914ec8 --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03ByeService.scala @@ -0,0 +1,8 @@ +package org.package03 + +object Package03ByeService { + + // gonna be excluded from coverage report by file exclusion + def bye: String = "Bye from package03" + +} diff --git a/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03HelloService1.scala b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03HelloService1.scala new file mode 100644 index 00000000..2d05b244 --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03HelloService1.scala @@ -0,0 +1,8 @@ +package org.package03 + +object Package03HelloService1 { + + // gonna be excluded from coverage report by file exclusion + def hello: String = "Hello from package03 service 1" + +} diff --git a/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03HelloService2.scala b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03HelloService2.scala new file mode 100644 index 00000000..38c422b2 --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03HelloService2.scala @@ -0,0 +1,8 @@ +package org.package03 + +object Package03HelloService2 { + + // gonna be excluded from coverage report by file exclusion + def hello: String = "Hello from package03 service 2" + +} diff --git a/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package05/package05objects.scala b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package05/package05objects.scala new file mode 100644 index 00000000..7b5cca13 --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package05/package05objects.scala @@ -0,0 +1,14 @@ +// gonna be excluded from coverage report by package exclusion +package org.package05 + +object ImGonnaBeExcludedCauseImInPackage05 { + + def hello: String = "Hello from package05" + +} + +object SameStoryBro { + + def hello: String = "Hello from package05 again" + +} diff --git a/src/it/test_exclusion_Scala3_3_3/src/test/scala/org/package01/Package01HelloServiceTest.scala b/src/it/test_exclusion_Scala3_3_3/src/test/scala/org/package01/Package01HelloServiceTest.scala new file mode 100644 index 00000000..ebe11c6b --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_3/src/test/scala/org/package01/Package01HelloServiceTest.scala @@ -0,0 +1,12 @@ +package org.package01 + +import org.scalatest.wordspec.AnyWordSpec + +class Package01HelloServiceTest extends AnyWordSpec { + + "Package01HelloService" should { + "say hello" in { + assert(Package01HelloService.hello == "Hello from package01") + } + } +} diff --git a/src/it/test_exclusion_Scala3_3_3/validate.groovy b/src/it/test_exclusion_Scala3_3_3/validate.groovy new file mode 100644 index 00000000..bb74ac01 --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_3/validate.groovy @@ -0,0 +1,14 @@ +try { + + def logFile = new File(basedir, "build.log") + def lines = logFile.readLines() + assert lines.contains("[WARNING] Package exclusion is supported for Scala [3.3.4-3.4.0) or 3.4.2+") + assert lines.contains("[WARNING] File exclusion is supported for Scala [3.3.4-3.4.0) or 3.4.2+") + assert lines.contains("[INFO] Statement coverage.: 10.00%") + + return true + +} catch (Throwable e) { + e.printStackTrace() + return false +} diff --git a/src/it/test_exclusion_Scala3_3_4/invoker.properties b/src/it/test_exclusion_Scala3_3_4/invoker.properties new file mode 100644 index 00000000..3e51a5a6 --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_4/invoker.properties @@ -0,0 +1 @@ +invoker.goals=clean verify site -e -ntp \ No newline at end of file diff --git a/src/it/test_exclusion_Scala3_3_4/pom.xml b/src/it/test_exclusion_Scala3_3_4/pom.xml new file mode 100644 index 00000000..49948b39 --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_4/pom.xml @@ -0,0 +1,51 @@ + + + + 4.0.0 + + + it.scoverage-maven-plugin + integration_tests_parent + 1.0-SNAPSHOT + ../integration_tests_parent/pom.xml + + + test_exclusion + 1.0-SNAPSHOT + jar + Test Scoverage exclusion + Test Scoverage exclusion + + + 3 + 3.3.4 + scala3-library_3 + UTF-8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + net.alchim31.maven + scala-maven-plugin + + + org.scalatest + scalatest-maven-plugin + + + @project.groupId@ + @project.artifactId@ + + .*package02.*;.*package05 + .*Package03HelloService.*;.*Package03ByeService + + + + + diff --git a/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package01/Package01HelloService.scala b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package01/Package01HelloService.scala new file mode 100644 index 00000000..55ada336 --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package01/Package01HelloService.scala @@ -0,0 +1,8 @@ +package org.package01 + +object Package01HelloService { + + // gonna be included in coverage report + def hello: String = "Hello from package01" + +} diff --git a/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package02/nested02/package02nested02objects.scala b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package02/nested02/package02nested02objects.scala new file mode 100644 index 00000000..00f40ebe --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package02/nested02/package02nested02objects.scala @@ -0,0 +1,14 @@ +// gonna be excluded from coverage report by package exclusion +package org.package02.nested02 + +object ImGonnaBeExcludedCauseImInPackage02Nested02 { + + def hello: String = "Hello from package02.nested02" + +} + +object SameStoryBro { + + def hello: String = "Hello from package02.nested02 again" + +} diff --git a/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package02/package02objects.scala b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package02/package02objects.scala new file mode 100644 index 00000000..fca9d0c8 --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package02/package02objects.scala @@ -0,0 +1,14 @@ +// gonna be excluded from coverage report by package exclusion +package org.package02 + +object ImGonnaBeExcludedCauseImInPackage02 { + + def hello: String = "Hello from package02" + +} + +object SameStoryBro { + + def hello: String = "Hello from package02 again" + +} diff --git a/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03ByeService.scala b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03ByeService.scala new file mode 100644 index 00000000..56914ec8 --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03ByeService.scala @@ -0,0 +1,8 @@ +package org.package03 + +object Package03ByeService { + + // gonna be excluded from coverage report by file exclusion + def bye: String = "Bye from package03" + +} diff --git a/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03HelloService1.scala b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03HelloService1.scala new file mode 100644 index 00000000..2d05b244 --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03HelloService1.scala @@ -0,0 +1,8 @@ +package org.package03 + +object Package03HelloService1 { + + // gonna be excluded from coverage report by file exclusion + def hello: String = "Hello from package03 service 1" + +} diff --git a/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03HelloService2.scala b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03HelloService2.scala new file mode 100644 index 00000000..38c422b2 --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03HelloService2.scala @@ -0,0 +1,8 @@ +package org.package03 + +object Package03HelloService2 { + + // gonna be excluded from coverage report by file exclusion + def hello: String = "Hello from package03 service 2" + +} diff --git a/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package05/package05objects.scala b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package05/package05objects.scala new file mode 100644 index 00000000..7b5cca13 --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package05/package05objects.scala @@ -0,0 +1,14 @@ +// gonna be excluded from coverage report by package exclusion +package org.package05 + +object ImGonnaBeExcludedCauseImInPackage05 { + + def hello: String = "Hello from package05" + +} + +object SameStoryBro { + + def hello: String = "Hello from package05 again" + +} diff --git a/src/it/test_exclusion_Scala3_3_4/src/test/scala/org/package01/Package01HelloServiceTest.scala b/src/it/test_exclusion_Scala3_3_4/src/test/scala/org/package01/Package01HelloServiceTest.scala new file mode 100644 index 00000000..ebe11c6b --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_4/src/test/scala/org/package01/Package01HelloServiceTest.scala @@ -0,0 +1,12 @@ +package org.package01 + +import org.scalatest.wordspec.AnyWordSpec + +class Package01HelloServiceTest extends AnyWordSpec { + + "Package01HelloService" should { + "say hello" in { + assert(Package01HelloService.hello == "Hello from package01") + } + } +} diff --git a/src/it/test_exclusion_Scala3_3_4/validate.groovy b/src/it/test_exclusion_Scala3_3_4/validate.groovy new file mode 100644 index 00000000..ce78045d --- /dev/null +++ b/src/it/test_exclusion_Scala3_3_4/validate.groovy @@ -0,0 +1,19 @@ +try { + + def logFile = new File(basedir, "build.log") + def lines = logFile.readLines() + assert lines.contains("[INFO] Statement coverage.: 100.00%") + assert lines.contains("[INFO] Branch coverage....: 100.00%") + + def scoverageFile = new File(basedir, "target/scoverage.xml") + assert scoverageFile.exists() + + def reportFile = new File(basedir, "target/site/scoverage/index.html") + assert reportFile.exists() + + return true + +} catch (Throwable e) { + e.printStackTrace() + return false +} diff --git a/src/it/test_exclusion_Scala3_4_1/validate.groovy b/src/it/test_exclusion_Scala3_4_1/validate.groovy index 0e0f82ad..bb74ac01 100644 --- a/src/it/test_exclusion_Scala3_4_1/validate.groovy +++ b/src/it/test_exclusion_Scala3_4_1/validate.groovy @@ -2,8 +2,8 @@ try { def logFile = new File(basedir, "build.log") def lines = logFile.readLines() - assert lines.contains("[WARNING] Package exclusion is supported since Scala 3.4.2") - assert lines.contains("[WARNING] File exclusion is supported since Scala 3.4.2") + assert lines.contains("[WARNING] Package exclusion is supported for Scala [3.3.4-3.4.0) or 3.4.2+") + assert lines.contains("[WARNING] File exclusion is supported for Scala [3.3.4-3.4.0) or 3.4.2+") assert lines.contains("[INFO] Statement coverage.: 10.00%") return true diff --git a/src/main/java/org/scoverage/plugin/SCoveragePreCompileMojo.java b/src/main/java/org/scoverage/plugin/SCoveragePreCompileMojo.java index c42cba8b..236c24c8 100644 --- a/src/main/java/org/scoverage/plugin/SCoveragePreCompileMojo.java +++ b/src/main/java/org/scoverage/plugin/SCoveragePreCompileMojo.java @@ -278,6 +278,10 @@ public void execute() throws MojoExecutionException try { boolean scala2 = resolvedScalaVersion.isScala2(); + boolean filePackageExclusionSupportingScala3 = + resolvedScalaVersion.isAtLeast( "3.4.2" ) || + // backported to Scala 3.3 LTS + ( resolvedScalaVersion.full.startsWith( "3.3." ) && resolvedScalaVersion.isAtLeast( "3.3.4" ) ); List pluginArtifacts = getScalaScoveragePluginArtifacts( resolvedScalaVersion ); if ( scala2 ) // Scala 3 doesn't need scalac-scoverage-runtime @@ -300,13 +304,13 @@ public void execute() throws MojoExecutionException arg = SCALA2_EXCLUDED_PACKAGES_OPTION + excludedPackages.replace( "(empty)", "" ); _scalacOptions = _scalacOptions + SPACE + quoteArgument( arg ); addScalacArgs = addScalacArgs + PIPE + arg; - } else if ( resolvedScalaVersion.isAtLeast( "3.4.2" ) ) { + } else if ( filePackageExclusionSupportingScala3 ) { String scala3FormatExcludedPackages = excludedPackages.replace( ";", "," ); arg = SCALA3_EXCLUDED_PACKAGES_OPTION + scala3FormatExcludedPackages; _scalacOptions = _scalacOptions + SPACE + quoteArgument( arg ); addScalacArgs = addScalacArgs + PIPE + arg; } else { - getLog().warn( "Package exclusion is supported since Scala 3.4.2" ); + getLog().warn( "Package exclusion is supported for Scala [3.3.4-3.4.0) or 3.4.2+" ); } } @@ -316,13 +320,13 @@ public void execute() throws MojoExecutionException arg = SCALA2_EXCLUDED_FILES_OPTION + excludedFiles; _scalacOptions = _scalacOptions + SPACE + quoteArgument( arg ); addScalacArgs = addScalacArgs + PIPE + arg; - } else if ( resolvedScalaVersion.isAtLeast( "3.4.2" ) ) { + } else if ( filePackageExclusionSupportingScala3 ) { String scala3FormatExcludedFiles = excludedFiles.replace( ";", "," ); arg = SCALA3_EXCLUDED_FILES_OPTION + scala3FormatExcludedFiles; _scalacOptions = _scalacOptions + SPACE + quoteArgument( arg ); addScalacArgs = addScalacArgs + PIPE + arg; } else { - getLog().warn( "File exclusion is supported since Scala 3.4.2" ); + getLog().warn( "File exclusion is supported for Scala [3.3.4-3.4.0) or 3.4.2+" ); } }