Skip to content

False positive 100% coverage #426

@andreisilviudragnea

Description

@andreisilviudragnea

There are cases when coverage is mistakenly reported as 100%, even if it is not true:

package org.example

import com.typesafe.scalalogging.Logger

import java.util.concurrent.CompletableFuture

class Class(logger: Logger) {
  def brokenCoverage1(input: Option[String]): String = {
    input match {
      case Some(value) => value
      case None        => ""
    }
  }

  def brokenCoverage2(input: Option[String]): String = {
    input match {
      case Some(value) => {
        value
      }
      case None => ""
    }
  }

  def brokenCoverage3(): Unit = {
    CompletableFuture.completedFuture("").whenComplete { (_, throwable) =>
      Option(throwable) match {
        case Some(_) => logger.error("Error completing future")
        case None    => ()
      }
    }
  }

  def brokenCoverage4(): Unit = {
    CompletableFuture.completedFuture("").whenComplete { (_, throwable) =>
      Option(throwable) match {
        case Some(_) => {
          logger.error("Error completing future")
        }
        case None => ()
      }
    }
  }

  def brokenCoverage5(input: Option[String]): String = {
    input match {
      case Some(_) => s"something"
      case None    => ""
    }
  }

  def brokenCoverage6(input: Option[String]): String = {
    input match {
      case Some(value) => s"something $value"
      case None        => ""
    }
  }

  def brokenCoverage7(input: Option[String]): String = {
    input match {
      case Some(value) => {
        s"something $value"
      }
      case None => ""
    }
  }
}
package org.example

import com.typesafe.scalalogging.Logger
import org.scalatest.funsuite.AnyFunSuite
import org.scalatest.matchers.should
import org.slf4j.LoggerFactory

class ScoverageSpec extends AnyFunSuite with should.Matchers {

  test("scoverage") {
    val logger: Logger = Logger(LoggerFactory.getLogger("[Gomez]"))
    new Class(logger).brokenCoverage1(None) shouldBe ""
    new Class(logger).brokenCoverage2(None) shouldBe ""
    new Class(logger).brokenCoverage3() shouldBe ()
    new Class(logger).brokenCoverage4() shouldBe ()
    new Class(logger).brokenCoverage5(None) shouldBe ""
    new Class(logger).brokenCoverage6(None) shouldBe ""
    new Class(logger).brokenCoverage7(None) shouldBe ""
  }
}

Running sbt coverage test coverageReport does not fail as it should, but reports 100% coverage. I have reproduced the bug here: https://github.com/andreisilviudragnea/scoverage-bugs

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions