From 0677bbe914e9b02595bfc935827f18d9254d7b4a Mon Sep 17 00:00:00 2001 From: JanBessai Date: Wed, 18 Jul 2018 15:23:16 +0200 Subject: [PATCH 1/5] Quick fix to get new Scala collections compatibility in test. --- .../src/test/scala/scoverage/PluginCoverageTest.scala | 6 +++--- .../src/test/scala/scoverage/ScoverageCompiler.scala | 9 +++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/scalac-scoverage-plugin/src/test/scala/scoverage/PluginCoverageTest.scala b/scalac-scoverage-plugin/src/test/scala/scoverage/PluginCoverageTest.scala index 20c9b895..5488ac50 100644 --- a/scalac-scoverage-plugin/src/test/scala/scoverage/PluginCoverageTest.scala +++ b/scalac-scoverage-plugin/src/test/scala/scoverage/PluginCoverageTest.scala @@ -263,9 +263,9 @@ class PluginCoverageTest | } | }""".stripMargin) assert(!compiler.reporter.hasErrors) - // 2 statements for the two applies in Seq, one for each literal which is 6, one for the flat map, - // one for the map, one for the yield op. - compiler.assertNMeasuredStatements(11) + // 2 statements for the two applies in Seq, one for each literal which is 6, one for the operation passed to yield. + // Depending on the collections api version, there can be additional implicit canBuildFrom statements. + compiler.assertAtLeastNStatements(9) } test("plugin should not instrument local macro implementation") { diff --git a/scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageCompiler.scala b/scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageCompiler.scala index 75abedbf..2d33fcbd 100644 --- a/scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageCompiler.scala +++ b/scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageCompiler.scala @@ -102,11 +102,16 @@ class ScoverageCompiler(settings: scala.tools.nsc.Settings, reporter: scala.tool def assertNoCoverage() = assert(!testStore.sources.mkString(" ").contains(s"scoverage.Invoker.invoked")) - def assertNMeasuredStatements(n: Int): Unit = { - for ( k <- 1 to n ) { + + def assertAtLeastNStatements(n: Int): Unit = { + for (k <- 1 to n) { assert(testStore.sources.mkString(" ").contains(s"scoverage.Invoker.invoked($k,"), s"Should be $n invoked statements but missing #$k") } + } + + def assertNMeasuredStatements(n: Int): Unit = { + assertAtLeastNStatements(n) assert(!testStore.sources.mkString(" ").contains(s"scoverage.Invoker.invoked(${n + 1},"), s"Found statement ${n + 1} but only expected $n") } From 191e96ceb652a855c937ef2950666b941985e037 Mon Sep 17 00:00:00 2001 From: JanBessai Date: Thu, 19 Jul 2018 14:27:45 +0200 Subject: [PATCH 2/5] Remove deprecated breakOut optimization --- .../jvm/src/test/scala/scoverage/InvokerConcurrencyTest.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scalac-scoverage-runtime/jvm/src/test/scala/scoverage/InvokerConcurrencyTest.scala b/scalac-scoverage-runtime/jvm/src/test/scala/scoverage/InvokerConcurrencyTest.scala index 7943db95..c78c8d5d 100644 --- a/scalac-scoverage-runtime/jvm/src/test/scala/scoverage/InvokerConcurrencyTest.scala +++ b/scalac-scoverage-runtime/jvm/src/test/scala/scoverage/InvokerConcurrencyTest.scala @@ -5,7 +5,6 @@ import java.util.concurrent.Executors import org.scalatest.{BeforeAndAfter, FunSuite} -import scala.collection.breakOut import scala.concurrent._ import scala.concurrent.duration._ @@ -33,7 +32,7 @@ class InvokerConcurrencyTest extends FunSuite with BeforeAndAfter { Future { Invoker.invoked(i, measurementDir.toString) } - }(breakOut) + }.toList futures.foreach(Await.result(_, 1.second)) From 9d8ab70f2c8e311334ebf9d52945a1cdb782659b Mon Sep 17 00:00:00 2001 From: JanBessai Date: Sun, 22 Jul 2018 10:51:45 +0200 Subject: [PATCH 3/5] Base number of expected statements in yield test on compiler version --- .../src/test/scala/scoverage/PluginCoverageTest.scala | 3 ++- .../src/test/scala/scoverage/ScoverageCompiler.scala | 8 ++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/scalac-scoverage-plugin/src/test/scala/scoverage/PluginCoverageTest.scala b/scalac-scoverage-plugin/src/test/scala/scoverage/PluginCoverageTest.scala index 5488ac50..2c292f61 100644 --- a/scalac-scoverage-plugin/src/test/scala/scoverage/PluginCoverageTest.scala +++ b/scalac-scoverage-plugin/src/test/scala/scoverage/PluginCoverageTest.scala @@ -265,7 +265,8 @@ class PluginCoverageTest assert(!compiler.reporter.hasErrors) // 2 statements for the two applies in Seq, one for each literal which is 6, one for the operation passed to yield. // Depending on the collections api version, there can be additional implicit canBuildFrom statements. - compiler.assertAtLeastNStatements(9) + val expectedStatementsCount = if (ScoverageCompiler.ShortScalaVersion < "2.13") 11 else 9 + compiler.assertNMeasuredStatements(expectedStatementsCount) } test("plugin should not instrument local macro implementation") { diff --git a/scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageCompiler.scala b/scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageCompiler.scala index 2d33fcbd..0a1b777c 100644 --- a/scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageCompiler.scala +++ b/scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageCompiler.scala @@ -103,15 +103,11 @@ class ScoverageCompiler(settings: scala.tools.nsc.Settings, reporter: scala.tool def assertNoCoverage() = assert(!testStore.sources.mkString(" ").contains(s"scoverage.Invoker.invoked")) - def assertAtLeastNStatements(n: Int): Unit = { + def assertNMeasuredStatements(n: Int): Unit = { for (k <- 1 to n) { assert(testStore.sources.mkString(" ").contains(s"scoverage.Invoker.invoked($k,"), s"Should be $n invoked statements but missing #$k") } - } - - def assertNMeasuredStatements(n: Int): Unit = { - assertAtLeastNStatements(n) assert(!testStore.sources.mkString(" ").contains(s"scoverage.Invoker.invoked(${n + 1},"), s"Found statement ${n + 1} but only expected $n") } @@ -144,7 +140,7 @@ class ScoverageCompiler(settings: scala.tools.nsc.Settings, reporter: scala.tool class Transformer(unit: global.CompilationUnit) extends TypingTransformer(unit) { override def transform(tree: global.Tree) = { - sources append tree.toString + sources += tree.toString tree } } From 638fde18463bb195f90b4b9bd2ebe6c2cefd7c1b Mon Sep 17 00:00:00 2001 From: JanBessai Date: Sun, 22 Jul 2018 10:52:19 +0200 Subject: [PATCH 4/5] Remove unnecessary toList conversion in InvokerConcurrencyTest --- .../src/test/scala/scoverage/InvokerConcurrencyTest.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scalac-scoverage-runtime/jvm/src/test/scala/scoverage/InvokerConcurrencyTest.scala b/scalac-scoverage-runtime/jvm/src/test/scala/scoverage/InvokerConcurrencyTest.scala index c78c8d5d..d9e7f6cb 100644 --- a/scalac-scoverage-runtime/jvm/src/test/scala/scoverage/InvokerConcurrencyTest.scala +++ b/scalac-scoverage-runtime/jvm/src/test/scala/scoverage/InvokerConcurrencyTest.scala @@ -28,17 +28,17 @@ class InvokerConcurrencyTest extends FunSuite with BeforeAndAfter { // Create 1k "invoked" calls on the common thread pool, to stress test // the method - val futures: List[Future[Unit]] = testIds.map { i: Int => + val futures: Set[Future[Unit]] = testIds.map { i: Int => Future { Invoker.invoked(i, measurementDir.toString) } - }.toList + } futures.foreach(Await.result(_, 1.second)) // Now verify that the measurement file is not corrupted by loading it val measurementFiles = Invoker.findMeasurementFiles(measurementDir) - val idsFromFile = Invoker.invoked(measurementFiles).toSet + val idsFromFile = Invoker.invoked(measurementFiles.toIndexedSeq).toSet idsFromFile === testIds } From f7b16e992ec103ffb536ac0f42b1ba61ee976a8b Mon Sep 17 00:00:00 2001 From: JanBessai Date: Sun, 22 Jul 2018 10:53:01 +0200 Subject: [PATCH 5/5] Cleanup multiple depreacted collection API calls --- .../src/main/scala/scoverage/plugin.scala | 10 +++++++--- .../src/test/scala/scoverage/IOUtilsTest.scala | 2 +- .../test/scala/scoverage/InvokerMultiModuleTest.scala | 4 ++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/scalac-scoverage-plugin/src/main/scala/scoverage/plugin.scala b/scalac-scoverage-plugin/src/main/scala/scoverage/plugin.scala index fa9bd3ea..609dcebc 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/plugin.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/plugin.scala @@ -18,15 +18,19 @@ class ScoveragePlugin(val global: Global) extends Plugin { val instrumentationComponent = new ScoverageInstrumentationComponent(global, extraAfterPhase, extraBeforePhase) override val components: List[PluginComponent] = List(instrumentationComponent) + private def parseExclusionEntry(entryName: String, inOption: String): Seq[String] = + inOption.substring(entryName.length).split(";").map(_.trim).toIndexedSeq.filterNot(_.isEmpty) + override def processOptions(opts: List[String], error: String => Unit): Unit = { val options = new ScoverageOptions + for (opt <- opts) { if (opt.startsWith("excludedPackages:")) { - options.excludedPackages = opt.substring("excludedPackages:".length).split(";").map(_.trim).filterNot(_.isEmpty) + options.excludedPackages = parseExclusionEntry("excludedPackages", opt) } else if (opt.startsWith("excludedFiles:")) { - options.excludedFiles = opt.substring("excludedFiles:".length).split(";").map(_.trim).filterNot(_.isEmpty) + options.excludedFiles = parseExclusionEntry("excludedFiles", opt) } else if (opt.startsWith("excludedSymbols:")) { - options.excludedSymbols = opt.substring("excludedSymbols:".length).split(";").map(_.trim).filterNot(_.isEmpty) + options.excludedSymbols = parseExclusionEntry("excludedSymbols", opt) } else if (opt.startsWith("dataDir:")) { options.dataDir = opt.substring("dataDir:".length) } else if (opt.startsWith("extraAfterPhase:") || opt.startsWith("extraBeforePhase:")) { diff --git a/scalac-scoverage-plugin/src/test/scala/scoverage/IOUtilsTest.scala b/scalac-scoverage-plugin/src/test/scala/scoverage/IOUtilsTest.scala index f653b835..d17a6c56 100644 --- a/scalac-scoverage-plugin/src/test/scala/scoverage/IOUtilsTest.scala +++ b/scalac-scoverage-plugin/src/test/scala/scoverage/IOUtilsTest.scala @@ -36,7 +36,7 @@ class IOUtilsTest extends FreeSpec with MockitoSugar with OneInstancePerTest wit writer2.close() val files = IOUtils.findMeasurementFiles(file1.getParent) - val invoked = IOUtils.invoked(files) + val invoked = IOUtils.invoked(files.toIndexedSeq) assert(invoked.toSet === Set(1, 2, 5, 7, 9, 10, 14)) file1.delete() diff --git a/scalac-scoverage-runtime/shared/src/test/scala/scoverage/InvokerMultiModuleTest.scala b/scalac-scoverage-runtime/shared/src/test/scala/scoverage/InvokerMultiModuleTest.scala index 013153dd..2007c95d 100644 --- a/scalac-scoverage-runtime/shared/src/test/scala/scoverage/InvokerMultiModuleTest.scala +++ b/scalac-scoverage-runtime/shared/src/test/scala/scoverage/InvokerMultiModuleTest.scala @@ -27,12 +27,12 @@ class InvokerMultiModuleTest extends FunSuite with BeforeAndAfter { // Verify measurements went to correct directory val measurementFiles0 = Invoker.findMeasurementFiles(measurementDir(0)) - val idsFromFile0 = Invoker.invoked(measurementFiles0).toSet + val idsFromFile0 = Invoker.invoked(measurementFiles0.toIndexedSeq).toSet idsFromFile0 === testIds.filter { i: Int => i % 2 == 0 } val measurementFiles1 = Invoker.findMeasurementFiles(measurementDir(0)) - val idsFromFile1 = Invoker.invoked(measurementFiles1).toSet + val idsFromFile1 = Invoker.invoked(measurementFiles1.toIndexedSeq).toSet idsFromFile1 === testIds.filter { i: Int => i % 2 == 1 } }