all files / core/ test-runner.js

89.8% Statements 88/98
84.62% Branches 22/26
87.5% Functions 21/24
89.58% Lines 86/96
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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147  58× 58× 58× 58× 58× 58× 58× 1438× 1438× 3174×   1438×   58× 1438× 1438× 388×     1050×       58× 58× 319× 1505× 1505× 302× 58× 17× 17×     41× 41× 41×     1438× 1438× 1438× 1438× 57× 57×     1438× 1438×                                 1438× 622×       816×     816× 816× 816× 816×       816× 816×   816×   622× 622× 622×   1438× 1438× 1438× 57× 57×       15× 12×         83× 83× 83× 83×   83× 15×   68×     67× 41×       388× 388× 388× 82×     306×        
"use strict";
var _namespace_1 = require("./errors/_namespace");
require("reflect-metadata");
var TestRunner = (function () {
    function TestRunner() {
        var _this = this;
        this._currentTestId = 0;
        this._currentTestFixtureIndex = 0;
        this._currentTestIndex = 0;
        this._currentTestCaseIndex = 0;
        this._testsFailed = false;
        this._getTestDescription = function (test, testCaseArguments) {
            var testDescription = _this._currentTestId + " - " + test.description;
            if (testCaseArguments !== undefined) {
                testDescription += " [ " + testCaseArguments.map(function (x) { return JSON.stringify(x) || "undefined"; }).join(", ") + " ]";
            }
            return testDescription;
        };
        this._runNextTestCase = function () {
            _this._currentTestCaseIndex++;
            if (!_this._currentTestSet.testFixtures[_this._currentTestFixtureIndex].tests[_this._currentTestIndex].testCases[_this._currentTestCaseIndex]) {
                _this._runNextTest();
            }
            else {
                _this._runTest(_this._currentTestSet.testFixtures[_this._currentTestFixtureIndex], _this._currentTestSet.testFixtures[_this._currentTestFixtureIndex].tests[_this._currentTestIndex], _this._currentTestSet.testFixtures[_this._currentTestFixtureIndex].tests[_this._currentTestIndex].testCases[_this._currentTestCaseIndex].arguments);
            }
        };
    }
    TestRunner.prototype.run = function (testSet) {
        this._currentTestSet = testSet;
        var totalTestCount = this._currentTestSet.testFixtures
            .filter(function (x) { return x.tests.length > 0; })
            .map(function (x) { return x.tests.map(function (y) { return y.testCases.length; })
            .reduce(function (a, b) { return a + b; }, 0); })
            .reduce(function (a, b) { return a + b; }, 0);
        if (totalTestCount === 0) {
            process.stderr.write("no tests to run");
            process.exit(1);
        }
        else {
            process.stdout.write("TAP version 13\n");
            process.stdout.write("1.." + totalTestCount + "\n");
            this._runTest(this._currentTestSet.testFixtures[this._currentTestFixtureIndex], this._currentTestSet.testFixtures[this._currentTestFixtureIndex].tests[this._currentTestIndex], this._currentTestSet.testFixtures[this._currentTestFixtureIndex].tests[this._currentTestIndex].testCases[this._currentTestCaseIndex].arguments);
        }
    };
    TestRunner.prototype._runTest = function (testFixture, test, testCaseArguments) {
        var _this = this;
        this._currentTestId++;
        var setupFunctions = Reflect.getMetadata("alsatian:setup", testFixture.fixture);
        if (setupFunctions) {
            setupFunctions.forEach(function (setupFunction) {
                testFixture.fixture[setupFunction].call(testFixture.fixture);
            });
        }
        try {
            Iif (test.isAsync) {
                var timeout_1 = false;
                var promise = testFixture.fixture[test.key].apply(testFixture.fixture, testCaseArguments);
                promise.then(function () {
                    if (!timeout_1) {
                        _this._notifySuccess(test, testCaseArguments);
                    }
                })
                    .catch(function (error) {
                    _this._handleError(error, test, testCaseArguments);
                });
                var timeoutCheck = setTimeout(function () {
                    timeout_1 = true;
                    _this._handleError(new Error("The test exceeded the given timeout."), test, testCaseArguments);
                }, 500);
            }
            else {
                testFixture.fixture[test.key].apply(testFixture, testCaseArguments);
                this._notifySuccess(test, testCaseArguments);
            }
        }
        catch (error) {
            this._handleError(error, test, testCaseArguments);
        }
    };
    TestRunner.prototype._handleError = function (error, test, testCaseArguments) {
        this._teardown();
        this._testsFailed = true;
        process.stdout.write("not ok " + this._getTestDescription(test, testCaseArguments) + "\n");
        Iif (error instanceof _namespace_1.MatchError) {
            process.stdout.write(" ---\n   message: \"" + error.message + "\"\n   severity: fail\n   data:\n     got: " + JSON.stringify(error.actualValue) + "\n     expect: " + JSON.stringify(error.expectedValue) + "\n ...\n");
        }
        else {
            console.log(error);
            process.stdout.write("# Unknown Error\n");
        }
        this._runNextTestCase();
    };
    TestRunner.prototype._notifySuccess = function (test, testCaseArguments) {
        this._teardown();
        process.stdout.write("ok " + this._getTestDescription(test, testCaseArguments) + "\n");
        this._runNextTestCase();
    };
    TestRunner.prototype._teardown = function () {
        var testFixture = this._currentTestSet.testFixtures[this._currentTestFixtureIndex];
        var teardownFunctions = Reflect.getMetadata("alsatian:teardown", testFixture.fixture);
        if (teardownFunctions) {
            teardownFunctions.forEach(function (teardownFunction) {
                testFixture.fixture[teardownFunction].call(testFixture.fixture);
            });
        }
    };
    TestRunner.prototype._exit = function () {
        if (this._testsFailed) {
            process.exit(1);
        }
        else {
            process.exit(0);
        }
    };
    TestRunner.prototype._runNextTestFixture = function () {
        var _this = this;
        this._currentTestFixtureIndex++;
        this._currentTestIndex = 0;
        this._currentTestCaseIndex = 0;
        // no more test fixtures
        if (!this._currentTestSet.testFixtures[this._currentTestFixtureIndex]) {
            this._exit();
        }
        else if (!this._currentTestSet.testFixtures[this._currentTestFixtureIndex].tests[this._currentTestIndex]) {
            this._runNextTestFixture();
        }
        else {
            setTimeout(function () {
                _this._runTest(_this._currentTestSet.testFixtures[_this._currentTestFixtureIndex], _this._currentTestSet.testFixtures[_this._currentTestFixtureIndex].tests[_this._currentTestIndex], _this._currentTestSet.testFixtures[_this._currentTestFixtureIndex].tests[_this._currentTestIndex].testCases[_this._currentTestCaseIndex].arguments);
            });
        }
    };
    TestRunner.prototype._runNextTest = function () {
        this._currentTestIndex++;
        this._currentTestCaseIndex = 0;
        if (!this._currentTestSet.testFixtures[this._currentTestFixtureIndex].tests[this._currentTestIndex]) {
            this._runNextTestFixture();
        }
        else {
            this._runTest(this._currentTestSet.testFixtures[this._currentTestFixtureIndex], this._currentTestSet.testFixtures[this._currentTestFixtureIndex].tests[this._currentTestIndex], this._currentTestSet.testFixtures[this._currentTestFixtureIndex].tests[this._currentTestIndex].testCases[this._currentTestCaseIndex].arguments);
        }
    };
    return TestRunner;
}());
exports.TestRunner = TestRunner;
//# sourceMappingURL=test-runner.js.map