2020import java .io .File ;
2121import java .util .Arrays ;
2222import java .util .List ;
23+ import java .util .function .Function ;
24+ import java .util .function .Predicate ;
2325
2426import org .apache .maven .plugin .AbstractMojo ;
2527import org .apache .maven .plugin .MojoFailureException ;
3638import scoverage .domain .Coverage ;
3739import scoverage .domain .CoverageMetrics ;
3840import scoverage .domain .DoubleFormat ;
41+ import scoverage .domain .MeasuredFile ;
42+ import scoverage .domain .MeasuredPackage ;
3943import scoverage .reporter .IOUtils ;
4044import scoverage .serialize .Serializer ;
4145
@@ -96,6 +100,54 @@ public class SCoverageCheckMojo
96100 @ Parameter ( property = "scoverage.minimumCoverageBranchTotal" , defaultValue = "0" )
97101 private Double minimumCoverageBranchTotal ;
98102
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+
99151 /**
100152 * Fail the build if minimum coverage was not reached.
101153 * <br>
@@ -188,6 +240,10 @@ public void execute() throws MojoFailureException
188240
189241 boolean ok = checkCoverage ( getLog (), "Total" , coverage ,
190242 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 ;
191247
192248 if ( !ok && failOnMinimumCoverage )
193249 {
@@ -205,6 +261,17 @@ private static boolean is100( Double d )
205261 return Math .abs ( 100 - d ) <= 0.00001d ;
206262 }
207263
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+
208275 private static boolean checkCoverage ( Log logger , String metric , CoverageMetrics metrics ,
209276 double minStmt , double minBranch , boolean logSuccessInfo )
210277 {
@@ -261,4 +328,14 @@ private static void logSuccess( Log logger, String message, boolean logSuccessIn
261328 }
262329 }
263330
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+
264341}
0 commit comments