@@ -31,6 +31,12 @@ const kIgnoreRegex = /\/\* node:coverage ignore next (?<count>\d+ )?\*\//;
3131const kLineEndingRegex = / \r ? \n $ / u;
3232const kLineSplitRegex = / (?< = \r ? \n ) / u;
3333const kStatusRegex = / \/ \* n o d e : c o v e r a g e (?< status > e n a b l e | d i s a b l e ) \* \/ / ;
34+ const kDefaultMinimumCoverage = {
35+ __proto__ : null ,
36+ line : 0 ,
37+ function : 0 ,
38+ branch : 0 ,
39+ } ;
3440
3541class CoverageLine {
3642 #covered;
@@ -63,10 +69,11 @@ class CoverageLine {
6369}
6470
6571class TestCoverage {
66- constructor ( coverageDirectory , originalCoverageDirectory , workingDirectory ) {
72+ constructor ( coverageDirectory , originalCoverageDirectory , workingDirectory , minimumCoverage ) {
6773 this . coverageDirectory = coverageDirectory ;
6874 this . originalCoverageDirectory = originalCoverageDirectory ;
6975 this . workingDirectory = workingDirectory ;
76+ this . minimumCoverage = minimumCoverage || kDefaultMinimumCoverage ;
7077 }
7178
7279 summary ( ) {
@@ -260,6 +267,24 @@ class TestCoverage {
260267 ) ;
261268 coverageSummary . files . sort ( sortCoverageFiles ) ;
262269
270+ coverageSummary . minimumCoverage = {
271+ __proto__ : null ,
272+ line : {
273+ status : doesCoveragePass ( this . minimumCoverage . line , coverageSummary . totals . coveredLinePercent ) ,
274+ expected : this . minimumCoverage . line ,
275+ actual : coverageSummary . totals . coveredLinePercent ,
276+ } ,
277+ function : {
278+ status : doesCoveragePass ( this . minimumCoverage . function , coverageSummary . totals . coveredFunctionPercent ) ,
279+ expected :this . minimumCoverage . function ,
280+ actual : coverageSummary . totals . coveredFunctionPercent
281+ } ,
282+ branch : {
283+ status : doesCoveragePass ( this . minimumCoverage . branch , coverageSummary . totals . coveredBranchPercent ) ,
284+ expected : this . minimumCoverage . branch ,
285+ actual : coverageSummary . totals . coveredBranchPercent
286+ } ,
287+ } ;
263288 return coverageSummary ;
264289 }
265290
@@ -299,7 +324,7 @@ function sortCoverageFiles(a, b) {
299324 return StringPrototypeLocaleCompare ( a . path , b . path ) ;
300325}
301326
302- function setupCoverage ( ) {
327+ function setupCoverage ( minimumCoverage = null ) {
303328 let originalCoverageDirectory = process . env . NODE_V8_COVERAGE ;
304329 const cwd = process . cwd ( ) ;
305330
@@ -323,7 +348,7 @@ function setupCoverage() {
323348 // child processes.
324349 process . env . NODE_V8_COVERAGE = coverageDirectory ;
325350
326- return new TestCoverage ( coverageDirectory , originalCoverageDirectory , cwd ) ;
351+ return new TestCoverage ( coverageDirectory , originalCoverageDirectory , cwd , minimumCoverage ) ;
327352}
328353
329354function mapRangeToLines ( range , lines ) {
@@ -538,4 +563,8 @@ function doesRangeContainOtherRange(range, otherRange) {
538563 range . endOffset >= otherRange . endOffset ;
539564}
540565
566+ function doesCoveragePass ( compareValue , actualValue ) {
567+ return compareValue ? actualValue >= compareValue : true ;
568+ }
569+
541570module . exports = { setupCoverage, TestCoverage } ;
0 commit comments