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