All files / tap-bark/src tap-bark.ts

100% Statements 45/45
100% Branches 16/16
100% Functions 12/12
100% Lines 40/40
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 84 85 86 87        1x 1x 1x       1x 1x   1x       52x     52x 52x   52x   52x     1x 4x 4x   4x 4x   4x     1x 3x     52x       52x 52x 52x   52x 52x 7x     52x 22x   22x 11x       52x 153x 153x     52x 28x             28x   28x 2x   26x       1x  
import { IOutput } from "./output/output.i";
import { IResults } from "./results.i";
import { IStream } from "./stream/stream.i";
import { IOutputProvider } from "./output-provider/output-provider.i";
import { Stream } from "./stream/stream";
import { Output } from "./output/output";
import { OutputProvider } from "./output-provider/output-provider";
 
import { Assertion as TAPAssertion, Results as TAPResults } from "./external/tap-parser";
 
const parser = require("tap-parser");
const duplexer = require("duplexer");
 
export class TapBark {
 
    private output: IOutput;
    private parser: NodeJS.EventEmitter;
    private _planEnd = 0;
 
    constructor (output: IOutput, parser: NodeJS.EventEmitter) {
        this.output = output;
        this.parser = parser;
 
        this.setupListeners();
 
        this.output.setup();
    }
 
    public static create(): any {
        const stream = new Stream();
        const input = parser();
 
        const outputProvider = new OutputProvider();
        const output = new Output(stream, outputProvider);
 
        return new TapBark(output, input);
    }
 
    public getPipeable(): any {
        return duplexer(this.parser, this.output.getStream().getUnderlyingStream());
    }
 
    private FIXTURE_REGEXP: RegExp = /# FIXTURE (.*)/g;
 
    // these three functions are needed because tap-parser doesn't always emit a value
    // see tap-parser#40 on github
    private getPassCount = (results: TAPResults) => (results.pass || 0);
    private getFailCount = (results: TAPResults) => (results.fail || (results.failures || []).length);
    private getIgnoreCount = (results: TAPResults) => (results.skip || 0) + (results.todo || 0);
 
    private setupListeners(): void {
      this.parser.on("plan", (plan: any) => {
         this._planEnd = plan.end;
      });
 
        this.parser.on("comment", (comment: string) => {
            let fixtureParse = this.FIXTURE_REGEXP.exec(comment);
 
            if (fixtureParse !== null) {
                this.output.setFixtureName(fixtureParse[1]);
            }
        });
 
        this.parser.on("assert", (assertion: TAPAssertion) => {
            this.output.setTestName(assertion.name);
            this.output.setProgress(assertion.id, this._planEnd);
        });
 
        this.parser.on("complete", (results: TAPResults) => {
            let _results: IResults = {
                pass: this.getPassCount(results),
                fail: this.getFailCount(results),
                ignore: this.getIgnoreCount(results),
                failures: results.failures || []
            };
 
            this.output.outputResults(_results);
 
            if (results.ok) {
                process.exit(0);
            } else {
                process.exit(1);
            }
        });
    }
}