@@ -11,132 +11,123 @@ const fs = require('fs');
1111const path = require ( 'path' ) ;
1212
1313/**
14- * Represents a DA record
15- *
16- * @param {number } lineNumber
17- * @param {number } hits
18- *
19- * @constructor
14+ * Represents a "DA" entry, which records the hit count of
15+ * a line of code.
2016 */
21- function DA ( lineNumber , hits ) {
22- this . lineNumber = lineNumber ;
23- this . hits = hits ;
24- }
17+ class DA {
18+ /**
19+ * @param {number } lineNumber
20+ * @param {number } hits
21+ */
22+ constructor ( lineNumber , hits ) {
23+ this . lineNumber = lineNumber ;
24+ this . hits = hits ;
25+ }
2526
26- /**
27- * Generates a DA string
28- *
29- * @returns {string }
30- */
31- DA . prototype . toString = function ( ) {
32- return 'DA:' + this . lineNumber + ',' + this . hits + '\n' ;
33- } ;
27+ /**
28+ * @param {number } hits
29+ */
30+ addHits ( hits ) {
31+ this . hits += hits ;
32+ }
3433
35- /**
36- * Represents a BRDA record
37- *
38- * @param {number } lineNumber
39- * @param {number } blockNumber
40- * @param {number } branchNumber
41- * @param {number } hits
42- *
43- * @constructor
44- */
45- function BRDA ( lineNumber , blockNumber , branchNumber , hits ) {
46- this . lineNumber = lineNumber ;
47- this . blockNumber = blockNumber ;
48- this . branchNumber = branchNumber ;
49- this . hits = hits ;
34+ toString ( ) {
35+ return `DA:${ this . lineNumber } ,${ this . hits } \n` ;
36+ }
5037}
5138
5239/**
53- * Generates a BRDA string
54- *
55- * @returns {string }
40+ * Represents a BRDA entry, which records the hit count
41+ * of a logical branch in code.
5642 */
57- BRDA . prototype . toString = function ( ) {
58- let str = 'BRDA:' ;
59- str += [ this . lineNumber , this . blockNumber , this . branchNumber , this . hits ] . join (
60- ','
61- ) ;
62- str += '\n' ;
63-
64- return str ;
65- } ;
43+ class BRDA {
44+ /**
45+ * @param {number } lineNumber
46+ * @param {number } blockNumber
47+ * @param {number } branchNumber
48+ * @param {number } hits
49+ */
50+ constructor ( lineNumber , blockNumber , branchNumber , hits ) {
51+ this . lineNumber = lineNumber ;
52+ this . blockNumber = blockNumber ;
53+ this . branchNumber = branchNumber ;
54+ this . hits = hits ;
55+ }
6656
67- /**
68- * Represents a coverage file, and it's DA/BRDA records
69- *
70- * @param {string } filename
71- *
72- * @constructor
73- */
74- function CoverageFile ( filename ) {
75- this . filename = filename ;
76- this . DARecords = [ ] ;
77- this . BRDARecords = [ ] ;
57+ toString ( ) {
58+ const { lineNumber, blockNumber, branchNumber, hits } = this ;
59+ return `BRDA:${ lineNumber } ,${ blockNumber } ,${ branchNumber } ,${ hits } \n` ;
60+ }
7861}
7962
8063/**
81- * Generates a coverage report for a file.
82- *
83- * @returns {string }
64+ * Represents a coverage file, and it's DA/BRDA records.
8465 */
85- CoverageFile . prototype . toString = function ( ) {
86- const header = 'SF:' + this . filename + '\n' ;
87- const footer = 'end_of_record\n' ;
66+ class CoverageFile {
67+ /**
68+ * @param {string } filename
69+ */
70+ constructor ( filename ) {
71+ this . filename = filename ;
72+ this . DARecords = [ ] ;
73+ this . BRDARecords = [ ] ;
74+ }
8875
89- let body = this . DARecords . map ( function ( daRecord ) {
90- return daRecord . toString ( ) ;
91- } ) . join ( '' ) ;
76+ /**
77+ * Finds and returns an existing DA entry via its line number.
78+ *
79+ * @param {number } lineNumber
80+ *
81+ * @returns {DA|undefined }
82+ */
83+ findDA ( lineNumber ) {
84+ return this . DARecords . find ( ( record ) => record . lineNumber === lineNumber ) ;
85+ }
9286
93- body += this . BRDARecords . map ( function ( brdaRecord ) {
94- return brdaRecord . toString ( ) ;
95- } ) . join ( '' ) ;
87+ /**
88+ * Creates a new DA record, or adds the hit count to an existing
89+ * record if available.
90+ *
91+ * @param {number } lineNumber
92+ * @param {number } hits
93+ */
94+ addDA ( lineNumber , hits ) {
95+ const existingRecord = this . findDA ( lineNumber ) ;
96+
97+ if ( existingRecord ) {
98+ existingRecord . addHits ( hits ) ;
99+ return ;
100+ }
96101
97- return header + body + footer ;
98- } ;
102+ this . DARecords . push ( new DA ( lineNumber , hits ) ) ;
103+ }
99104
100- /**
101- * Find an existing DA record
102- *
103- * @param {DA[] } source
104- * @param {number } lineNumber
105- *
106- * @returns {DA|null }
107- */
108- function findDA ( source , lineNumber ) {
109- for ( let i = 0 ; i < source . length ; i ++ ) {
110- const da = source [ i ] ;
111- if ( da . lineNumber === lineNumber ) {
112- return da ;
113- }
105+ /**
106+ * Finds and returns an existing BRDA entry.
107+ *
108+ * @param {number } lineNumber
109+ * @param {number } blockNumber
110+ * @param {number } branchNumber
111+ *
112+ * @returns {BRDA|undefined }
113+ */
114+ findBRDA ( lineNumber , blockNumber , branchNumber ) {
115+ return this . BRDARecords . find (
116+ ( record ) =>
117+ record . lineNumber === lineNumber &&
118+ record . blockNumber === blockNumber &&
119+ record . branchNumber === branchNumber
120+ ) ;
114121 }
115- return null ;
116- }
117122
118- /**
119- * Find an existing BRDA record
120- *
121- * @param {BRDA[] } source
122- * @param {number } blockNumber
123- * @param {number } branchNumber
124- * @param {number } lineNumber
125- *
126- * @returns {BRDA|null }
127- */
128- function findBRDA ( source , blockNumber , branchNumber , lineNumber ) {
129- for ( let i = 0 ; i < source . length ; i ++ ) {
130- const brda = source [ i ] ;
131- if (
132- brda . blockNumber === blockNumber &&
133- brda . branchNumber === branchNumber &&
134- brda . lineNumber === lineNumber
135- ) {
136- return brda ;
137- }
123+ toString ( ) {
124+ return (
125+ `SF:${ this . filename } \n` +
126+ this . DARecords . map ( ( record ) => record . toString ( ) ) . join ( '' ) +
127+ this . BRDARecords . map ( ( record ) => record . toString ( ) ) . join ( '' ) +
128+ 'end_of_record\n'
129+ ) ;
138130 }
139- return null ;
140131}
141132
142133/**
@@ -236,13 +227,7 @@ function parseDA(currentCoverageFile, prefixSplit) {
236227 const lineNumber = parseInt ( numberSplit [ 0 ] , 10 ) ;
237228 const hits = parseInt ( numberSplit [ 1 ] , 10 ) ;
238229
239- const existingDA = findDA ( currentCoverageFile . DARecords , lineNumber ) ;
240- if ( existingDA ) {
241- existingDA . hits += hits ;
242- return ;
243- }
244-
245- currentCoverageFile . DARecords . push ( new DA ( lineNumber , hits ) ) ;
230+ currentCoverageFile . addDA ( lineNumber , hits ) ;
246231}
247232
248233/**
@@ -257,11 +242,10 @@ function parseBRDA(currentCoverageFile, prefixSplit) {
257242 const blockNumber = parseInt ( numberSplit [ 1 ] , 10 ) ;
258243 const branchNumber = parseInt ( numberSplit [ 2 ] , 10 ) ;
259244
260- const existingBRDA = findBRDA (
261- currentCoverageFile . BRDARecords ,
245+ const existingBRDA = currentCoverageFile . findBRDA (
246+ lineNumber ,
262247 blockNumber ,
263- branchNumber ,
264- lineNumber
248+ branchNumber
265249 ) ;
266250
267251 // Special case, hits might be a '-'. This means that the code block
@@ -370,7 +354,7 @@ module.exports = function (config) {
370354 }
371355 const fileContentStr = fs . readFileSync ( filePath , {
372356 encoding : 'utf8' ,
373- flag : 'r'
357+ flag : 'r' ,
374358 } ) ;
375359 coverageFiles = processFile (
376360 path . dirname ( filePath ) ,
@@ -383,7 +367,7 @@ module.exports = function (config) {
383367 function flush ( ) {
384368 fs . writeFileSync ( 'lcov.info' , Buffer . from ( createRecords ( coverageFiles ) ) , {
385369 encoding : 'utf-8' ,
386- flag : 'w+'
370+ flag : 'w+' ,
387371 } ) ;
388372 this . push ( 'lcov.info' ) ;
389373 this . emit ( 'end' ) ;
0 commit comments