All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scoverage.CoverageMinimum.scala Maven / Gradle / Ivy

The newest version!
package scoverage

import sbt._
import scoverage.domain.Coverage
import scoverage.domain.CoverageMetrics
import scoverage.domain.DoubleFormat.twoFractionDigits

case class CoverageMinimum(
    statement: Double,
    branch: Double
) {
  def checkCoverage(
      metrics: CoverageMetrics,
      metric: String
  )(implicit log: Logger): Boolean = {
    CoverageMinimum.checkCoverage(
      s"Branch:$metric",
      branch,
      metrics.branchCoveragePercent
    ) &&
    CoverageMinimum.checkCoverage(
      s"Stmt:$metric",
      statement,
      metrics.statementCoveragePercent
    )
  }

}

object CoverageMinimum {

  def checkCoverage(
      metric: String,
      min: Double,
      cper: Double
  )(implicit log: Logger): Boolean = {
    // check for default minimum
    min <= 0 || {
      def is100(d: Double) = Math.abs(100 - d) <= 0.00001

      if (is100(min) && is100(cper)) {
        log.debug(s"100% Coverage: $metric")
        true
      } else {
        val ok: Boolean = min <= cper
        def minfmt = twoFractionDigits(min)
        def cfmt = twoFractionDigits(cper)
        if (ok) {
          log.debug(s"Coverage is above minimum [$cfmt% >= $minfmt%]: $metric")
        } else {
          log.error(s"Coverage is below minimum [$cfmt% < $minfmt%]: $metric")
        }
        ok
      }
    }
  }

  case class All(
      total: CoverageMinimum,
      perPackage: CoverageMinimum,
      perFile: CoverageMinimum
  ) {
    def checkCoverage(
        coverage: Coverage,
        failOnMin: Boolean
    )(implicit log: Logger): Unit = {
      val ok: Boolean = total.checkCoverage(coverage, "Total") &&
        coverage.packages.forall(pkg =>
          perPackage.checkCoverage(pkg, s"Package:${pkg.name}")
        ) &&
        coverage.files.forall(file =>
          perFile.checkCoverage(file, s"File:${file.filename}")
        )

      if (!ok && failOnMin)
        throw new RuntimeException("Coverage minimum was not reached")

      log.info(
        s"All done. Coverage was" +
          s" stmt=[${coverage.statementCoverageFormatted}%]" +
          s" branch=[${coverage.branchCoverageFormatted}%]"
      )
    }

  }

  def all = Def.setting {
    import ScoverageKeys._
    All(
      total = CoverageMinimum(
        statement = coverageMinimumStmtTotal.value,
        branch = coverageMinimumBranchTotal.value
      ),
      perPackage = CoverageMinimum(
        statement = coverageMinimumStmtPerPackage.value,
        branch = coverageMinimumBranchPerPackage.value
      ),
      perFile = CoverageMinimum(
        statement = coverageMinimumStmtPerFile.value,
        branch = coverageMinimumBranchPerFile.value
      )
    )
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy