just-test-node 1.4.4 → 2.0.0-alpha.2

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.
Files changed (57) hide show
  1. package/README.md +1 -1
  2. package/lib/Discover.d.ts +25 -0
  3. package/lib/Discover.js +4 -0
  4. package/lib/OptionsDefinitions.d.ts +16 -0
  5. package/lib/OptionsDefinitions.js +61 -0
  6. package/lib/StackTrace.d.ts +1 -0
  7. package/lib/StackTrace.js +44 -0
  8. package/lib/Suite.d.ts +46 -0
  9. package/lib/Suite.js +113 -0
  10. package/lib/SuiteProvider.d.ts +9 -0
  11. package/lib/SuiteProvider.js +88 -0
  12. package/lib/Test.d.ts +13 -6
  13. package/lib/Test.js +41 -39
  14. package/lib/TestStage.d.ts +1 -1
  15. package/lib/TestStage.js +3 -0
  16. package/lib/code-position-resolution.d.ts +2 -0
  17. package/lib/code-position-resolution.js +50 -0
  18. package/lib/examples/dir-suite/@test-suite +0 -0
  19. package/lib/examples/dir-suite/child-dir-suite/@test-suite +0 -0
  20. package/lib/{exampleTestFile.test.d.ts → examples/dir-suite/child-dir-suite/childDirTests.test.d.ts} +0 -0
  21. package/lib/examples/dir-suite/child-dir-suite/childDirTests.test.js +9 -0
  22. package/lib/examples/dir-suite/inDirSuite.test.d.ts +2 -0
  23. package/lib/examples/dir-suite/inDirSuite.test.js +9 -0
  24. package/lib/examples/dir-suite/just-a-folder/inJustAFolderTest.d.ts +2 -0
  25. package/lib/examples/dir-suite/just-a-folder/inJustAFolderTest.js +9 -0
  26. package/lib/examples/exampleTestFile.test.d.ts +2 -0
  27. package/lib/examples/exampleTestFile.test.js +60 -0
  28. package/lib/help.d.ts +1 -1
  29. package/lib/help.js +3 -0
  30. package/lib/index.d.ts +1 -0
  31. package/lib/index.js +135 -69
  32. package/lib/reporters/JsonReporter.d.ts +20 -0
  33. package/lib/reporters/JsonReporter.js +39 -0
  34. package/lib/reporters/Reporter.d.ts +4 -0
  35. package/lib/reporters/Reporter.js +4 -0
  36. package/lib/reporters/SpecReporter.d.ts +14 -0
  37. package/lib/reporters/SpecReporter.js +90 -0
  38. package/lib/reporters/index.d.ts +3 -0
  39. package/lib/reporters/index.js +17 -0
  40. package/lib/run-results/SuiteRunResult.d.ts +11 -0
  41. package/lib/run-results/SuiteRunResult.js +19 -0
  42. package/lib/run-results/TestRunResult.d.ts +9 -0
  43. package/lib/run-results/TestRunResult.js +15 -0
  44. package/lib/run-results/index.d.ts +2 -0
  45. package/lib/run-results/index.js +16 -0
  46. package/package.json +69 -63
  47. package/lib/OptionsDefinition.d.ts +0 -4
  48. package/lib/OptionsDefinition.js +0 -2
  49. package/lib/PerformancePolyfill.d.ts +0 -1
  50. package/lib/PerformancePolyfill.js +0 -14
  51. package/lib/SpecReporter.d.ts +0 -12
  52. package/lib/SpecReporter.js +0 -74
  53. package/lib/TestRunResult.d.ts +0 -9
  54. package/lib/TestRunResult.js +0 -11
  55. package/lib/TestSuiteClass.d.ts +0 -27
  56. package/lib/TestSuiteClass.js +0 -85
  57. package/lib/exampleTestFile.test.js +0 -65
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFunctionCodeRange = void 0;
4
+ const StackTrace_1 = require("./StackTrace");
5
+ function getFunctionCodeRange(func, definingFunc) {
6
+ const { filePath, callPosition } = getCallerPosition(definingFunc);
7
+ const endLocation = isInline(func) ?
8
+ getInlineFuncEndPosition(func, callPosition) :
9
+ callPosition;
10
+ const location = { filePath, start: callPosition, end: endLocation };
11
+ return location;
12
+ }
13
+ exports.getFunctionCodeRange = getFunctionCodeRange;
14
+ function getCallerPosition(func) {
15
+ const callSiteText = (0, StackTrace_1.getCallerLocationText)(func);
16
+ const separator2 = callSiteText.lastIndexOf(":");
17
+ const separator1 = callSiteText.lastIndexOf(":", separator2 - 1);
18
+ const filePath = callSiteText.slice(0, separator1);
19
+ const rowText = callSiteText.slice(separator1 + 1, separator2);
20
+ const columnText = callSiteText.slice(separator2 + 1);
21
+ const line = parseInt(rowText);
22
+ const column = parseInt(columnText);
23
+ return { filePath, callPosition: { line: line - 1, column: column - 1 } };
24
+ }
25
+ function getInlineFuncEndPosition(func, start) {
26
+ const position = getFuncRelativeEndPosition(func);
27
+ const endLine = start.line + position.line;
28
+ const endColumn = position.line == 0 ?
29
+ start.column :
30
+ position.column;
31
+ return { line: endLine, column: endColumn };
32
+ }
33
+ function getFuncRelativeEndPosition(func) {
34
+ let line = 0;
35
+ let column = 0;
36
+ const text = func.toString();
37
+ for (let i = 0; i < text.length; i++) {
38
+ if (text[i] == "\n") {
39
+ line++;
40
+ column = 0;
41
+ }
42
+ column++;
43
+ }
44
+ return { line, column };
45
+ }
46
+ function isInline(func) {
47
+ return func.name.length == 0;
48
+ }
49
+
50
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvZGUtcG9zaXRpb24tcmVzb2x1dGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2Q0FBcUQ7QUFFckQsU0FBZ0Isb0JBQW9CLENBQUMsSUFBYyxFQUFFLFlBQXNCO0lBQzFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLEdBQUcsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFbkUsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbkMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDOUMsWUFBWSxDQUFDO0lBRWQsTUFBTSxRQUFRLEdBQXNCLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBRXhGLE9BQU8sUUFBUSxDQUFDO0FBQ2pCLENBQUM7QUFWRCxvREFVQztBQUVELFNBQVMsaUJBQWlCLENBQUMsSUFBYztJQUN4QyxNQUFNLFlBQVksR0FBRyxJQUFBLGtDQUFxQixFQUFDLElBQUksQ0FBQyxDQUFDO0lBRWpELE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRWpFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMvRCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUV0RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0IsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXBDLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO0FBQzNFLENBQUM7QUFFRCxTQUFTLHdCQUF3QixDQUFDLElBQWMsRUFBRSxLQUFtQjtJQUNwRSxNQUFNLFFBQVEsR0FBRywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVsRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFFM0MsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDZCxRQUFRLENBQUMsTUFBTSxDQUFDO0lBRWpCLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUM3QyxDQUFDO0FBRUQsU0FBUywwQkFBMEIsQ0FBQyxJQUFjO0lBQ2pELElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVmLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUU3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNyQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDcEIsSUFBSSxFQUFFLENBQUM7WUFDUCxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ1g7UUFFRCxNQUFNLEVBQUUsQ0FBQztLQUNUO0lBRUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUN6QixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsSUFBYztJQUMvQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztBQUM5QixDQUFDIiwiZmlsZSI6ImNvZGUtcG9zaXRpb24tcmVzb2x1dGlvbi5qcyIsInNvdXJjZVJvb3QiOiIuLlxcc3JjIn0=
File without changes
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function default_1(suite) {
4
+ suite.test("test in child-dir-suite", t => {
5
+ });
6
+ }
7
+ exports.default = default_1;
8
+
9
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV4YW1wbGVzL2Rpci1zdWl0ZS9jaGlsZC1kaXItc3VpdGUvY2hpbGREaXJUZXN0cy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsbUJBQXlCLEtBQWdCO0lBQ3hDLEtBQUssQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDMUMsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBSEQsNEJBR0MiLCJmaWxlIjoiZXhhbXBsZXMvZGlyLXN1aXRlL2NoaWxkLWRpci1zdWl0ZS9jaGlsZERpclRlc3RzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiLi5cXC4uXFwuLlxcLi5cXHNyYyJ9
@@ -0,0 +1,2 @@
1
+ import { TestSuite } from "just-test-api";
2
+ export default function (suite: TestSuite): void;
@@ -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,2 @@
1
+ import { TestSuite } from "just-test-api";
2
+ export default function (suite: TestSuite): void;
@@ -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,2 @@
1
+ import { TestSuite } from "just-test-api";
2
+ export default function (suite: TestSuite): void;
@@ -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 "./OptionsDefinition";
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");
@@ -18,3 +19,5 @@ function printHelp(optionsDefinitions) {
18
19
  });
19
20
  }
20
21
  exports.printHelp = printHelp;
22
+
23
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImhlbHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsU0FBZ0IsU0FBUyxDQUFDLGtCQUFzQztJQUMvRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUVkLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUM5QixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVqQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7WUFDWixZQUFZLElBQUksTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDaEM7UUFFRCxZQUFZLElBQUksS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFckMsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFO1lBQ25CLFlBQVksSUFBSSxlQUFlLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNoRDtRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2YsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBckJELDhCQXFCQyIsImZpbGUiOiJoZWxwLmpzIiwic291cmNlUm9vdCI6Ii4uXFxzcmMifQ==
package/lib/index.d.ts CHANGED
@@ -1 +1,2 @@
1
+ #!/usr/bin/env node
1
2
  export {};
package/lib/index.js CHANGED
@@ -1,91 +1,157 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
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 };
10
24
  };
11
25
  Object.defineProperty(exports, "__esModule", { value: true });
12
- const args = require("command-line-args");
13
- const glob = require("glob");
14
- const path = require("path");
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");
15
30
  const help_1 = require("./help");
16
- const TestSuiteClass_1 = require("./TestSuiteClass");
17
- const SpecReporter_1 = require("./SpecReporter");
18
- const PerformancePolyfill_1 = require("./PerformancePolyfill");
19
- PerformancePolyfill_1.polyfillPerformance();
20
- const optionsDefinitions = [
21
- {
22
- name: 'glob', alias: 'g',
23
- type: String,
24
- defaultValue: "./!(node_modules)/**/*.test.js",
25
- description: "Test files glob pattern."
26
- },
27
- {
28
- name: "filter", alias: "f",
29
- type: String,
30
- defaultOption: true,
31
- defaultValue: "",
32
- description: "Filters tests."
33
- },
34
- {
35
- name: 'help', alias: 'h',
36
- type: Boolean,
37
- description: "Show help."
38
- },
39
- ];
40
- const options = args(optionsDefinitions);
41
- if (options.help) {
42
- help_1.printHelp(optionsDefinitions);
43
- process.exit();
44
- }
45
- glob(options.glob, (error, matches) => {
46
- if (error) {
31
+ const reporters_1 = require("./reporters");
32
+ const SuiteProvider_1 = require("./SuiteProvider");
33
+ main();
34
+ async function main() {
35
+ try {
36
+ const options = (0, command_line_args_1.default)(OptionsDefinitions_1.optionsDefinitions);
37
+ (0, OptionsDefinitions_1.validateOptions)(options);
38
+ if (options.help) {
39
+ (0, help_1.printHelp)(OptionsDefinitions_1.optionsDefinitions);
40
+ return;
41
+ }
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);
50
+ }
51
+ catch (error) {
47
52
  console.error(error);
48
- process.exit(1);
53
+ process.exit(-1);
49
54
  }
50
- test(matches).catch(reason => {
51
- console.error("An unexpected error has occured:", reason);
55
+ }
56
+ ;
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) {
88
+ return new Promise((resolve, reject) => {
89
+ (0, glob_1.default)(pattern, (error, matches) => {
90
+ if (error)
91
+ reject(error);
92
+ else
93
+ resolve(matches);
94
+ });
52
95
  });
53
- });
54
- function test(files) {
55
- return __awaiter(this, void 0, void 0, function* () {
56
- let suite = createRootSuite(files);
57
- let reporter = new SpecReporter_1.SpecReporter(console);
96
+ }
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);
58
104
  reporter.listenTo(suite);
59
- let passed = yield suite.run({ filter: options.filter });
60
- if (passed) {
61
- process.exit(0);
62
- }
63
- else {
64
- process.exit(1);
65
- }
66
- });
105
+ if (options.filter)
106
+ suite.treeShake(options.filter.toLowerCase());
107
+ return await suite.run({ debug: options.debug });
108
+ }
109
+ finally {
110
+ restoreConsole();
111
+ }
112
+ }
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);
119
+ }
67
120
  }
68
- function createRootSuite(files) {
69
- let rootSuite = new TestSuiteClass_1.TestSuiteClass();
70
- for (let file of files) {
71
- processTestFile(rootSuite, file);
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 rootSuite;
128
+ return suiteProvider.root;
74
129
  }
75
- function processTestFile(suite, file) {
130
+ async function getTestFileFunctionAsync(file) {
76
131
  let testFileFunction;
77
132
  try {
78
- testFileFunction = require(path.resolve(file));
133
+ testFileFunction = await Promise.resolve().then(() => __importStar(require(path_1.default.resolve(file))));
79
134
  }
80
135
  catch (reason) {
81
- console.error(`The file '${file}' matched the tests glob but failed to be imported. reason:`, reason);
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
- console.error(`The file '${file}' matched the tests glob but did not export a default function.`);
88
- process.exit(1);
141
+ throw `The file '${file}' matched the tests glob but did not export a default function.`;
142
+ }
143
+ return testFileFunction;
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();
89
153
  }
90
- testFileFunction(suite);
154
+ console.log(JSON.stringify(suite.discover()));
91
155
  }
156
+
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
+ import { Suite } from "../Suite";
2
+ export interface Reporter {
3
+ listenTo(suite: Suite): void;
4
+ }
@@ -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,90 @@
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
+ let isError = failedTestRun.result.reason instanceof Error;
58
+ let message = isError ?
59
+ failedTestRun.result.reason.message :
60
+ JSON.stringify(failedTestRun.result.reason);
61
+ this.output.log(this.indentation + chalk_1.default.red(`${message}`));
62
+ isError && this.output.log(this.indentation + `${failedTestRun.result.reason.stack}`);
63
+ }
64
+ this.output.log();
65
+ this.output.log(chalk_1.default.green(`${this.passedCount} passing`));
66
+ if (this.errors.length > 0) {
67
+ this.output.log(chalk_1.default.red(`${this.errors.length} failing`));
68
+ }
69
+ this.output.log();
70
+ }
71
+ formatElapsed(elapsed) {
72
+ return chalk_1.default.grey(`(${elapsed.toFixed(2)}ms)`);
73
+ }
74
+ getTestFullTitle(test) {
75
+ let titles = [test.title];
76
+ let parent = test.parent;
77
+ while (parent && parent.title) {
78
+ titles.push(parent.title);
79
+ parent = parent.parent;
80
+ }
81
+ let title = titles.pop();
82
+ while (titles.length > 0) {
83
+ title += " -> " + titles.pop();
84
+ }
85
+ return title;
86
+ }
87
+ }
88
+ exports.SpecReporter = SpecReporter;
89
+
90
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlcG9ydGVycy9TcGVjUmVwb3J0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0RBQTBCO0FBSzFCLE1BQWEsWUFBWTtJQVd4QixZQUFvQixNQUFlO1FBQWYsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQVYzQixZQUFPLEdBQUc7WUFDakIsRUFBRSxFQUFFLEdBQUc7WUFDUCxHQUFHLEVBQUUsR0FBRztTQUNSLENBQUM7UUFFTSxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVuQixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNoQixXQUFNLEdBQW9CLEVBQUUsQ0FBQztJQUdyQyxDQUFDO0lBRU0sUUFBUSxDQUFDLFNBQWdCO1FBQy9CLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUVoQixTQUFTLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNwQyxJQUFJLEtBQUssSUFBSSxTQUFTO2dCQUNyQixPQUFPO1lBRVIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDakMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVuRSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksU0FBUyxFQUFFO2dCQUM1QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDYjtRQUNGLENBQUMsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENB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QWEsQ0FBQyxPQUFlO1FBQ3BDLE9BQU8sZUFBSyxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFVO1FBQ2xDLElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTFCLElBQUksTUFBTSxHQUFzQixJQUFJLENBQUMsTUFBTSxDQUFDO1FBRTVDLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDdkI7UUFFRCxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFHLENBQUM7UUFFMUIsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6QixLQUFLLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUMvQjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2QsQ0FBQztDQUNEO0FBeEdELG9DQXdHQyIsImZpbGUiOiJyZXBvcnRlcnMvU3BlY1JlcG9ydGVyLmpzIiwic291cmNlUm9vdCI6Ii4uXFwuLlxcc3JjIn0=
@@ -0,0 +1,3 @@
1
+ export * from "./Reporter";
2
+ export * from "./SpecReporter";
3
+ export * from "./JsonReporter";