Skip to content

Commit da0973e

Browse files
bryanforbesjason0x43
authored andcommitted
Refactor reporters
* Coverage -> TextCoverage, BaseCoverage -> Coverage * Ensure other coverage reporters pass the right options to istanbul Fixes #814
1 parent f1f6021 commit da0973e

File tree

14 files changed

+9468
-5958
lines changed

14 files changed

+9468
-5958
lines changed

docs/api.json

Lines changed: 9278 additions & 5941 deletions
Large diffs are not rendered by default.

intern.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
"_tests/tests/unit/lib/reporters/Runner.js",
6161
"_tests/tests/unit/lib/reporters/Simple.js",
6262
"_tests/tests/unit/lib/reporters/TeamCity.js",
63+
"_tests/tests/unit/lib/reporters/TextCoverage.js",
6364
"_tests/tests/unit/tasks/intern.js"
6465
],
6566
"plugins": [

src/lib/reporters/Cobertura.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,31 @@
1-
import Coverage, { ReportType } from './Coverage';
1+
import Coverage, { ReportType, CoverageProperties } from './Coverage';
2+
import Node from '../executors/Node';
3+
4+
export default class Cobertura extends Coverage
5+
implements CoberturaCoverageProperties {
26

3-
export default class Cobertura extends Coverage {
47
readonly reportType: ReportType = 'cobertura';
8+
projectRoot: string;
9+
10+
constructor(executor: Node, options: CoberturaCoverageOptions = {}) {
11+
super(executor, options);
12+
13+
if (options.projectRoot) {
14+
this.projectRoot = options.projectRoot;
15+
}
16+
}
17+
18+
getReporterOptions(): { [key: string]: any; } {
19+
const options = super.getReporterOptions();
20+
21+
options.projectRoot = this.projectRoot;
22+
23+
return options;
24+
}
25+
}
26+
27+
export interface CoberturaCoverageProperties extends CoverageProperties {
28+
projectRoot?: string;
529
}
30+
31+
export type CoberturaCoverageOptions = Partial<CoberturaCoverageProperties>;

src/lib/reporters/Coverage.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ const eventHandler = createEventHandler<Events>();
1414

1515
export default abstract class Coverage extends Reporter
1616
implements CoverageProperties {
17-
readonly reportType: ReportType = 'text';
17+
18+
abstract readonly reportType: ReportType;
1819

1920
executor: Node;
2021
filename: string;
22+
directory: string;
2123
watermarks: Watermarks;
2224

2325
constructor(executor: Node, options: CoverageOptions = {}) {
@@ -26,11 +28,20 @@ export default abstract class Coverage extends Reporter
2628
if (options.filename) {
2729
this.filename = options.filename;
2830
}
31+
if (options.directory) {
32+
this.directory = options.directory;
33+
}
2934
if (options.watermarks) {
3035
this.watermarks = options.watermarks;
3136
}
3237
}
3338

39+
getReporterOptions(): { [key: string]: any; } {
40+
return {
41+
file: this.filename
42+
};
43+
}
44+
3445
createCoverageReport(
3546
type: ReportType,
3647
data: CoverageMapData | CoverageMap
@@ -46,11 +57,12 @@ export default abstract class Coverage extends Reporter
4657
const transformed = this.executor.sourceMapStore.transformCoverage(map);
4758

4859
const context = createContext({
60+
dir: this.directory,
4961
sourceFinder: transformed.sourceFinder,
5062
watermarks: this.watermarks
5163
});
5264
const tree = summarizers.pkg(transformed.map);
53-
const report = create(type, { file: this.filename });
65+
const report = create(type, this.getReporterOptions());
5466
tree.visit(report, context);
5567
}
5668

@@ -67,6 +79,9 @@ export interface CoverageProperties extends ReporterProperties {
6779
/** A filename to write coverage data to */
6880
filename?: string;
6981

82+
/** A direcotry to write coverage data to */
83+
directory?: string;
84+
7085
/** Watermarks used to check coverage */
7186
watermarks?: Watermarks;
7287
}

src/lib/reporters/HtmlCoverage.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,31 @@
1-
import Coverage, { ReportType } from './Coverage';
1+
import Coverage, { ReportType, CoverageProperties } from './Coverage';
2+
import Node from '../executors/Node';
3+
4+
export default class HtmlCoverage extends Coverage
5+
implements HtmlCoverageProperties {
26

3-
export default class HtmlCoverage extends Coverage {
47
readonly reportType: ReportType = 'html';
8+
verbose: boolean;
9+
10+
constructor(executor: Node, options: HtmlCoverageOptions = {}) {
11+
super(executor, options);
12+
13+
if ('verbose' in options) {
14+
this.verbose = options.verbose!;
15+
}
16+
}
17+
18+
getReporterOptions(): { [key: string]: any; } {
19+
const options = super.getReporterOptions();
20+
21+
options.verbose = this.verbose;
22+
23+
return options;
24+
}
25+
}
26+
27+
export interface HtmlCoverageProperties extends CoverageProperties {
28+
verbose: boolean;
529
}
30+
31+
export type HtmlCoverageOptions = Partial<HtmlCoverageProperties>;

src/lib/reporters/Pretty.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Suite from '../Suite';
1010
import Test from '../Test';
1111
import RemoteSuite from '../RemoteSuite';
1212
import { createEventHandler } from './Reporter';
13-
import Coverage, { CoverageProperties } from './Coverage';
13+
import TextCoverage, { TextCoverageProperties } from './TextCoverage';
1414
import { CoverageMessage, DeprecationMessage } from '../executors/Executor';
1515
import { Events, TunnelMessage } from '../executors/Node';
1616

@@ -19,7 +19,7 @@ const eventHandler = createEventHandler<Events>();
1919
/**
2020
* Handles presentation of runner results to the user
2121
*/
22-
export default class Pretty extends Coverage implements PrettyProperties {
22+
export default class Pretty extends TextCoverage implements PrettyProperties {
2323
colorReplacement: { [key: string]: string };
2424
dimensions: any;
2525
titleWidth: number;
@@ -437,7 +437,7 @@ export default class Pretty extends Coverage implements PrettyProperties {
437437
}
438438
}
439439

440-
export interface PrettyProperties extends CoverageProperties {
440+
export interface PrettyProperties extends TextCoverageProperties {
441441
colorReplacement: { [key: string]: string };
442442
dimensions: any;
443443
maxProgressBarWidth: number;

src/lib/reporters/Runner.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Writable } from 'stream';
55
import Test from '../Test';
66
import Suite from '../Suite';
77
import { createEventHandler } from './Reporter';
8-
import Coverage, { CoverageProperties } from './Coverage';
8+
import TextCoverage, { TextCoverageProperties } from './TextCoverage';
99
import Server from '../Server';
1010
import { CoverageMessage, DeprecationMessage } from '../executors/Executor';
1111
import Node, { Events, TunnelMessage } from '../executors/Node';
@@ -15,7 +15,7 @@ export type Charm = charm.CharmInstance;
1515

1616
const eventHandler = createEventHandler<Events>();
1717

18-
export default class Runner extends Coverage implements RunnerProperties {
18+
export default class Runner extends TextCoverage implements RunnerProperties {
1919
sessions: {
2020
[sessionId: string]: {
2121
coverage?: CoverageMap;
@@ -318,7 +318,7 @@ export default class Runner extends Coverage implements RunnerProperties {
318318
}
319319
}
320320

321-
export interface RunnerProperties extends CoverageProperties {
321+
export interface RunnerProperties extends TextCoverageProperties {
322322
hidePassed: boolean;
323323
hideSkipped: boolean;
324324
}

src/lib/reporters/Simple.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import Suite from '../Suite';
22
import Test from '../Test';
3-
import Coverage from './Coverage';
3+
import TextCoverage from './TextCoverage';
44
import { eventHandler } from './Reporter';
55

66
/**
77
* The Simple reporter outputs to the terminal console.
88
*/
9-
export default class Simple extends Coverage {
9+
export default class Simple extends TextCoverage {
1010
@eventHandler()
1111
error(error: Error) {
1212
this.console.error(this.formatError(error));

src/lib/reporters/TextCoverage.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import Coverage, { ReportType, CoverageProperties } from './Coverage';
2+
import Node from '../executors/Node';
3+
4+
export default class TextCoverage extends Coverage
5+
implements TextCoverageProperties {
6+
7+
readonly reportType: ReportType = 'text';
8+
maxColumns: number;
9+
10+
constructor(executor: Node, options: TextCoverageOptions = {}) {
11+
super(executor, options);
12+
13+
if (options.maxColumns) {
14+
this.maxColumns = options.maxColumns;
15+
}
16+
}
17+
18+
getReporterOptions(): { [key: string]: any; } {
19+
const options = super.getReporterOptions();
20+
21+
options.maxColumns = this.maxColumns;
22+
23+
return options;
24+
}
25+
}
26+
27+
export interface TextCoverageProperties extends CoverageProperties {
28+
/** Maximum number of columns */
29+
maxColumns: number;
30+
}
31+
32+
export type TextCoverageOptions = Partial<TextCoverageProperties>;

tests/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"./unit/lib/reporters/Runner.ts",
4040
"./unit/lib/reporters/Simple.ts",
4141
"./unit/lib/reporters/TeamCity.ts",
42+
"./unit/lib/reporters/TextCoverage.ts",
4243
"./unit/lib/*.ts",
4344
"./unit/loaders/*.ts",
4445
"./unit/tasks/*.ts",

0 commit comments

Comments
 (0)