-
Notifications
You must be signed in to change notification settings - Fork 88
/
indicators.ts
83 lines (72 loc) · 2.81 KB
/
indicators.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
"use strict";
import {configStore} from "./config";
import {LcovParseInterface} from "./wrappers/lcov-parse";
import {VscodeInterface} from "./wrappers/vscode";
import {Range} from "vscode";
import {Detail} from "lcov-parse";
export interface indicators {
render(lines: Array<Detail>): Promise<string>;
extract(lcovFile: string, file: string): Promise<Array<Detail>>;
}
export class Indicators implements indicators{
private parse: LcovParseInterface;
private vscode: VscodeInterface;
private configStore: configStore;
constructor(
parse: LcovParseInterface,
vscode: VscodeInterface,
configStore: configStore
) {
this.parse = parse;
this.vscode = vscode;
this.configStore = configStore;
}
public render(lines: Detail[]): Promise<string> {
return new Promise<string>((resolve, reject) => {
let renderLines = [];
lines.forEach((detail) => {
if(detail.hit > 0) {
renderLines.push(new Range(detail.line - 1, 0, detail.line - 1, 0));
}
});
this.vscode.setDecorations(this.configStore.coverageDecorationType, renderLines);
this.vscode.setDecorations(this.configStore.gutterDecorationType, renderLines);
return resolve();
});
}
public extract(lcovFile: string, file: string): Promise<Array<Detail>> {
return new Promise<Array<Detail>>((resolve, reject) => {
this.parse.source(lcovFile, (err, data) => {
if(err) return reject(err);
let section = data.find((section) => {
return this.compareFilePaths(section.file, file);
});
if(!section) return reject(new Error("No coverage for file!"));
return resolve(section.lines.details);
});
});
}
private compareFilePaths(lcovFile: string, file: string): boolean {
if(this.configStore.altSfCompare) {
//consider windows and linux file paths
const sourceFile = lcovFile.split(/[\\\/]/).reverse();
const openFile = file.split(/[\\\/]/).reverse();
const folderName = this.vscode.getRootPath().split(/[\\\/]/).reverse()[0];
let match = true;
let index = 0;
//work backwards from the file folder leaf to folder node
do {
if(sourceFile[index] === openFile[index]) {
index++;
} else {
match = false;
break;
}
} while(folderName !== openFile[index]);
return match;
} else {
//prevent hazardous casing mishaps
return lcovFile.toLocaleLowerCase() === file.toLocaleLowerCase();
}
}
}