forked from scoverage/sbt-scoverage
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCoverageMinimum.scala
105 lines (93 loc) · 2.6 KB
/
CoverageMinimum.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package scoverage
import sbt._
import scoverage.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._
val stmtTotal =
math.max(coverageMinimum.value, coverageMinimumStmtTotal.value)
All(
total = CoverageMinimum(
statement = stmtTotal,
branch = coverageMinimumBranchTotal.value
),
perPackage = CoverageMinimum(
statement = coverageMinimumStmtPerPackage.value,
branch = coverageMinimumBranchPerPackage.value
),
perFile = CoverageMinimum(
statement = coverageMinimumStmtPerFile.value,
branch = coverageMinimumBranchPerFile.value
)
)
}
}