just-test-node 1.5.0 → 2.0.0-alpha.0

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 (44) hide show
  1. package/lib/Discover.d.ts +25 -0
  2. package/lib/Discover.js +4 -0
  3. package/lib/OptionsDefinitions.d.ts +15 -0
  4. package/lib/OptionsDefinitions.js +55 -0
  5. package/lib/StackTrace.d.ts +1 -0
  6. package/lib/StackTrace.js +44 -0
  7. package/lib/Suite.d.ts +45 -0
  8. package/lib/Suite.js +115 -0
  9. package/lib/Test.d.ts +9 -6
  10. package/lib/Test.js +16 -12
  11. package/lib/TestStage.d.ts +1 -1
  12. package/lib/TestStage.js +2 -1
  13. package/lib/code-position-resolution.d.ts +2 -0
  14. package/lib/code-position-resolution.js +50 -0
  15. package/lib/exampleTestFile.test.js +48 -45
  16. package/lib/help.d.ts +1 -1
  17. package/lib/help.js +2 -1
  18. package/lib/index.d.ts +1 -0
  19. package/lib/index.js +62 -39
  20. package/lib/reporters/JsonReporter.d.ts +20 -0
  21. package/lib/reporters/JsonReporter.js +39 -0
  22. package/lib/reporters/Reporter.d.ts +4 -0
  23. package/lib/reporters/Reporter.js +4 -0
  24. package/lib/reporters/SpecReporter.d.ts +14 -0
  25. package/lib/reporters/SpecReporter.js +90 -0
  26. package/lib/reporters/index.d.ts +3 -0
  27. package/lib/reporters/index.js +17 -0
  28. package/lib/run-results/SuiteRunResult.d.ts +11 -0
  29. package/lib/run-results/SuiteRunResult.js +19 -0
  30. package/lib/run-results/TestRunResult.d.ts +9 -0
  31. package/lib/run-results/TestRunResult.js +15 -0
  32. package/lib/run-results/index.d.ts +2 -0
  33. package/lib/run-results/index.js +16 -0
  34. package/package.json +69 -64
  35. package/lib/OptionsDefinition.d.ts +0 -5
  36. package/lib/OptionsDefinition.js +0 -29
  37. package/lib/PerformancePolyfill.d.ts +0 -1
  38. package/lib/PerformancePolyfill.js +0 -16
  39. package/lib/SpecReporter.d.ts +0 -12
  40. package/lib/SpecReporter.js +0 -76
  41. package/lib/TestRunResult.d.ts +0 -9
  42. package/lib/TestRunResult.js +0 -13
  43. package/lib/TestSuiteClass.d.ts +0 -28
  44. package/lib/TestSuiteClass.js +0 -78
@@ -1,16 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- function polyfillPerformance() {
4
- if (global && !global.performance) {
5
- const start = process.hrtime();
6
- global.performance = {
7
- now: function () {
8
- const end = process.hrtime(start);
9
- return Math.round((end[0] * 1000) + (end[1] / 1000000));
10
- }
11
- };
12
- }
13
- }
14
- exports.polyfillPerformance = polyfillPerformance;
15
-
16
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlBlcmZvcm1hbmNlUG9seWZpbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTtJQUNDLElBQUksTUFBTSxJQUFJLENBQUUsTUFBYyxDQUFDLFdBQVcsRUFBRTtRQUMzQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFOUIsTUFBYyxDQUFDLFdBQVcsR0FBRztZQUM3QixHQUFHLEVBQUU7Z0JBQ0osTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDekQsQ0FBQztTQUNELENBQUM7S0FDRjtBQUNGLENBQUM7QUFYRCxrREFXQyIsImZpbGUiOiJQZXJmb3JtYW5jZVBvbHlmaWxsLmpzIiwic291cmNlUm9vdCI6Ii4uXFxzcmMifQ==
@@ -1,12 +0,0 @@
1
- import { TestSuiteClass } from "./TestSuiteClass";
2
- export declare class SpecReporter {
3
- private output;
4
- private symbols;
5
- private indentation;
6
- private passedCount;
7
- private errors;
8
- constructor(output: Console);
9
- listenTo(suite: TestSuiteClass): void;
10
- private onEnd();
11
- private getTestFullTitle(test);
12
- }
@@ -1,76 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const chalk_1 = require("chalk");
4
- class SpecReporter {
5
- constructor(output) {
6
- this.output = output;
7
- this.symbols = {
8
- ok: '✓',
9
- err: '✖',
10
- };
11
- this.indentation = " ";
12
- this.passedCount = 0;
13
- this.errors = [];
14
- }
15
- listenTo(suite) {
16
- let indent = "";
17
- suite.onSuiteStart.add(suite => {
18
- if (!suite.title)
19
- return;
20
- this.output.log();
21
- this.output.info(indent + suite.title);
22
- indent += this.indentation;
23
- });
24
- suite.onSuiteEnd.add(endedSuite => {
25
- indent = indent.substr(0, indent.length - this.indentation.length);
26
- if (endedSuite == suite) {
27
- this.onEnd();
28
- }
29
- });
30
- suite.onTestEnd.add(result => {
31
- if (result.passed) {
32
- this.passedCount++;
33
- this.output.log(chalk_1.default.green(`${indent}${this.symbols.ok} ${result.test.title}`));
34
- }
35
- else {
36
- this.errors.push(result);
37
- this.output.log(chalk_1.default.red(`${indent}${this.symbols.err} ${result.test.title}`));
38
- }
39
- });
40
- }
41
- onEnd() {
42
- for (let result of this.errors) {
43
- this.output.log();
44
- let title = this.getTestFullTitle(result.test);
45
- this.output.log(title);
46
- let isError = result.reason instanceof Error;
47
- let message = isError ?
48
- result.reason.message :
49
- JSON.stringify(result.reason);
50
- this.output.log(this.indentation + chalk_1.default.red(`${message}`));
51
- isError && this.output.log(this.indentation + `${result.reason.stack}`);
52
- }
53
- this.output.log();
54
- this.output.log(chalk_1.default.green(`${this.passedCount} passing`));
55
- if (this.errors.length > 0) {
56
- this.output.log(chalk_1.default.red(`${this.errors.length} failing`));
57
- }
58
- this.output.log();
59
- }
60
- getTestFullTitle(test) {
61
- let titles = [test.title];
62
- let parent = test.parent;
63
- while (parent && parent.title) {
64
- titles.push(parent.title);
65
- parent = parent.parent;
66
- }
67
- let title = titles.pop();
68
- while (titles.length > 0) {
69
- title += " -> " + titles.pop();
70
- }
71
- return title;
72
- }
73
- }
74
- exports.SpecReporter = SpecReporter;
75
-
76
- //# sourceMappingURL=data:application/json;charset=utf8;base64,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
@@ -1,9 +0,0 @@
1
- import { Test } from "./Test";
2
- import { TestStage } from "./TestStage";
3
- export declare class TestRunResult {
4
- test: Test;
5
- stage: TestStage;
6
- passed: boolean;
7
- reason: any;
8
- constructor(test: Test, stage: TestStage, passed: boolean, reason?: any);
9
- }
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- class TestRunResult {
4
- constructor(test, stage, passed, reason) {
5
- this.test = test;
6
- this.stage = stage;
7
- this.passed = passed;
8
- this.reason = reason;
9
- }
10
- }
11
- exports.TestRunResult = TestRunResult;
12
-
13
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRlc3RSdW5SZXN1bHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQTtJQUNDLFlBQW1CLElBQVUsRUFBUyxLQUFnQixFQUFTLE1BQWUsRUFBUyxNQUFZO1FBQWhGLFNBQUksR0FBSixJQUFJLENBQU07UUFBUyxVQUFLLEdBQUwsS0FBSyxDQUFXO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUFTLFdBQU0sR0FBTixNQUFNLENBQU07SUFDbkcsQ0FBQztDQUNEO0FBSEQsc0NBR0MiLCJmaWxlIjoiVGVzdFJ1blJlc3VsdC5qcyIsInNvdXJjZVJvb3QiOiIuLlxcc3JjIn0=
@@ -1,28 +0,0 @@
1
- import { TestSuite, TestParams } from "just-test-api";
2
- import { Event1 } from "itay-events";
3
- import { Test } from "./Test";
4
- import { TestRunResult } from "./TestRunResult";
5
- export interface RunParams {
6
- filter?: string;
7
- debug: boolean;
8
- }
9
- export declare class TestSuiteClass implements TestSuite {
10
- title: string;
11
- parent?: TestSuiteClass;
12
- childrenSuites: TestSuiteClass[];
13
- tests: Test[];
14
- onSuiteStart: Event1<TestSuiteClass>;
15
- onSuiteEnd: Event1<TestSuiteClass>;
16
- onTestStart: Event1<Test>;
17
- onTestEnd: Event1<TestRunResult>;
18
- constructor();
19
- describe(title: string | {
20
- name: string;
21
- }, suiteFunction: (suite: TestSuiteClass) => void): void;
22
- test(title: string, testFunction: (test: TestParams) => Promise<void> | void): void;
23
- run(params: RunParams): Promise<boolean>;
24
- private getFilteredTests(params);
25
- countTotalTests(params: RunParams): number;
26
- private createLocalParams(params);
27
- private isPassingFilter(filter);
28
- }
@@ -1,78 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const itay_events_1 = require("itay-events");
4
- const Test_1 = require("./Test");
5
- class TestSuiteClass {
6
- constructor() {
7
- this.title = "";
8
- this.childrenSuites = [];
9
- this.tests = [];
10
- this.onSuiteStart = new itay_events_1.Event1();
11
- this.onSuiteEnd = new itay_events_1.Event1();
12
- this.onTestStart = new itay_events_1.Event1();
13
- this.onTestEnd = new itay_events_1.Event1();
14
- }
15
- describe(title, suiteFunction) {
16
- let childSuite = new TestSuiteClass();
17
- childSuite.title = typeof (title) === "string" ? title : title.name;
18
- childSuite.onTestStart.add(t => this.onTestStart.trigger(t));
19
- childSuite.onTestEnd.add(result => this.onTestEnd.trigger(result));
20
- childSuite.onSuiteStart.add(s => this.onSuiteStart.trigger(s));
21
- childSuite.onSuiteEnd.add(s => this.onSuiteEnd.trigger(s));
22
- childSuite.parent = this;
23
- this.childrenSuites.push(childSuite);
24
- suiteFunction(childSuite);
25
- }
26
- test(title, testFunction) {
27
- this.tests.push(new Test_1.Test(title, testFunction, this));
28
- }
29
- async run(params) {
30
- params = this.createLocalParams(params);
31
- let filteredTests = this.getFilteredTests(params);
32
- this.onSuiteStart.trigger(this);
33
- let passed = true;
34
- let testRunOptions = { debug: params.debug };
35
- for (let test of filteredTests) {
36
- this.onTestStart.trigger(test);
37
- let result = await test.run(testRunOptions);
38
- passed = passed && result.passed;
39
- this.onTestEnd.trigger(result);
40
- }
41
- for (let suite of this.childrenSuites) {
42
- if (suite.countTotalTests(params) > 0) {
43
- let suitePassed = await suite.run(params);
44
- passed = passed && suitePassed;
45
- }
46
- }
47
- this.onSuiteEnd.trigger(this);
48
- return passed;
49
- }
50
- getFilteredTests(params) {
51
- if (!params.filter)
52
- return this.tests;
53
- let filter = params.filter.toLowerCase();
54
- return this.tests.filter(t => t.title.toLowerCase().indexOf(filter) >= 0);
55
- }
56
- countTotalTests(params) {
57
- params = this.createLocalParams(params);
58
- let filteredTests = this.getFilteredTests(params);
59
- let count = filteredTests.length;
60
- for (let childSuite of this.childrenSuites) {
61
- count += childSuite.countTotalTests(params);
62
- }
63
- return count;
64
- }
65
- createLocalParams(params) {
66
- params = Object.assign({}, params);
67
- if (this.isPassingFilter(params.filter)) {
68
- params.filter = undefined;
69
- }
70
- return params;
71
- }
72
- isPassingFilter(filter) {
73
- return !filter || this.title.toLowerCase().indexOf(filter.toLowerCase()) >= 0;
74
- }
75
- }
76
- exports.TestSuiteClass = TestSuiteClass;
77
-
78
- //# sourceMappingURL=data:application/json;charset=utf8;base64,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O1lBQ3RDLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3RDLElBQUksV0FBVyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDMUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxXQUFXLENBQUM7YUFDL0I7U0FDRDtRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTlCLE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE1BQWlCO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUV0QyxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBRU0sZUFBZSxDQUFDLE1BQWlCO1FBQ3ZDLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFeEMsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWxELElBQUksS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFFakMsS0FBSyxJQUFJLFVBQVUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQzNDLEtBQUssSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzVDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZCxDQUFDO0lBRU8saUJBQWlCLENBQUMsTUFBaUI7UUFDMUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRW5DLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDeEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7U0FDMUI7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFTyxlQUFlLENBQUMsTUFBMEI7UUFDakQsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0UsQ0FBQztDQUNEO0FBckdELHdDQXFHQyIsImZpbGUiOiJUZXN0U3VpdGVDbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIuLlxcc3JjIn0=