just-test-node 1.4.2 → 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 (45) hide show
  1. package/README.md +11 -15
  2. package/lib/Discover.d.ts +25 -0
  3. package/lib/Discover.js +4 -0
  4. package/lib/OptionsDefinitions.d.ts +15 -0
  5. package/lib/OptionsDefinitions.js +55 -0
  6. package/lib/StackTrace.d.ts +1 -0
  7. package/lib/StackTrace.js +44 -0
  8. package/lib/Suite.d.ts +45 -0
  9. package/lib/Suite.js +115 -0
  10. package/lib/Test.d.ts +13 -6
  11. package/lib/Test.js +41 -39
  12. package/lib/TestStage.d.ts +1 -1
  13. package/lib/TestStage.js +3 -0
  14. package/lib/code-position-resolution.d.ts +2 -0
  15. package/lib/code-position-resolution.js +50 -0
  16. package/lib/exampleTestFile.test.js +49 -52
  17. package/lib/help.d.ts +1 -1
  18. package/lib/help.js +3 -0
  19. package/lib/index.d.ts +1 -0
  20. package/lib/index.js +93 -68
  21. package/lib/reporters/JsonReporter.d.ts +20 -0
  22. package/lib/reporters/JsonReporter.js +39 -0
  23. package/lib/reporters/Reporter.d.ts +4 -0
  24. package/lib/reporters/Reporter.js +4 -0
  25. package/lib/reporters/SpecReporter.d.ts +14 -0
  26. package/lib/reporters/SpecReporter.js +90 -0
  27. package/lib/reporters/index.d.ts +3 -0
  28. package/lib/reporters/index.js +17 -0
  29. package/lib/run-results/SuiteRunResult.d.ts +11 -0
  30. package/lib/run-results/SuiteRunResult.js +19 -0
  31. package/lib/run-results/TestRunResult.d.ts +9 -0
  32. package/lib/run-results/TestRunResult.js +15 -0
  33. package/lib/run-results/index.d.ts +2 -0
  34. package/lib/run-results/index.js +16 -0
  35. package/package.json +69 -64
  36. package/lib/OptionsDefinition.d.ts +0 -4
  37. package/lib/OptionsDefinition.js +0 -2
  38. package/lib/PerformancePolyfill.d.ts +0 -1
  39. package/lib/PerformancePolyfill.js +0 -14
  40. package/lib/SpecReporter.d.ts +0 -12
  41. package/lib/SpecReporter.js +0 -74
  42. package/lib/TestRunResult.d.ts +0 -9
  43. package/lib/TestRunResult.js +0 -11
  44. package/lib/TestSuiteClass.d.ts +0 -27
  45. package/lib/TestSuiteClass.js +0 -85
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  Just run and report.
3
3
 
4
4
  Unfortunately, nodejs currently does NOT support <em>es6 imports</em> (it does support other es6 features).
5
- That means that your code(and tests) should be written/compiled/transpiled to CommonJs or UMD, to be run on nodejs.
5
+ That means that your code(and tests) can target es6 (or later) but should be written/compiled/transpiled to CommonJs or UMD format for the module resolution to work on nodejs.
6
6
  Some more info about that will be after the usage.
7
7
 
8
8
  ## Install
@@ -15,15 +15,16 @@ Write your test modules with the just-test-api (typescript interfaces):
15
15
  In your package.json:
16
16
  ```
17
17
  "scripts": {
18
- "test": "just-test --glob=./code/**/*.test.js"
18
+ "test": "gulp build && just-test",
19
+ "testWithGlobExample": "just-test --glob=./lib/**/*.test.js"
19
20
  }
20
21
  ```
21
- Of course, you should change the glob pattern to match your test files.
22
+ The default glob will pick all "*.test.js" ("./!(node_modules)/**/*.test.js").
22
23
 
23
24
  Run:
24
25
  `npm test`
25
26
  Or
26
- `npm test "some test search"`
27
+ `npm test "some test filter"`
27
28
 
28
29
  ## Module - ES6, CommonJS, UMD, AMD, SystemJS, Webpack
29
30
  I recommend you to read about the different module formats on the internet.
@@ -31,27 +32,22 @@ The problem is that currently there is no one format to rule them all.
31
32
  * ES6 - Nodejs does not fully support es6 (import keyword).
32
33
  * Therefore node will run only CommonJs and UMD.
33
34
  * CommonJS cannot be run on the browser out of the box. Some process or a supporting bundler should be used.
34
- * Webpack accepts commonjs, transform it, and bundles it to be run on browser.
35
+ * Webpack, for example, accepts commonjs, transform it, and bundles it to be run on the browser.
35
36
  * UMD - Can be run on nodejs AND on the browser out of the box! But webpack will not accept it...
36
37
  * AMD - Good for browsers (with require.js or system.js), but not for nodejs.
37
38
  * Systemjs - Good for browsers (with system.js), but not for nodejs.
38
- * Webpack - will accept commonjs, amd, es6 formats.
39
+ * Webpack - Will run on the browser. Can require/import: commonjs, amd, es6 formats. Requiring umd is not supported/bugged. There are plugins I haven't tried.
39
40
 
40
41
  ### Browser/Webpack users:
41
42
  Notice that Webpack currently does NOT support UMD.
42
43
  If you are writing and testing a library that is intended to be bundled with Webpack,
43
- I recommend you to create a CommonJs or AMD port of it.
44
+ I recommend you to create a CommonJs port of it.
44
45
  Another option is to output multiple formats. For example:
45
46
  1. CommonJs format for node(and testing).
46
- 2. AMD format for browsers and Webpack.
47
-
48
- I personally, usually output my libraries in 3 formats:
49
- 1. UMD - for node and browser support.
50
- 2. Systemjs bundle - for systemjs module loader.
51
- 3. AMD - For webpack (systemjs module loader can actually load amd as well).
47
+ 2. AMD format for browsers.
52
48
 
53
49
  There are some tricks to create a js file that will support both AMD and CommonJS (and Webpack).
54
50
  These tricks require a wrapping function in every js file. This is ugly but works.
55
- This will probably destroy map files (for typescript as an example).
51
+ This will probably destroy sourcemaps if not done with consideration (I don't know how to do it with consideration).
56
52
 
57
- In summery, until node supports es6 import keyword, we suffer.
53
+ In summery, until node supports es6 "import" keyword, we suffer.
@@ -0,0 +1,25 @@
1
+ export interface TextPosition {
2
+ /**
3
+ * Zero based line.
4
+ */
5
+ line: number;
6
+ /**
7
+ * Zero based column.
8
+ */
9
+ column: number;
10
+ }
11
+ export interface FunctionCodeRange {
12
+ filePath: string;
13
+ start: TextPosition;
14
+ end: TextPosition;
15
+ }
16
+ export interface DiscoveredSuite {
17
+ title: string;
18
+ location: FunctionCodeRange;
19
+ tests: DiscoveredTest[];
20
+ suites: DiscoveredSuite[];
21
+ }
22
+ export interface DiscoveredTest {
23
+ title: string;
24
+ location: FunctionCodeRange;
25
+ }
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+
4
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkRpc2NvdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJmaWxlIjoiRGlzY292ZXIuanMiLCJzb3VyY2VSb290IjoiLi5cXHNyYyJ9
@@ -0,0 +1,15 @@
1
+ import { OptionDefinition as ArgsOptionDefinition } from "command-line-args";
2
+ export interface Options {
3
+ glob: string;
4
+ filter: string;
5
+ help: boolean;
6
+ debug: boolean;
7
+ discover: boolean;
8
+ reporter: "spec" | "json";
9
+ testFailureExitCode: number;
10
+ }
11
+ export declare function validateOptions(options: Options): void;
12
+ export interface OptionDefinition extends ArgsOptionDefinition {
13
+ description: string;
14
+ }
15
+ export declare const optionsDefinitions: OptionDefinition[];
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.optionsDefinitions = exports.validateOptions = void 0;
4
+ function validateOptions(options) {
5
+ if (!["spec", "json"].includes(options.reporter))
6
+ throw "invalid reporter.";
7
+ }
8
+ exports.validateOptions = validateOptions;
9
+ exports.optionsDefinitions = [
10
+ {
11
+ name: 'glob', alias: 'g',
12
+ type: String,
13
+ defaultValue: "./!(node_modules)/**/*.test.js",
14
+ description: "Test files glob pattern."
15
+ },
16
+ {
17
+ name: "filter", alias: "f",
18
+ type: String,
19
+ defaultOption: true,
20
+ defaultValue: "",
21
+ description: "Filters tests."
22
+ },
23
+ {
24
+ name: 'help', alias: 'h',
25
+ type: Boolean,
26
+ defaultValue: false,
27
+ description: "Show help."
28
+ },
29
+ {
30
+ name: 'debug',
31
+ type: Boolean,
32
+ defaultValue: false,
33
+ description: "Debug mode. Will disable timeouts."
34
+ },
35
+ {
36
+ name: 'discover',
37
+ type: Boolean,
38
+ defaultValue: false,
39
+ description: "Outputs the available the tests as json."
40
+ },
41
+ {
42
+ name: "reporter",
43
+ type: String,
44
+ defaultValue: "spec",
45
+ description: `The reporter to use for ouput. Options: "spec", "json"`,
46
+ },
47
+ {
48
+ name: "testFailureExitCode",
49
+ type: Number,
50
+ defaultValue: 1,
51
+ description: `The exit code to use when has test failures.`,
52
+ }
53
+ ];
54
+
55
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk9wdGlvbnNEZWZpbml0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFZQSxTQUFnQixlQUFlLENBQUMsT0FBZ0I7SUFDL0MsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQy9DLE1BQU0sbUJBQW1CLENBQUM7QUFDNUIsQ0FBQztBQUhELDBDQUdDO0FBTVksUUFBQSxrQkFBa0IsR0FBdUI7SUFDckQ7UUFDQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHO1FBQ3hCLElBQUksRUFBRSxNQUFNO1FBQ1osWUFBWSxFQUFFLGdDQUFnQztRQUM5QyxXQUFXLEVBQUUsMEJBQTBCO0tBQ3ZDO0lBQ0Q7UUFDQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHO1FBQzFCLElBQUksRUFBRSxNQUFNO1FBQ1osYUFBYSxFQUFFLElBQUk7UUFDbkIsWUFBWSxFQUFFLEVBQUU7UUFDaEIsV0FBVyxFQUFFLGdCQUFnQjtLQUM3QjtJQUNEO1FBQ0MsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRztRQUN4QixJQUFJLEVBQUUsT0FBTztRQUNiLFlBQVksRUFBRSxLQUFLO1FBQ25CLFdBQVcsRUFBRSxZQUFZO0tBQ3pCO0lBQ0Q7UUFDQyxJQUFJLEVBQUUsT0FBTztRQUNiLElBQUksRUFBRSxPQUFPO1FBQ2IsWUFBWSxFQUFFLEtBQUs7UUFDbkIsV0FBVyxFQUFFLG9DQUFvQztLQUNqRDtJQUNEO1FBQ0MsSUFBSSxFQUFFLFVBQVU7UUFDaEIsSUFBSSxFQUFFLE9BQU87UUFDYixZQUFZLEVBQUUsS0FBSztRQUNuQixXQUFXLEVBQUUsMENBQTBDO0tBQ3ZEO0lBQ0Q7UUFDQyxJQUFJLEVBQUUsVUFBVTtRQUNoQixJQUFJLEVBQUUsTUFBTTtRQUNaLFlBQVksRUFBRSxNQUFNO1FBQ3BCLFdBQVcsRUFBRSx3REFBd0Q7S0FDckU7SUFDRDtRQUNDLElBQUksRUFBRSxxQkFBcUI7UUFDM0IsSUFBSSxFQUFFLE1BQU07UUFDWixZQUFZLEVBQUUsQ0FBQztRQUNmLFdBQVcsRUFBRSw4Q0FBOEM7S0FDM0Q7Q0FDRCxDQUFDIiwiZmlsZSI6Ik9wdGlvbnNEZWZpbml0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIuLlxcc3JjIn0=
@@ -0,0 +1 @@
1
+ export declare function getCallerLocationText(currentFunction: Function): string;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCallerLocationText = void 0;
4
+ function getCallerLocationText(currentFunction) {
5
+ const originalLimit = Error.stackTraceLimit;
6
+ const originalPrepare = Error.prepareStackTrace;
7
+ Error.stackTraceLimit = 1;
8
+ Error.prepareStackTrace = getFirstCallLocation;
9
+ const object = { stack: "", originalPrepare: originalPrepare };
10
+ Error.captureStackTrace(object, currentFunction);
11
+ const location = object.stack;
12
+ Error.stackTraceLimit = originalLimit;
13
+ Error.prepareStackTrace = originalPrepare;
14
+ return location;
15
+ }
16
+ exports.getCallerLocationText = getCallerLocationText;
17
+ function getFirstCallLocation(object, stack) {
18
+ const callSite = stack[0];
19
+ if (!object.originalPrepare)
20
+ return `${callSite.getFileName()}:${callSite.getLineNumber()}:${callSite.getColumnNumber()}`;
21
+ // Support for ts-node
22
+ const formattedByRuntime = object.originalPrepare(object, [new SimplifiedCallSite(callSite)]);
23
+ return formattedByRuntime.slice("Error\n at ".length);
24
+ }
25
+ class SimplifiedCallSite {
26
+ constructor(callSite) {
27
+ this.callSite = callSite;
28
+ }
29
+ getThis() { return undefined; }
30
+ getTypeName() { return null; }
31
+ getFunction() { return undefined; }
32
+ getFunctionName() { return null; }
33
+ getMethodName() { return null; }
34
+ getFileName() { return this.callSite.getFileName(); }
35
+ getLineNumber() { return this.callSite.getLineNumber(); }
36
+ getColumnNumber() { return this.callSite.getColumnNumber(); }
37
+ getEvalOrigin() { return undefined; }
38
+ isToplevel() { return true; }
39
+ isEval() { return false; }
40
+ isNative() { return false; }
41
+ isConstructor() { return false; }
42
+ }
43
+
44
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,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
package/lib/Suite.d.ts ADDED
@@ -0,0 +1,45 @@
1
+ import { TestSuite, TestParams } from "just-test-api";
2
+ import { Event1 } from "itay-events";
3
+ import { Test } from "./Test";
4
+ import { TestRunResult } from "./run-results/TestRunResult";
5
+ import { SuiteRunResult } from "./run-results/SuiteRunResult";
6
+ import { DiscoveredSuite, FunctionCodeRange } from "./Discover";
7
+ export interface RunParams {
8
+ debug: boolean;
9
+ }
10
+ export interface TestEndedArgs {
11
+ test: Test;
12
+ result: TestRunResult;
13
+ }
14
+ export interface SuiteEndedArgs {
15
+ suite: Suite;
16
+ result: SuiteRunResult;
17
+ }
18
+ export declare class Suite implements TestSuite {
19
+ title: string;
20
+ location: FunctionCodeRange;
21
+ parent?: Suite;
22
+ childrenSuites: Suite[];
23
+ tests: Test[];
24
+ private isPartial;
25
+ onSuiteStarted: Event1<Suite>;
26
+ onSuiteEnded: Event1<SuiteEndedArgs>;
27
+ onTestStarted: Event1<Test>;
28
+ onTestEnded: Event1<TestEndedArgs>;
29
+ constructor();
30
+ discover(): DiscoveredSuite;
31
+ describe(title: string | {
32
+ name: string;
33
+ }, suiteFunction: (suite: Suite) => void): void;
34
+ test(title: string, testFunction: (test: TestParams) => Promise<void> | void): void;
35
+ testFunc(namedTestFunction: (test: TestParams) => Promise<void> | void): void;
36
+ testFuncs(...namedTestFunctions: ((test: TestParams) => Promise<void> | void)[]): void;
37
+ private getTitleFor;
38
+ run(params: RunParams): Promise<boolean>;
39
+ private getStatus;
40
+ treeShake(lowerCasedFilter: string): boolean;
41
+ private calcIsPartial;
42
+ private isTitlePassingFilter;
43
+ private runDirectDescendantsTests;
44
+ private runSubSuites;
45
+ }
package/lib/Suite.js ADDED
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Suite = void 0;
4
+ const itay_events_1 = require("itay-events");
5
+ const Test_1 = require("./Test");
6
+ const SuiteRunResult_1 = require("./run-results/SuiteRunResult");
7
+ const code_position_resolution_1 = require("./code-position-resolution");
8
+ class Suite {
9
+ constructor() {
10
+ this.title = "";
11
+ this.location = null;
12
+ this.childrenSuites = [];
13
+ this.tests = [];
14
+ this.isPartial = false;
15
+ this.onSuiteStarted = new itay_events_1.Event1();
16
+ this.onSuiteEnded = new itay_events_1.Event1();
17
+ this.onTestStarted = new itay_events_1.Event1();
18
+ this.onTestEnded = new itay_events_1.Event1();
19
+ }
20
+ discover() {
21
+ return {
22
+ title: this.title,
23
+ location: this.location,
24
+ tests: this.tests.map(e => e.discover()),
25
+ suites: this.childrenSuites.map(e => e.discover())
26
+ };
27
+ }
28
+ describe(title, suiteFunction) {
29
+ let childSuite = new Suite();
30
+ childSuite.title = typeof (title) === "string" ? title : title.name;
31
+ childSuite.location = (0, code_position_resolution_1.getFunctionCodeRange)(suiteFunction, this.describe);
32
+ childSuite.onTestStarted.add(t => this.onTestStarted.trigger(t));
33
+ childSuite.onTestEnded.add(result => this.onTestEnded.trigger(result));
34
+ childSuite.onSuiteStarted.add(s => this.onSuiteStarted.trigger(s));
35
+ childSuite.onSuiteEnded.add(s => this.onSuiteEnded.trigger(s));
36
+ childSuite.parent = this;
37
+ this.childrenSuites.push(childSuite);
38
+ suiteFunction(childSuite);
39
+ }
40
+ test(title, testFunction) {
41
+ const location = (0, code_position_resolution_1.getFunctionCodeRange)(testFunction, this.test);
42
+ this.tests.push(new Test_1.Test(title, testFunction, this, location));
43
+ }
44
+ testFunc(namedTestFunction) {
45
+ const location = (0, code_position_resolution_1.getFunctionCodeRange)(namedTestFunction, this.testFunc);
46
+ this.tests.push(new Test_1.Test(this.getTitleFor(namedTestFunction), namedTestFunction, this, location));
47
+ }
48
+ testFuncs(...namedTestFunctions) {
49
+ for (const test of namedTestFunctions) {
50
+ const location = (0, code_position_resolution_1.getFunctionCodeRange)(test, this.testFuncs);
51
+ this.tests.push(new Test_1.Test(this.getTitleFor(test), test, this, location));
52
+ }
53
+ }
54
+ getTitleFor(func) {
55
+ return func.name.replace(/_/g, " ");
56
+ }
57
+ async run(params) {
58
+ this.onSuiteStarted.trigger(this);
59
+ const startTime = performance.now();
60
+ const testsPassed = await this.runDirectDescendantsTests(params);
61
+ const subSuitesPassed = await this.runSubSuites(params);
62
+ const passed = testsPassed && subSuitesPassed;
63
+ this.onSuiteEnded.trigger({
64
+ suite: this,
65
+ result: new SuiteRunResult_1.SuiteRunResult(this.title, performance.now() - startTime, this.getStatus(passed))
66
+ });
67
+ return passed;
68
+ }
69
+ getStatus(runPassed) {
70
+ if (!runPassed)
71
+ return SuiteRunResult_1.SuiteResultStatus.Failed;
72
+ if (this.isPartial)
73
+ return SuiteRunResult_1.SuiteResultStatus.Partial;
74
+ return SuiteRunResult_1.SuiteResultStatus.Passed;
75
+ }
76
+ treeShake(lowerCasedFilter) {
77
+ if (this.isTitlePassingFilter(lowerCasedFilter))
78
+ return true;
79
+ const originalTestsCount = this.tests.length;
80
+ const originalchildrenSuitesCount = this.childrenSuites.length;
81
+ this.tests = this.tests.filter(e => e.title.toLowerCase().includes(lowerCasedFilter));
82
+ this.childrenSuites = this.childrenSuites.filter(e => e.treeShake(lowerCasedFilter));
83
+ this.isPartial = this.calcIsPartial(originalTestsCount, originalchildrenSuitesCount);
84
+ return this.tests.length > 0 || this.childrenSuites.length > 0;
85
+ }
86
+ calcIsPartial(originalTestsCount, originalchildrenSuitesCount) {
87
+ return this.tests.length < originalTestsCount ||
88
+ this.childrenSuites.length < originalchildrenSuitesCount ||
89
+ this.childrenSuites.some(e => e.isPartial);
90
+ }
91
+ isTitlePassingFilter(lowerCasedFilter) {
92
+ return this.title.toLowerCase().includes(lowerCasedFilter.toLowerCase());
93
+ }
94
+ async runDirectDescendantsTests(testRunOptions) {
95
+ let passed = true;
96
+ for (let test of this.tests) {
97
+ this.onTestStarted.trigger(test);
98
+ let result = await test.run(testRunOptions);
99
+ passed = passed && result.passed;
100
+ this.onTestEnded.trigger({ test, result });
101
+ }
102
+ return passed;
103
+ }
104
+ async runSubSuites(params) {
105
+ let passed = true;
106
+ for (let suite of this.childrenSuites) {
107
+ let suitePassed = await suite.run(params);
108
+ passed = passed && suitePassed;
109
+ }
110
+ return passed;
111
+ }
112
+ }
113
+ exports.Suite = Suite;
114
+
115
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFTyxhQUFhLENBQUMsa0JBQTBCLEVBQUUsMkJBQW1DO1FBQ3BGLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsa0JBQWtCO1lBQzVDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLDJCQUEyQjtZQUN4RCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUM1QyxDQUFDO0lBRU8sb0JBQW9CLENBQUMsZ0JBQXdCO1FBQ3BELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRU8sS0FBSyxDQUFDLHlCQUF5QixDQUFDLGNBQThCO1FBQ3JFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztRQUVsQixLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFakMsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sR0FBRyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUVqQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQzNDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFpQjtRQUMzQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFFbEIsS0FBSyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3RDLElBQUksV0FBVyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxQyxNQUFNLEdBQUcsTUFBTSxJQUFJLFdBQVcsQ0FBQztTQUMvQjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztDQUNEO0FBaEpELHNCQWdKQyIsImZpbGUiOiJTdWl0ZS5qcyIsInNvdXJjZVJvb3QiOiIuLlxcc3JjIn0=
package/lib/Test.d.ts CHANGED
@@ -1,11 +1,18 @@
1
1
  import { TestParams } from "just-test-api";
2
- import { TestRunResult } from "./TestRunResult";
3
- import { TestSuiteClass } from "./TestSuiteClass";
2
+ import { DiscoveredTest, FunctionCodeRange } from "./Discover";
3
+ import { TestRunResult } from "./run-results/TestRunResult";
4
+ import { Suite } from "./Suite";
5
+ export interface TestRunOptions {
6
+ debug: boolean;
7
+ }
4
8
  export declare class Test {
5
9
  title: string;
6
10
  testFunction: (test: TestParams) => Promise<void> | void;
7
- parent: TestSuiteClass;
8
- constructor(title: string, testFunction: (test: TestParams) => Promise<void> | void, parent: TestSuiteClass);
9
- run(): Promise<TestRunResult>;
10
- private timeout(promise, timeout);
11
+ parent: Suite;
12
+ location: FunctionCodeRange;
13
+ constructor(title: string, testFunction: (test: TestParams) => Promise<void> | void, parent: Suite, location: FunctionCodeRange);
14
+ discover(): DiscoveredTest;
15
+ run(options: TestRunOptions): Promise<TestRunResult>;
16
+ private isPromise;
17
+ private withTimeout;
11
18
  }
package/lib/Test.js CHANGED
@@ -1,14 +1,7 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
2
  Object.defineProperty(exports, "__esModule", { value: true });
11
- const TestRunResult_1 = require("./TestRunResult");
3
+ exports.Test = void 0;
4
+ const TestRunResult_1 = require("./run-results/TestRunResult");
12
5
  const TestStage_1 = require("./TestStage");
13
6
  class TestParamsClass {
14
7
  constructor() {
@@ -26,42 +19,51 @@ class TestParamsClass {
26
19
  }
27
20
  }
28
21
  class Test {
29
- constructor(title, testFunction, parent) {
22
+ constructor(title, testFunction, parent, location) {
30
23
  this.title = title;
31
24
  this.testFunction = testFunction;
32
25
  this.parent = parent;
26
+ this.location = location;
33
27
  }
34
- run() {
35
- return __awaiter(this, void 0, void 0, function* () {
36
- let testParams = new TestParamsClass();
37
- try {
38
- let result = this.testFunction(testParams);
39
- if (result && typeof result.then === "function") {
40
- yield this.timeout(result, testParams.timeout);
41
- }
42
- }
43
- catch (reason) {
44
- return Promise.resolve(new TestRunResult_1.TestRunResult(this, testParams.stage, false, reason));
45
- }
46
- return Promise.resolve(new TestRunResult_1.TestRunResult(this, testParams.stage, true));
47
- });
28
+ discover() {
29
+ return { title: this.title, location: this.location };
48
30
  }
49
- timeout(promise, timeout) {
50
- return __awaiter(this, void 0, void 0, function* () {
51
- let timer = undefined;
52
- let firstValue = yield Promise.race([
53
- promise,
54
- new Promise(resolve => {
55
- timer = setTimeout(() => resolve("timeout"), timeout);
56
- })
57
- ]);
58
- if (typeof firstValue === "string" && firstValue === "timeout") {
59
- throw new Error(`Timeout (${timeout} milliseconds).`);
60
- }
61
- else {
62
- clearTimeout(timer);
31
+ async run(options) {
32
+ const testParams = new TestParamsClass();
33
+ const startTime = performance.now();
34
+ try {
35
+ let result = this.testFunction(testParams);
36
+ if (result && this.isPromise(result)) {
37
+ if (options.debug)
38
+ await result;
39
+ else
40
+ await this.withTimeout(result, testParams.timeout);
63
41
  }
64
- });
42
+ return Promise.resolve(new TestRunResult_1.TestRunResult(this.title, performance.now() - startTime, testParams.stage, true));
43
+ }
44
+ catch (reason) {
45
+ return Promise.resolve(new TestRunResult_1.TestRunResult(this.title, performance.now() - startTime, testParams.stage, false, reason));
46
+ }
47
+ }
48
+ isPromise(result) {
49
+ return typeof result.then === "function";
50
+ }
51
+ async withTimeout(promise, timeout) {
52
+ let timer = undefined;
53
+ let firstValue = await Promise.race([
54
+ promise,
55
+ new Promise(resolve => {
56
+ timer = setTimeout(() => resolve("timeout"), timeout);
57
+ })
58
+ ]);
59
+ if (typeof firstValue === "string" && firstValue === "timeout") {
60
+ throw new Error(`Timeout (${timeout} milliseconds).`);
61
+ }
62
+ else {
63
+ clearTimeout(timer);
64
+ }
65
65
  }
66
66
  }
67
67
  exports.Test = Test;
68
+
69
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,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
@@ -2,5 +2,5 @@ export declare enum TestStage {
2
2
  NoStage = 0,
3
3
  Arrange = 1,
4
4
  Act = 2,
5
- Assert = 3,
5
+ Assert = 3
6
6
  }
package/lib/TestStage.js CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TestStage = void 0;
3
4
  var TestStage;
4
5
  (function (TestStage) {
5
6
  TestStage[TestStage["NoStage"] = 0] = "NoStage";
@@ -7,3 +8,5 @@ var TestStage;
7
8
  TestStage[TestStage["Act"] = 2] = "Act";
8
9
  TestStage[TestStage["Assert"] = 3] = "Assert";
9
10
  })(TestStage = exports.TestStage || (exports.TestStage = {}));
11
+
12
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRlc3RTdGFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxJQUFZLFNBS1g7QUFMRCxXQUFZLFNBQVM7SUFDakIsK0NBQU8sQ0FBQTtJQUNQLCtDQUFPLENBQUE7SUFDUCx1Q0FBRyxDQUFBO0lBQ0gsNkNBQU0sQ0FBQTtBQUNWLENBQUMsRUFMVyxTQUFTLEdBQVQsaUJBQVMsS0FBVCxpQkFBUyxRQUtwQiIsImZpbGUiOiJUZXN0U3RhZ2UuanMiLCJzb3VyY2VSb290IjoiLi5cXHNyYyJ9
@@ -0,0 +1,2 @@
1
+ import { FunctionCodeRange } from "./Discover";
2
+ export declare function getFunctionCodeRange(func: Function, definingFunc: Function): FunctionCodeRange;
@@ -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=