20
20
import java .io .File ;
21
21
import java .util .Arrays ;
22
22
import java .util .List ;
23
+ import java .util .function .Function ;
24
+ import java .util .function .Predicate ;
23
25
24
26
import org .apache .maven .plugin .AbstractMojo ;
25
27
import org .apache .maven .plugin .MojoFailureException ;
36
38
import scoverage .domain .Coverage ;
37
39
import scoverage .domain .CoverageMetrics ;
38
40
import scoverage .domain .DoubleFormat ;
41
+ import scoverage .domain .MeasuredFile ;
42
+ import scoverage .domain .MeasuredPackage ;
39
43
import scoverage .reporter .IOUtils ;
40
44
import scoverage .serialize .Serializer ;
41
45
@@ -96,6 +100,54 @@ public class SCoverageCheckMojo
96
100
@ Parameter ( property = "scoverage.minimumCoverageBranchTotal" , defaultValue = "0" )
97
101
private Double minimumCoverageBranchTotal ;
98
102
103
+ /**
104
+ * Required minimum per-package statement coverage.
105
+ * <br>
106
+ * <br>
107
+ * See <a href="https://github.com/scoverage/sbt-scoverage#minimum-coverage">https://github.com/scoverage/sbt-scoverage#minimum-coverage</a> for additional documentation.
108
+ * <br>
109
+ *
110
+ * @since 2.0.1
111
+ */
112
+ @ Parameter ( property = "scoverage.minimumCoverageStmtPerPackage" , defaultValue = "0" )
113
+ private Double minimumCoverageStmtPerPackage ;
114
+
115
+ /**
116
+ * Required minimum per-package branch coverage.
117
+ * <br>
118
+ * <br>
119
+ * See <a href="https://github.com/scoverage/sbt-scoverage#minimum-coverage">https://github.com/scoverage/sbt-scoverage#minimum-coverage</a> for additional documentation.
120
+ * <br>
121
+ *
122
+ * @since 2.0.1
123
+ */
124
+ @ Parameter ( property = "scoverage.minimumCoverageBranchPerPackage" , defaultValue = "0" )
125
+ private Double minimumCoverageBranchPerPackage ;
126
+
127
+ /**
128
+ * Required minimum per-file statement coverage.
129
+ * <br>
130
+ * <br>
131
+ * See <a href="https://github.com/scoverage/sbt-scoverage#minimum-coverage">https://github.com/scoverage/sbt-scoverage#minimum-coverage</a> for additional documentation.
132
+ * <br>
133
+ *
134
+ * @since 2.0.1
135
+ */
136
+ @ Parameter ( property = "scoverage.minimumCoverageStmtPerFile" , defaultValue = "0" )
137
+ private Double minimumCoverageStmtPerFile ;
138
+
139
+ /**
140
+ * Required minimum per-file branch coverage.
141
+ * <br>
142
+ * <br>
143
+ * See <a href="https://github.com/scoverage/sbt-scoverage#minimum-coverage">https://github.com/scoverage/sbt-scoverage#minimum-coverage</a> for additional documentation.
144
+ * <br>
145
+ *
146
+ * @since 2.0.1
147
+ */
148
+ @ Parameter ( property = "scoverage.minimumCoverageBranchPerFile" , defaultValue = "0" )
149
+ private Double minimumCoverageBranchPerFile ;
150
+
99
151
/**
100
152
* Fail the build if minimum coverage was not reached.
101
153
* <br>
@@ -188,6 +240,10 @@ public void execute() throws MojoFailureException
188
240
189
241
boolean ok = checkCoverage ( getLog (), "Total" , coverage ,
190
242
minimumCoverage , minimumCoverageBranchTotal , true );
243
+ ok = checkCoverage ( getLog (), "Package:" , coverage .packages (), MeasuredPackage ::name ,
244
+ minimumCoverageStmtPerPackage , minimumCoverageBranchPerPackage ) && ok ;
245
+ ok = checkCoverage ( getLog (), "File:" , coverage .files (), MeasuredFile ::filename ,
246
+ minimumCoverageStmtPerFile , minimumCoverageBranchPerFile ) && ok ;
191
247
192
248
if ( !ok && failOnMinimumCoverage )
193
249
{
@@ -205,6 +261,17 @@ private static boolean is100( Double d )
205
261
return Math .abs ( 100 - d ) <= 0.00001d ;
206
262
}
207
263
264
+ private static <T extends CoverageMetrics >
265
+ boolean checkCoverage ( Log logger , String metricPrefix ,
266
+ scala .collection .Iterable < T > metrics ,
267
+ Function < T , String > toName ,
268
+ double minStmt , double minBranch )
269
+ {
270
+ return minStmt <= 0 && minBranch <= 0 || checkAll (metrics , cov ->
271
+ checkCoverage (logger , metricPrefix + toName .apply (cov ), cov , minStmt , minBranch , false )
272
+ );
273
+ }
274
+
208
275
private static boolean checkCoverage ( Log logger , String metric , CoverageMetrics metrics ,
209
276
double minStmt , double minBranch , boolean logSuccessInfo )
210
277
{
@@ -261,4 +328,14 @@ private static void logSuccess( Log logger, String message, boolean logSuccessIn
261
328
}
262
329
}
263
330
331
+ private static <T > boolean checkAll ( scala .collection .Iterable <T > iterable , Predicate <T > predicate )
332
+ {
333
+ boolean ok = true ;
334
+ for ( T elem : CollectionConverters .asJava ( iterable ) )
335
+ {
336
+ ok = predicate .test ( elem ) && ok ;
337
+ }
338
+ return ok ;
339
+ }
340
+
264
341
}
0 commit comments