just-test-node 1.5.0 → 2.0.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/Discover.d.ts +25 -0
- package/lib/Discover.js +4 -0
- package/lib/OptionsDefinitions.d.ts +16 -0
- package/lib/OptionsDefinitions.js +61 -0
- package/lib/StackTrace.d.ts +1 -0
- package/lib/StackTrace.js +44 -0
- package/lib/Suite.d.ts +46 -0
- package/lib/Suite.js +113 -0
- package/lib/SuiteProvider.d.ts +9 -0
- package/lib/SuiteProvider.js +88 -0
- package/lib/Test.d.ts +10 -6
- package/lib/Test.js +24 -12
- package/lib/TestStage.d.ts +1 -1
- package/lib/TestStage.js +2 -1
- package/lib/code-position-resolution.d.ts +2 -0
- package/lib/code-position-resolution.js +50 -0
- package/lib/examples/dir-suite/@test-suite +0 -0
- package/lib/examples/dir-suite/child-dir-suite/@test-suite +0 -0
- package/lib/{exampleTestFile.test.d.ts → examples/dir-suite/child-dir-suite/childDirTests.test.d.ts} +0 -0
- package/lib/examples/dir-suite/child-dir-suite/childDirTests.test.js +9 -0
- package/lib/examples/dir-suite/inDirSuite.test.d.ts +2 -0
- package/lib/examples/dir-suite/inDirSuite.test.js +9 -0
- package/lib/examples/dir-suite/just-a-folder/inJustAFolderTest.d.ts +2 -0
- package/lib/examples/dir-suite/just-a-folder/inJustAFolderTest.js +9 -0
- package/lib/examples/exampleTestFile.test.d.ts +2 -0
- package/lib/examples/exampleTestFile.test.js +60 -0
- package/lib/help.d.ts +1 -1
- package/lib/help.js +2 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +118 -54
- package/lib/reporters/JsonReporter.d.ts +20 -0
- package/lib/reporters/JsonReporter.js +39 -0
- package/lib/reporters/Reporter.d.ts +4 -0
- package/lib/reporters/Reporter.js +4 -0
- package/lib/reporters/SpecReporter.d.ts +14 -0
- package/lib/reporters/SpecReporter.js +85 -0
- package/lib/reporters/index.d.ts +3 -0
- package/lib/reporters/index.js +17 -0
- package/lib/run-results/SuiteRunResult.d.ts +11 -0
- package/lib/run-results/SuiteRunResult.js +19 -0
- package/lib/run-results/TestRunResult.d.ts +9 -0
- package/lib/run-results/TestRunResult.js +15 -0
- package/lib/run-results/index.d.ts +2 -0
- package/lib/run-results/index.js +16 -0
- package/package.json +69 -64
- package/lib/OptionsDefinition.d.ts +0 -5
- package/lib/OptionsDefinition.js +0 -29
- package/lib/PerformancePolyfill.d.ts +0 -1
- package/lib/PerformancePolyfill.js +0 -16
- package/lib/SpecReporter.d.ts +0 -12
- package/lib/SpecReporter.js +0 -76
- package/lib/TestRunResult.d.ts +0 -9
- package/lib/TestRunResult.js +0 -13
- package/lib/TestSuiteClass.d.ts +0 -28
- package/lib/TestSuiteClass.js +0 -78
- package/lib/exampleTestFile.test.js +0 -59
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
function default_1(suite) {
|
|
4
|
+
suite.test("test in dir-suite", t => {
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
exports.default = default_1;
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV4YW1wbGVzL2Rpci1zdWl0ZS9pbkRpclN1aXRlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxtQkFBeUIsS0FBZ0I7SUFDeEMsS0FBSyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUNwQyxDQUFDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFIRCw0QkFHQyIsImZpbGUiOiJleGFtcGxlcy9kaXItc3VpdGUvaW5EaXJTdWl0ZS50ZXN0LmpzIiwic291cmNlUm9vdCI6Ii4uXFwuLlxcLi5cXHNyYyJ9
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
function default_1(suite) {
|
|
4
|
+
suite.test("test in just-a-folder", t => {
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
exports.default = default_1;
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV4YW1wbGVzL2Rpci1zdWl0ZS9qdXN0LWEtZm9sZGVyL2luSnVzdEFGb2xkZXJUZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsbUJBQXlCLEtBQWdCO0lBQ3hDLEtBQUssQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDeEMsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBSEQsNEJBR0MiLCJmaWxlIjoiZXhhbXBsZXMvZGlyLXN1aXRlL2p1c3QtYS1mb2xkZXIvaW5KdXN0QUZvbGRlclRlc3QuanMiLCJzb3VyY2VSb290IjoiLi5cXC4uXFwuLlxcLi5cXHNyYyJ9
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
function someFunction() { }
|
|
4
|
+
console.log("When discovering, or using json reporter - Should not print in module scope");
|
|
5
|
+
function default_1(suite) {
|
|
6
|
+
suite.describe("Passing suite", suite => {
|
|
7
|
+
console.log("When discovering, or using json reporter - Should not print in describe");
|
|
8
|
+
suite.test("Simple test", t => {
|
|
9
|
+
console.log("When discovering, or using json reporter - Should not print in test");
|
|
10
|
+
});
|
|
11
|
+
suite.test("Async", async (t) => {
|
|
12
|
+
await Promise.resolve("Hi");
|
|
13
|
+
});
|
|
14
|
+
suite.describe(someFunction, suite => {
|
|
15
|
+
suite.test("Test", t => {
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
suite.describe("Failing suite", suite => {
|
|
20
|
+
suite.test("No stage error", t => {
|
|
21
|
+
throw "asdf";
|
|
22
|
+
});
|
|
23
|
+
suite.test("Arrage error", t => {
|
|
24
|
+
t.arrange();
|
|
25
|
+
throw "asdf";
|
|
26
|
+
});
|
|
27
|
+
suite.test("Act error", t => {
|
|
28
|
+
t.act();
|
|
29
|
+
throw "asdf";
|
|
30
|
+
});
|
|
31
|
+
suite.test("Assert error", t => {
|
|
32
|
+
t.assert();
|
|
33
|
+
throw "asdf";
|
|
34
|
+
});
|
|
35
|
+
suite.test("Throw Error", t => {
|
|
36
|
+
t.assert();
|
|
37
|
+
throw new Error("Some error message.");
|
|
38
|
+
});
|
|
39
|
+
suite.test("Throws after await", async (t) => {
|
|
40
|
+
await new Promise(r => setTimeout(r, 1));
|
|
41
|
+
t.assert();
|
|
42
|
+
throw "error";
|
|
43
|
+
});
|
|
44
|
+
suite.test("Timeout reached.", async (t) => {
|
|
45
|
+
t.timeout = 1;
|
|
46
|
+
await new Promise(r => setTimeout(r, 100));
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
suite.describe("Empty suite", suite => {
|
|
50
|
+
});
|
|
51
|
+
suite.describe("Named functions", suite => {
|
|
52
|
+
suite.testFunc(named_function_test_with_spaces);
|
|
53
|
+
suite.testFunc(function inline_function() { });
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
exports.default = default_1;
|
|
57
|
+
function named_function_test_with_spaces(t) {
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV4YW1wbGVzL2V4YW1wbGVUZXN0RmlsZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBUyxZQUFZLEtBQUssQ0FBQztBQUUzQixPQUFPLENBQUMsR0FBRyxDQUFDLDZFQUE2RSxDQUFDLENBQUM7QUFFM0YsbUJBQXlCLEtBQWdCO0lBQ3hDLEtBQUssQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxFQUFFO1FBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMseUVBQXlFLENBQUMsQ0FBQztRQUV2RixLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsQ0FBQyxFQUFDLEVBQUU7WUFDN0IsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUgsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDcEMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsS0FBSyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFFdkMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNoQyxNQUFNLE1BQU0sQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBRUgsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDOUIsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ1osTUFBTSxNQUFNLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUVILEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQzNCLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNSLE1BQU0sTUFBTSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7UUFFSCxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUM5QixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWCxNQUFNLE1BQU0sQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBRUgsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDN0IsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO1FBRUgsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLEVBQUMsQ0FBQyxFQUFDLEVBQUU7WUFDMUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUV6QyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWCxNQUFNLE9BQU8sQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO1FBRUgsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLEVBQUMsQ0FBQyxFQUFDLEVBQUU7WUFDeEMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDZCxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBRTtJQUN0QyxDQUFDLENBQUMsQ0FBQztJQUVILEtBQUssQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDekMsS0FBSyxDQUFDLFFBQVEsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ2hELEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxlQUFlLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBaEVELDRCQWdFQztBQUVELFNBQVMsK0JBQStCLENBQUMsQ0FBYTtBQUN0RCxDQUFDIiwiZmlsZSI6ImV4YW1wbGVzL2V4YW1wbGVUZXN0RmlsZS50ZXN0LmpzIiwic291cmNlUm9vdCI6Ii4uXFwuLlxcc3JjIn0=
|
package/lib/help.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { OptionDefinition } from "./
|
|
1
|
+
import { OptionDefinition } from "./OptionsDefinitions";
|
|
2
2
|
export declare function printHelp(optionsDefinitions: OptionDefinition[]): void;
|
package/lib/help.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.printHelp = void 0;
|
|
3
4
|
function printHelp(optionsDefinitions) {
|
|
4
5
|
console.log();
|
|
5
6
|
console.log("Help");
|
|
@@ -19,4 +20,4 @@ function printHelp(optionsDefinitions) {
|
|
|
19
20
|
}
|
|
20
21
|
exports.printHelp = printHelp;
|
|
21
22
|
|
|
22
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImhlbHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsU0FBZ0IsU0FBUyxDQUFDLGtCQUFzQztJQUMvRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUVkLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUM5QixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVqQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7WUFDWixZQUFZLElBQUksTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDaEM7UUFFRCxZQUFZLElBQUksS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFckMsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFO1lBQ25CLFlBQVksSUFBSSxlQUFlLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNoRDtRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2YsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBckJELDhCQXFCQyIsImZpbGUiOiJoZWxwLmpzIiwic291cmNlUm9vdCI6Ii4uXFxzcmMifQ==
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -1,93 +1,157 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
6
|
+
}) : (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
o[k2] = m[k];
|
|
9
|
+
}));
|
|
10
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
11
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
12
|
+
}) : function(o, v) {
|
|
13
|
+
o["default"] = v;
|
|
14
|
+
});
|
|
15
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
16
|
+
if (mod && mod.__esModule) return mod;
|
|
17
|
+
var result = {};
|
|
18
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
19
|
+
__setModuleDefault(result, mod);
|
|
20
|
+
return result;
|
|
21
|
+
};
|
|
22
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
23
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
24
|
+
};
|
|
3
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
26
|
+
const command_line_args_1 = __importDefault(require("command-line-args"));
|
|
27
|
+
const glob_1 = __importDefault(require("glob"));
|
|
28
|
+
const path_1 = __importDefault(require("path"));
|
|
29
|
+
const OptionsDefinitions_1 = require("./OptionsDefinitions");
|
|
8
30
|
const help_1 = require("./help");
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const PerformancePolyfill_1 = require("./PerformancePolyfill");
|
|
31
|
+
const reporters_1 = require("./reporters");
|
|
32
|
+
const SuiteProvider_1 = require("./SuiteProvider");
|
|
12
33
|
main();
|
|
13
34
|
async function main() {
|
|
14
35
|
try {
|
|
15
|
-
|
|
16
|
-
|
|
36
|
+
const options = (0, command_line_args_1.default)(OptionsDefinitions_1.optionsDefinitions);
|
|
37
|
+
(0, OptionsDefinitions_1.validateOptions)(options);
|
|
17
38
|
if (options.help) {
|
|
18
|
-
help_1.printHelp(
|
|
19
|
-
|
|
39
|
+
(0, help_1.printHelp)(OptionsDefinitions_1.optionsDefinitions);
|
|
40
|
+
return;
|
|
20
41
|
}
|
|
21
|
-
|
|
22
|
-
|
|
42
|
+
const { testFiles, suiteProvider } = await resolveFiles(options);
|
|
43
|
+
if (options.discover) {
|
|
44
|
+
await outputDiscoveredTests(testFiles, suiteProvider);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const passed = await test(testFiles, suiteProvider, options);
|
|
48
|
+
if (!passed)
|
|
49
|
+
process.exit(options.testFailureExitCode);
|
|
23
50
|
}
|
|
24
51
|
catch (error) {
|
|
25
52
|
console.error(error);
|
|
26
|
-
process.exit(1);
|
|
53
|
+
process.exit(-1);
|
|
27
54
|
}
|
|
28
55
|
}
|
|
29
56
|
;
|
|
30
|
-
function
|
|
57
|
+
async function resolveFiles(options) {
|
|
58
|
+
const restoreConsole = disableConsole();
|
|
59
|
+
try {
|
|
60
|
+
const testFilesPromise = getTestFilesAsync(options);
|
|
61
|
+
const directorySuitesPromise = getDirectorySuitesAsync(options);
|
|
62
|
+
const directorySuites = await directorySuitesPromise;
|
|
63
|
+
const suiteProvider = new SuiteProvider_1.SuiteProvider(directorySuites);
|
|
64
|
+
const testFiles = await testFilesPromise;
|
|
65
|
+
return { testFiles, suiteProvider };
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
restoreConsole();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function disableConsole() {
|
|
72
|
+
const original = console;
|
|
73
|
+
console = createFakeConsole();
|
|
74
|
+
return () => { console = original; };
|
|
75
|
+
}
|
|
76
|
+
function createFakeConsole() {
|
|
77
|
+
function nothing() { }
|
|
78
|
+
;
|
|
79
|
+
return { log: nothing, info: nothing, debug: nothing, warn: nothing, error: nothing };
|
|
80
|
+
}
|
|
81
|
+
async function getTestFilesAsync(options) {
|
|
82
|
+
return await globAsync(options.glob);
|
|
83
|
+
}
|
|
84
|
+
async function getDirectorySuitesAsync(options) {
|
|
85
|
+
return await globAsync(options.directorySuitesGlob);
|
|
86
|
+
}
|
|
87
|
+
function globAsync(pattern) {
|
|
31
88
|
return new Promise((resolve, reject) => {
|
|
32
|
-
|
|
33
|
-
if (error)
|
|
89
|
+
(0, glob_1.default)(pattern, (error, matches) => {
|
|
90
|
+
if (error)
|
|
34
91
|
reject(error);
|
|
35
|
-
|
|
36
|
-
else {
|
|
92
|
+
else
|
|
37
93
|
resolve(matches);
|
|
38
|
-
}
|
|
39
94
|
});
|
|
40
95
|
});
|
|
41
96
|
}
|
|
42
|
-
async function test(files, options) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
97
|
+
async function test(files, suiteProvider, options) {
|
|
98
|
+
const reporter = createReporter(options.reporter, console);
|
|
99
|
+
const restoreConsole = options.reporter == "json" ?
|
|
100
|
+
disableConsole() :
|
|
101
|
+
() => { };
|
|
102
|
+
try {
|
|
103
|
+
const suite = await createTree(files, suiteProvider);
|
|
104
|
+
reporter.listenTo(suite);
|
|
105
|
+
if (options.filter)
|
|
106
|
+
suite.treeShake(options.filter.toLowerCase());
|
|
107
|
+
return await suite.run({ debug: options.debug });
|
|
49
108
|
}
|
|
50
|
-
|
|
51
|
-
|
|
109
|
+
finally {
|
|
110
|
+
restoreConsole();
|
|
52
111
|
}
|
|
53
112
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
113
|
+
function createReporter(reporter, console) {
|
|
114
|
+
switch (reporter) {
|
|
115
|
+
case "spec":
|
|
116
|
+
return new reporters_1.SpecReporter(console);
|
|
117
|
+
case "json":
|
|
118
|
+
return new reporters_1.JsonReporter(console);
|
|
59
119
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
// This simple await solves it. The 50 millisec is not special just picked to be safe.
|
|
68
|
-
await new Promise(r => setTimeout(r, 50));
|
|
69
|
-
}
|
|
70
|
-
for (let testFunc of testFileFunctions) {
|
|
71
|
-
testFunc(rootSuite);
|
|
120
|
+
}
|
|
121
|
+
async function createTree(filesPaths, suiteProvider) {
|
|
122
|
+
for (let filePath of filesPaths) {
|
|
123
|
+
const testFuncPromise = getTestFileFunctionAsync(filePath);
|
|
124
|
+
const suite = suiteProvider.getSuiteForTestFile(filePath);
|
|
125
|
+
const testFunc = await testFuncPromise;
|
|
126
|
+
testFunc(suite);
|
|
72
127
|
}
|
|
73
|
-
return
|
|
128
|
+
return suiteProvider.root;
|
|
74
129
|
}
|
|
75
|
-
async function
|
|
130
|
+
async function getTestFileFunctionAsync(file) {
|
|
76
131
|
let testFileFunction;
|
|
77
132
|
try {
|
|
78
|
-
testFileFunction = await Promise.resolve().then(() => require(
|
|
133
|
+
testFileFunction = await Promise.resolve().then(() => __importStar(require(path_1.default.resolve(file))));
|
|
79
134
|
}
|
|
80
135
|
catch (reason) {
|
|
81
|
-
|
|
82
|
-
process.exit(1);
|
|
136
|
+
throw `The file '${file}' matched the tests glob but failed to be imported. reason: ${reason}`;
|
|
83
137
|
}
|
|
84
138
|
if (typeof testFileFunction != "function")
|
|
85
139
|
testFileFunction = testFileFunction.default;
|
|
86
140
|
if (typeof testFileFunction != "function") {
|
|
87
|
-
|
|
88
|
-
process.exit(1);
|
|
141
|
+
throw `The file '${file}' matched the tests glob but did not export a default function.`;
|
|
89
142
|
}
|
|
90
143
|
return testFileFunction;
|
|
91
144
|
}
|
|
145
|
+
async function outputDiscoveredTests(files, suiteProvider) {
|
|
146
|
+
const restoreConsole = disableConsole();
|
|
147
|
+
let suite;
|
|
148
|
+
try {
|
|
149
|
+
suite = await createTree(files, suiteProvider);
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
restoreConsole();
|
|
153
|
+
}
|
|
154
|
+
console.log(JSON.stringify(suite.discover()));
|
|
155
|
+
}
|
|
92
156
|
|
|
93
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
157
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsS0FBSyxNQUFNO1lBQ1YsT0FBTyxJQUFJLHdCQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDbEM7QUFDRixDQUFDO0FBRUQsS0FBSyxVQUFVLFVBQVUsQ0FBQyxVQUFvQixFQUFFLGFBQTRCO0lBQzNFLEtBQUssSUFBSSxRQUFRLElBQUksVUFBVSxFQUFFO1FBQ2hDLE1BQU0sZUFBZSxHQUFHLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNELE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUxRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGVBQWUsQ0FBQztRQUN2QyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDaEI7SUFFRCxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUM7QUFDM0IsQ0FBQztBQUVELEtBQUssVUFBVSx3QkFBd0IsQ0FBQyxJQUFZO0lBQ25ELElBQUksZ0JBQXFCLENBQUM7SUFFMUIsSUFBSTtRQUNILGdCQUFnQixHQUFHLHdEQUFhLGNBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUMsQ0FBQztLQUNwRDtJQUNELE9BQU8sTUFBTSxFQUFFO1FBQ2QsTUFBTSxhQUFhLElBQUksK0RBQStELE1BQU0sRUFBRSxDQUFDO0tBQy9GO0lBRUQsSUFBSSxPQUFPLGdCQUFnQixJQUFJLFVBQVU7UUFDeEMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO0lBRTdDLElBQUksT0FBTyxnQkFBZ0IsSUFBSSxVQUFVLEVBQUU7UUFDMUMsTUFBTSxhQUFhLElBQUksaUVBQWlFLENBQUM7S0FDekY7SUFFRCxPQUFPLGdCQUFnQixDQUFDO0FBQ3pCLENBQUM7QUFFRCxLQUFLLFVBQVUscUJBQXFCLENBQUMsS0FBZSxFQUFFLGFBQTRCO0lBQ2pGLE1BQU0sY0FBYyxHQUFHLGNBQWMsRUFBRSxDQUFDO0lBQ3hDLElBQUksS0FBWSxDQUFDO0lBRWpCLElBQUk7UUFDSCxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0tBQy9DO1lBQ087UUFDUCxjQUFjLEVBQUUsQ0FBQztLQUNqQjtJQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9DLENBQUMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi5cXHNyYyJ9
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { SuiteResultStatus } from "../run-results/SuiteRunResult";
|
|
2
|
+
import { TestRunResult } from "../run-results/TestRunResult";
|
|
3
|
+
import { Suite } from "../Suite";
|
|
4
|
+
import { Reporter } from "./Reporter";
|
|
5
|
+
export interface SuiteResult {
|
|
6
|
+
title: string;
|
|
7
|
+
elapsed: number;
|
|
8
|
+
status: SuiteResultStatus;
|
|
9
|
+
tests: TestRunResult[];
|
|
10
|
+
childrenSuites: SuiteResult[];
|
|
11
|
+
}
|
|
12
|
+
export declare class JsonReporter implements Reporter {
|
|
13
|
+
private output;
|
|
14
|
+
private suiteToResultMap;
|
|
15
|
+
private testToResultMap;
|
|
16
|
+
constructor(output: Console);
|
|
17
|
+
listenTo(rootSuite: Suite): void;
|
|
18
|
+
private outputResultsFor;
|
|
19
|
+
private getResultOfSuite;
|
|
20
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.JsonReporter = void 0;
|
|
4
|
+
class JsonReporter {
|
|
5
|
+
constructor(output) {
|
|
6
|
+
this.output = output;
|
|
7
|
+
this.suiteToResultMap = new Map();
|
|
8
|
+
this.testToResultMap = new Map();
|
|
9
|
+
}
|
|
10
|
+
listenTo(rootSuite) {
|
|
11
|
+
rootSuite.onSuiteEnded.add(args => {
|
|
12
|
+
this.suiteToResultMap.set(args.suite, args.result);
|
|
13
|
+
if (args.suite == rootSuite)
|
|
14
|
+
this.outputResultsFor(rootSuite);
|
|
15
|
+
});
|
|
16
|
+
rootSuite.onTestEnded.add(args => {
|
|
17
|
+
this.testToResultMap.set(args.test, args.result);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
outputResultsFor(suite) {
|
|
21
|
+
const result = this.getResultOfSuite(suite);
|
|
22
|
+
this.output.log(JSON.stringify(result));
|
|
23
|
+
}
|
|
24
|
+
getResultOfSuite(suite) {
|
|
25
|
+
const runResult = this.suiteToResultMap.get(suite);
|
|
26
|
+
const tests = suite.tests.map(e => this.testToResultMap.get(e));
|
|
27
|
+
const childrenSuites = suite.childrenSuites.map(e => this.getResultOfSuite(e));
|
|
28
|
+
return {
|
|
29
|
+
title: suite.title,
|
|
30
|
+
status: runResult.status,
|
|
31
|
+
elapsed: runResult.elapsed,
|
|
32
|
+
tests: tests,
|
|
33
|
+
childrenSuites: childrenSuites
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.JsonReporter = JsonReporter;
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlcG9ydGVycy9Kc29uUmVwb3J0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBY0EsTUFBYSxZQUFZO0lBSXhCLFlBQW9CLE1BQWU7UUFBZixXQUFNLEdBQU4sTUFBTSxDQUFTO1FBSDNCLHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO1FBQ3BELG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFHekQsQ0FBQztJQUVNLFFBQVEsQ0FBQyxTQUFnQjtRQUMvQixTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNqQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRW5ELElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxTQUFTO2dCQUMxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxLQUFZO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU1QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEtBQVk7UUFDcEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUUsQ0FBQztRQUNwRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBRSxDQUFDLENBQUM7UUFDakUsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQztRQUVoRixPQUFPO1lBQ04sS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1lBQ2xCLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTTtZQUN4QixPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU87WUFDMUIsS0FBSyxFQUFFLEtBQUs7WUFDWixjQUFjLEVBQUUsY0FBYztTQUM5QixDQUFDO0lBQ0gsQ0FBQztDQUNEO0FBdkNELG9DQXVDQyIsImZpbGUiOiJyZXBvcnRlcnMvSnNvblJlcG9ydGVyLmpzIiwic291cmNlUm9vdCI6Ii4uXFwuLlxcc3JjIn0=
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
|
|
4
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlcG9ydGVycy9SZXBvcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwiZmlsZSI6InJlcG9ydGVycy9SZXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIuLlxcLi5cXHNyYyJ9
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Suite } from "../Suite";
|
|
2
|
+
import { Reporter } from "./Reporter";
|
|
3
|
+
export declare class SpecReporter implements Reporter {
|
|
4
|
+
private output;
|
|
5
|
+
private symbols;
|
|
6
|
+
private indentation;
|
|
7
|
+
private passedCount;
|
|
8
|
+
private errors;
|
|
9
|
+
constructor(output: Console);
|
|
10
|
+
listenTo(rootSuite: Suite): void;
|
|
11
|
+
private onEnd;
|
|
12
|
+
private formatElapsed;
|
|
13
|
+
private getTestFullTitle;
|
|
14
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SpecReporter = void 0;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
class SpecReporter {
|
|
9
|
+
constructor(output) {
|
|
10
|
+
this.output = output;
|
|
11
|
+
this.symbols = {
|
|
12
|
+
ok: '✓',
|
|
13
|
+
err: '✖',
|
|
14
|
+
};
|
|
15
|
+
this.indentation = " ";
|
|
16
|
+
this.passedCount = 0;
|
|
17
|
+
this.errors = [];
|
|
18
|
+
}
|
|
19
|
+
listenTo(rootSuite) {
|
|
20
|
+
let indent = "";
|
|
21
|
+
rootSuite.onSuiteStarted.add(suite => {
|
|
22
|
+
if (suite == rootSuite)
|
|
23
|
+
return;
|
|
24
|
+
this.output.log();
|
|
25
|
+
this.output.info(indent + suite.title);
|
|
26
|
+
indent += this.indentation;
|
|
27
|
+
});
|
|
28
|
+
rootSuite.onSuiteEnded.add(args => {
|
|
29
|
+
indent = indent.substr(0, indent.length - this.indentation.length);
|
|
30
|
+
if (args.suite == rootSuite) {
|
|
31
|
+
this.onEnd();
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
rootSuite.onTestEnded.add(args => {
|
|
35
|
+
const result = args.result;
|
|
36
|
+
const elapsed = this.formatElapsed(result.elapsed);
|
|
37
|
+
if (result.passed) {
|
|
38
|
+
this.passedCount++;
|
|
39
|
+
this.output.log(chalk_1.default.green(`${indent}${this.symbols.ok} ${result.title}`) + ` ${elapsed}`);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
this.errors.push(args);
|
|
43
|
+
this.output.log(chalk_1.default.red(`${indent}${this.symbols.err} ${result.title}`) + ` ${elapsed}`);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
onEnd() {
|
|
48
|
+
if (!this.errors)
|
|
49
|
+
return;
|
|
50
|
+
this.output.log();
|
|
51
|
+
this.output.log("Failed tests:");
|
|
52
|
+
this.output.log("=============");
|
|
53
|
+
for (let failedTestRun of this.errors) {
|
|
54
|
+
this.output.log();
|
|
55
|
+
let title = this.getTestFullTitle(failedTestRun.test);
|
|
56
|
+
this.output.log(title);
|
|
57
|
+
this.output.log(this.indentation + chalk_1.default.red(`${failedTestRun.result.reason}`));
|
|
58
|
+
}
|
|
59
|
+
this.output.log();
|
|
60
|
+
this.output.log(chalk_1.default.green(`${this.passedCount} passing`));
|
|
61
|
+
if (this.errors.length > 0) {
|
|
62
|
+
this.output.log(chalk_1.default.red(`${this.errors.length} failing`));
|
|
63
|
+
}
|
|
64
|
+
this.output.log();
|
|
65
|
+
}
|
|
66
|
+
formatElapsed(elapsed) {
|
|
67
|
+
return chalk_1.default.grey(`(${elapsed.toFixed(2)}ms)`);
|
|
68
|
+
}
|
|
69
|
+
getTestFullTitle(test) {
|
|
70
|
+
let titles = [test.title];
|
|
71
|
+
let parent = test.parent;
|
|
72
|
+
while (parent && parent.title) {
|
|
73
|
+
titles.push(parent.title);
|
|
74
|
+
parent = parent.parent;
|
|
75
|
+
}
|
|
76
|
+
let title = titles.pop();
|
|
77
|
+
while (titles.length > 0) {
|
|
78
|
+
title += " -> " + titles.pop();
|
|
79
|
+
}
|
|
80
|
+
return title;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.SpecReporter = SpecReporter;
|
|
84
|
+
|
|
85
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlcG9ydGVycy9TcGVjUmVwb3J0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0RBQTBCO0FBSzFCLE1BQWEsWUFBWTtJQVd4QixZQUFvQixNQUFlO1FBQWYsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQVYzQixZQUFPLEdBQUc7WUFDakIsRUFBRSxFQUFFLEdBQUc7WUFDUCxHQUFHLEVBQUUsR0FBRztTQUNSLENBQUM7UUFFTSxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVuQixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNoQixXQUFNLEdBQW9CLEVBQUUsQ0FBQztJQUdyQyxDQUFDO0lBRU0sUUFBUSxDQUFDLFNBQWdCO1FBQy9CLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUVoQixTQUFTLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNwQyxJQUFJLEtBQUssSUFBSSxTQUFTO2dCQUNyQixPQUFPO1lBRVIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDakMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVuRSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksU0FBUyxFQUFFO2dCQUM1QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDYjtRQUNGLENBQUMsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVuRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUM7YUFDNUY7aUJBQ0k7Z0JBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDO2FBQzNGO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSztRQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUNmLE9BQU87UUFFUixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRWpDLEtBQUssSUFBSSxhQUFhLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBRWxCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDaEY7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBRTVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQztTQUM1RDtRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVPLGFBQWEsQ0FBQyxPQUFlO1FBQ3BDLE9BQU8sZUFBSyxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFVO1FBQ2xDLElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTFCLElBQUksTUFBTSxHQUFzQixJQUFJLENBQUMsTUFBTSxDQUFDO1FBRTVDLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDdkI7UUFFRCxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFHLENBQUM7UUFFMUIsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6QixLQUFLLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUMvQjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2QsQ0FBQztDQUNEO0FBbEdELG9DQWtHQyIsImZpbGUiOiJyZXBvcnRlcnMvU3BlY1JlcG9ydGVyLmpzIiwic291cmNlUm9vdCI6Ii4uXFwuLlxcc3JjIn0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
__exportStar(require("./Reporter"), exports);
|
|
14
|
+
__exportStar(require("./SpecReporter"), exports);
|
|
15
|
+
__exportStar(require("./JsonReporter"), exports);
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlcG9ydGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBMkI7QUFDM0IsaURBQStCO0FBQy9CLGlEQUErQiIsImZpbGUiOiJyZXBvcnRlcnMvaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi5cXC4uXFxzcmMifQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare enum SuiteResultStatus {
|
|
2
|
+
Passed = "passed",
|
|
3
|
+
Failed = "failed",
|
|
4
|
+
Partial = "partial"
|
|
5
|
+
}
|
|
6
|
+
export declare class SuiteRunResult {
|
|
7
|
+
title: string;
|
|
8
|
+
elapsed: number;
|
|
9
|
+
status: SuiteResultStatus;
|
|
10
|
+
constructor(title: string, elapsed: number, status: SuiteResultStatus);
|
|
11
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SuiteRunResult = exports.SuiteResultStatus = void 0;
|
|
4
|
+
var SuiteResultStatus;
|
|
5
|
+
(function (SuiteResultStatus) {
|
|
6
|
+
SuiteResultStatus["Passed"] = "passed";
|
|
7
|
+
SuiteResultStatus["Failed"] = "failed";
|
|
8
|
+
SuiteResultStatus["Partial"] = "partial";
|
|
9
|
+
})(SuiteResultStatus = exports.SuiteResultStatus || (exports.SuiteResultStatus = {}));
|
|
10
|
+
class SuiteRunResult {
|
|
11
|
+
constructor(title, elapsed, status) {
|
|
12
|
+
this.title = title;
|
|
13
|
+
this.elapsed = elapsed;
|
|
14
|
+
this.status = status;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.SuiteRunResult = SuiteRunResult;
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJ1bi1yZXN1bHRzL1N1aXRlUnVuUmVzdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLElBQVksaUJBSVg7QUFKRCxXQUFZLGlCQUFpQjtJQUM1QixzQ0FBaUIsQ0FBQTtJQUNqQixzQ0FBaUIsQ0FBQTtJQUNqQix3Q0FBbUIsQ0FBQTtBQUNwQixDQUFDLEVBSlcsaUJBQWlCLEdBQWpCLHlCQUFpQixLQUFqQix5QkFBaUIsUUFJNUI7QUFFRCxNQUFhLGNBQWM7SUFDMUIsWUFBbUIsS0FBYSxFQUFTLE9BQWUsRUFBUyxNQUF5QjtRQUF2RSxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQVMsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUFTLFdBQU0sR0FBTixNQUFNLENBQW1CO0lBQzFGLENBQUM7Q0FDRDtBQUhELHdDQUdDIiwiZmlsZSI6InJ1bi1yZXN1bHRzL1N1aXRlUnVuUmVzdWx0LmpzIiwic291cmNlUm9vdCI6Ii4uXFwuLlxcc3JjIn0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { TestStage } from "../TestStage";
|
|
2
|
+
export declare class TestRunResult {
|
|
3
|
+
title: string;
|
|
4
|
+
elapsed: number;
|
|
5
|
+
stage: TestStage;
|
|
6
|
+
passed: boolean;
|
|
7
|
+
reason?: string | undefined;
|
|
8
|
+
constructor(title: string, elapsed: number, stage: TestStage, passed: boolean, reason?: string | undefined);
|
|
9
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TestRunResult = void 0;
|
|
4
|
+
class TestRunResult {
|
|
5
|
+
constructor(title, elapsed, stage, passed, reason) {
|
|
6
|
+
this.title = title;
|
|
7
|
+
this.elapsed = elapsed;
|
|
8
|
+
this.stage = stage;
|
|
9
|
+
this.passed = passed;
|
|
10
|
+
this.reason = reason;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.TestRunResult = TestRunResult;
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJ1bi1yZXN1bHRzL1Rlc3RSdW5SZXN1bHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsTUFBYSxhQUFhO0lBQ3pCLFlBQW1CLEtBQWEsRUFBUyxPQUFlLEVBQVMsS0FBZ0IsRUFBUyxNQUFlLEVBQVMsTUFBZTtRQUE5RyxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQVMsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUFTLFVBQUssR0FBTCxLQUFLLENBQVc7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFTO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBUztJQUNqSSxDQUFDO0NBQ0Q7QUFIRCxzQ0FHQyIsImZpbGUiOiJydW4tcmVzdWx0cy9UZXN0UnVuUmVzdWx0LmpzIiwic291cmNlUm9vdCI6Ii4uXFwuLlxcc3JjIn0=
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
__exportStar(require("./SuiteRunResult"), exports);
|
|
14
|
+
__exportStar(require("./TestRunResult"), exports);
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJ1bi1yZXN1bHRzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLG1EQUFpQztBQUNqQyxrREFBZ0MiLCJmaWxlIjoicnVuLXJlc3VsdHMvaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi5cXC4uXFxzcmMifQ==
|