diff --git a/src/functionalTest/java/org.scoverage/ScalaSingleMultiLangModuleTest.java b/src/functionalTest/java/org.scoverage/ScalaSingleMultiLangModuleTest.java new file mode 100644 index 0000000..3f8dd76 --- /dev/null +++ b/src/functionalTest/java/org.scoverage/ScalaSingleMultiLangModuleTest.java @@ -0,0 +1,145 @@ +package org.scoverage; + +import org.junit.Assert; +import org.junit.Test; + +public class ScalaSingleMultiLangModuleTest extends ScoverageFunctionalTest { + + public ScalaSingleMultiLangModuleTest() { super("scala-single-multi-lang-module"); } + + @Test + public void test() { + + AssertableBuildResult result = dryRun("clean", "test"); + + result.assertTaskDoesntExist(ScoveragePlugin.getCOMPILE_NAME()); + result.assertTaskDoesntExist(ScoveragePlugin.getREPORT_NAME()); + result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME()); + result.assertTaskDoesntExist(ScoveragePlugin.getCHECK_NAME()); + } + + @Test + public void build() { + + AssertableBuildResult result = dryRun("clean", "build"); + + result.assertTaskDoesntExist(ScoveragePlugin.getCOMPILE_NAME()); + result.assertTaskDoesntExist(ScoveragePlugin.getREPORT_NAME()); + result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME()); + result.assertTaskDoesntExist(ScoveragePlugin.getCHECK_NAME()); + } + + @Test + public void reportScoverage() { + + AssertableBuildResult result = dryRun("clean", ScoveragePlugin.getREPORT_NAME()); + + result.assertTaskExists(ScoveragePlugin.getCOMPILE_NAME()); + result.assertTaskExists(ScoveragePlugin.getREPORT_NAME()); + result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME()); + result.assertTaskDoesntExist(ScoveragePlugin.getCHECK_NAME()); + } + + @Test + public void aggregateScoverage() { + + AssertableBuildResult result = runAndFail("clean", ScoveragePlugin.getAGGREGATE_NAME()); + + result.assertNoTasks(); + } + + @Test + public void checkScoverage() throws Exception { + + AssertableBuildResult result = run("clean", ScoveragePlugin.getCHECK_NAME()); + + result.assertTaskSucceeded(ScoveragePlugin.getCOMPILE_NAME()); + result.assertTaskSucceeded(ScoveragePlugin.getREPORT_NAME()); + result.assertTaskSucceeded(ScoveragePlugin.getCHECK_NAME()); + result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME()); + + assertReportFilesExist(); + assertCoverage(66.7); + } + + @Test + public void checkScoverageFails() throws Exception { + + AssertableBuildResult result = runAndFail("clean", ScoveragePlugin.getCHECK_NAME(), + "test", "--tests", "org.hello.TestNothingSuite"); + + result.assertTaskSucceeded(ScoveragePlugin.getCOMPILE_NAME()); + result.assertTaskSucceeded(ScoveragePlugin.getREPORT_NAME()); + result.assertTaskFailed(ScoveragePlugin.getCHECK_NAME()); + result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME()); + + assertReportFilesExist(); + assertCoverage(0.0); + } + + @Test + public void reportScoverageWithExcludedClasses() throws Exception { + + AssertableBuildResult result = run("clean", ScoveragePlugin.getREPORT_NAME(), + "-PexcludedFile=.*"); + + result.assertTaskSucceeded(ScoveragePlugin.getCOMPILE_NAME()); + result.assertTaskSucceeded(ScoveragePlugin.getREPORT_NAME()); + result.assertTaskDoesntExist(ScoveragePlugin.getCHECK_NAME()); + result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME()); + + Assert.assertTrue(resolve(reportDir(), "index.html").exists()); + Assert.assertFalse(resolve(reportDir(), "src/main/scala/org/hello/World.scala.html").exists()); + assertCoverage(100.0); // coverage is 100 since no classes are covered + + // compiled class should exist in the default classes directory, but not in scoverage + Assert.assertTrue(resolve(buildDir(), "classes/scala/main/org/hello/World.class").exists()); + Assert.assertFalse(resolve(buildDir(), "classes/scala/scoverage/org/hello/World.class").exists()); + } + + @Test + public void reportScoverageWithoutNormalCompilation() throws Exception { + + AssertableBuildResult result = run("clean", ScoveragePlugin.getREPORT_NAME(), + "-x", "compileScala"); + + result.assertTaskSkipped("compileScala"); + result.assertTaskSucceeded(ScoveragePlugin.getCOMPILE_NAME()); + result.assertTaskSucceeded(ScoveragePlugin.getREPORT_NAME()); + result.assertTaskDoesntExist(ScoveragePlugin.getCHECK_NAME()); + result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME()); + + assertReportFilesExist(); + assertCoverage(66.7); + + Assert.assertTrue(resolve(reportDir(), "index.html").exists()); + Assert.assertTrue(resolve(reportDir(), "src/main/scala/org/hello/World.scala.html").exists()); + Assert.assertFalse(resolve(reportDir(), "src/main/java/org/hello/JavaWorld.java.html").exists()); + + Assert.assertTrue(resolve(buildDir(), "classes/java/main/org/hello/JavaWorld.class").exists()); + Assert.assertTrue(resolve(buildDir(), "classes/java/scoverage/org/hello/JavaWorld.class").exists()); + Assert.assertTrue(resolve(buildDir(), "classes/scala/main/org/hello/World.class").exists()); + Assert.assertFalse(resolve(buildDir(), "classes/scala/scoverage/org/hello/World.class").exists()); + } + + @Test + public void reportScoverageWithoutNormalCompilationAndWithExcludedClasses() throws Exception { + + AssertableBuildResult result = run("clean", ScoveragePlugin.getREPORT_NAME(), + "-PexcludedFile=.*", "-x", "compileScala"); + + Assert.assertTrue(resolve(reportDir(), "index.html").exists()); + Assert.assertFalse(resolve(reportDir(), "src/main/scala/org/hello/World.scala.html").exists()); + assertCoverage(100.0); // coverage is 100 since no classes are covered + + // compiled class should exist in the default classes directory, but not in scoverage + Assert.assertTrue(resolve(buildDir(), "classes/scala/main/org/hello/World.class").exists()); + Assert.assertFalse(resolve(buildDir(), "classes/scala/scoverage/org/hello/World.class").exists()); + } + + + private void assertReportFilesExist() { + Assert.assertTrue(resolve(reportDir(), "index.html").exists()); + Assert.assertTrue(resolve(reportDir(), "src/main/scala/org/hello/World.scala.html").exists()); + } +} diff --git a/src/functionalTest/resources/projects/scala-single-multi-lang-module/build.gradle b/src/functionalTest/resources/projects/scala-single-multi-lang-module/build.gradle new file mode 100644 index 0000000..c7ebff2 --- /dev/null +++ b/src/functionalTest/resources/projects/scala-single-multi-lang-module/build.gradle @@ -0,0 +1,33 @@ +plugins { + id 'org.scoverage' +} + +repositories { + jcenter() +} + +description = 'a single-module Scala project with java and scala sources' + +apply plugin: 'java' +apply plugin: 'scala' + +dependencies { + compile group: 'org.scala-lang', name: 'scala-library', version: "${scalaVersionMajor}.${scalaVersionMinor}.${scalaVersionBuild}" + + testRuntime group: 'org.junit.vintage', name: 'junit-vintage-engine', version: junitVersion + testCompile group: 'org.junit.platform', name: 'junit-platform-runner', version: junitPlatformVersion + + testCompile group: 'org.scalatest', name: "scalatest_${scalaVersionMajor}.${scalaVersionMinor}", version: scalatestVersion +} + +test { + useJUnitPlatform() +} + +scoverage { + minimumRate = 0.3 +} + +if (hasProperty("excludedFile")) { + scoverage.excludedFiles = [excludedFile] +} diff --git a/src/functionalTest/resources/projects/scala-single-multi-lang-module/settings.gradle b/src/functionalTest/resources/projects/scala-single-multi-lang-module/settings.gradle new file mode 100644 index 0000000..e69de29 diff --git a/src/functionalTest/resources/projects/scala-single-multi-lang-module/src/main/java/org/hello/JavaWorld.java b/src/functionalTest/resources/projects/scala-single-multi-lang-module/src/main/java/org/hello/JavaWorld.java new file mode 100644 index 0000000..2f199c5 --- /dev/null +++ b/src/functionalTest/resources/projects/scala-single-multi-lang-module/src/main/java/org/hello/JavaWorld.java @@ -0,0 +1,7 @@ +package org.hello; + +public class JavaWorld { + public static void hello() { + System.out.println("Hello, World!"); + } +} diff --git a/src/functionalTest/resources/projects/scala-single-multi-lang-module/src/main/scala/org/hello/World.scala b/src/functionalTest/resources/projects/scala-single-multi-lang-module/src/main/scala/org/hello/World.scala new file mode 100644 index 0000000..b7090dc --- /dev/null +++ b/src/functionalTest/resources/projects/scala-single-multi-lang-module/src/main/scala/org/hello/World.scala @@ -0,0 +1,14 @@ +package org.hello + +class World { + + def foo(): String = { + val s = "a" + "b" + s + } + + // not covered by tests + def bar(): String = "y" + + def helloFromJava(): Unit = JavaWorld.hello() +} diff --git a/src/functionalTest/resources/projects/scala-single-multi-lang-module/src/test/scala/org/hello/TestNothingSuite.scala b/src/functionalTest/resources/projects/scala-single-multi-lang-module/src/test/scala/org/hello/TestNothingSuite.scala new file mode 100644 index 0000000..b8599be --- /dev/null +++ b/src/functionalTest/resources/projects/scala-single-multi-lang-module/src/test/scala/org/hello/TestNothingSuite.scala @@ -0,0 +1,12 @@ +package org.hello + +import org.junit.runner.RunWith +import org.scalatest.FunSuite +import org.scalatest.junit.JUnitRunner + +@RunWith(classOf[JUnitRunner]) +class TestNothingSuite extends FunSuite { + + test("nothing") { + } +} diff --git a/src/functionalTest/resources/projects/scala-single-multi-lang-module/src/test/scala/org/hello/WorldSuite.scala b/src/functionalTest/resources/projects/scala-single-multi-lang-module/src/test/scala/org/hello/WorldSuite.scala new file mode 100644 index 0000000..2e90b74 --- /dev/null +++ b/src/functionalTest/resources/projects/scala-single-multi-lang-module/src/test/scala/org/hello/WorldSuite.scala @@ -0,0 +1,17 @@ +package org.hello + +import org.junit.runner.RunWith +import org.scalatest.FunSuite +import org.scalatest.junit.JUnitRunner + +@RunWith(classOf[JUnitRunner]) +class WorldSuite extends FunSuite { + + test("foo") { + new World().foo() + } + + test("helloFromJava") { + new World().helloFromJava() + } +} diff --git a/src/main/groovy/org/scoverage/ScoveragePlugin.groovy b/src/main/groovy/org/scoverage/ScoveragePlugin.groovy index 1a4e6c4..af6dc80 100644 --- a/src/main/groovy/org/scoverage/ScoveragePlugin.groovy +++ b/src/main/groovy/org/scoverage/ScoveragePlugin.groovy @@ -106,6 +106,7 @@ class ScoveragePlugin implements Plugin { def instrumentedSourceSet = project.sourceSets.create('scoverage') { resources.source(originalSourceSet.resources) + java.source(originalSourceSet.java) scala.source(originalSourceSet.scala) compileClasspath += originalSourceSet.compileClasspath + project.configurations.scoverage