114 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			114 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | /* | ||
|  |  Copyright 2015, Yahoo Inc. | ||
|  |  Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. | ||
|  |  */ | ||
|  | 'use strict'; | ||
|  | 
 | ||
|  | const { FileCoverage } = require('istanbul-lib-coverage').classes; | ||
|  | 
 | ||
|  | function locString(loc) { | ||
|  |     return [ | ||
|  |         loc.start.line, | ||
|  |         loc.start.column, | ||
|  |         loc.end.line, | ||
|  |         loc.end.column | ||
|  |     ].join(':'); | ||
|  | } | ||
|  | 
 | ||
|  | class MappedCoverage extends FileCoverage { | ||
|  |     constructor(pathOrObj) { | ||
|  |         super(pathOrObj); | ||
|  | 
 | ||
|  |         this.meta = { | ||
|  |             last: { | ||
|  |                 s: 0, | ||
|  |                 f: 0, | ||
|  |                 b: 0 | ||
|  |             }, | ||
|  |             seen: {} | ||
|  |         }; | ||
|  |     } | ||
|  | 
 | ||
|  |     addStatement(loc, hits) { | ||
|  |         const key = 's:' + locString(loc); | ||
|  |         const { meta } = this; | ||
|  |         let index = meta.seen[key]; | ||
|  | 
 | ||
|  |         if (index === undefined) { | ||
|  |             index = meta.last.s; | ||
|  |             meta.last.s += 1; | ||
|  |             meta.seen[key] = index; | ||
|  |             this.statementMap[index] = this.cloneLocation(loc); | ||
|  |         } | ||
|  | 
 | ||
|  |         this.s[index] = this.s[index] || 0; | ||
|  |         this.s[index] += hits; | ||
|  |         return index; | ||
|  |     } | ||
|  | 
 | ||
|  |     addFunction(name, decl, loc, hits) { | ||
|  |         const key = 'f:' + locString(decl); | ||
|  |         const { meta } = this; | ||
|  |         let index = meta.seen[key]; | ||
|  | 
 | ||
|  |         if (index === undefined) { | ||
|  |             index = meta.last.f; | ||
|  |             meta.last.f += 1; | ||
|  |             meta.seen[key] = index; | ||
|  |             name = name || `(unknown_${index})`; | ||
|  |             this.fnMap[index] = { | ||
|  |                 name, | ||
|  |                 decl: this.cloneLocation(decl), | ||
|  |                 loc: this.cloneLocation(loc) | ||
|  |             }; | ||
|  |         } | ||
|  | 
 | ||
|  |         this.f[index] = this.f[index] || 0; | ||
|  |         this.f[index] += hits; | ||
|  |         return index; | ||
|  |     } | ||
|  | 
 | ||
|  |     addBranch(type, loc, branchLocations, hits) { | ||
|  |         const key = ['b', ...branchLocations.map(l => locString(l))].join(':'); | ||
|  |         const { meta } = this; | ||
|  |         let index = meta.seen[key]; | ||
|  |         if (index === undefined) { | ||
|  |             index = meta.last.b; | ||
|  |             meta.last.b += 1; | ||
|  |             meta.seen[key] = index; | ||
|  |             this.branchMap[index] = { | ||
|  |                 loc, | ||
|  |                 type, | ||
|  |                 locations: branchLocations.map(l => this.cloneLocation(l)) | ||
|  |             }; | ||
|  |         } | ||
|  | 
 | ||
|  |         if (!this.b[index]) { | ||
|  |             this.b[index] = branchLocations.map(() => 0); | ||
|  |         } | ||
|  | 
 | ||
|  |         hits.forEach((hit, i) => { | ||
|  |             this.b[index][i] += hit; | ||
|  |         }); | ||
|  |         return index; | ||
|  |     } | ||
|  | 
 | ||
|  |     /* Returns a clone of the location object with only the attributes of interest */ | ||
|  |     cloneLocation(loc) { | ||
|  |         return { | ||
|  |             start: { | ||
|  |                 line: loc.start.line, | ||
|  |                 column: loc.start.column | ||
|  |             }, | ||
|  |             end: { | ||
|  |                 line: loc.end.line, | ||
|  |                 column: loc.end.column | ||
|  |             } | ||
|  |         }; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = { | ||
|  |     MappedCoverage | ||
|  | }; |