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.
Files changed (56) hide show
  1. package/lib/Discover.d.ts +25 -0
  2. package/lib/Discover.js +4 -0
  3. package/lib/OptionsDefinitions.d.ts +16 -0
  4. package/lib/OptionsDefinitions.js +61 -0
  5. package/lib/StackTrace.d.ts +1 -0
  6. package/lib/StackTrace.js +44 -0
  7. package/lib/Suite.d.ts +46 -0
  8. package/lib/Suite.js +113 -0
  9. package/lib/SuiteProvider.d.ts +9 -0
  10. package/lib/SuiteProvider.js +88 -0
  11. package/lib/Test.d.ts +10 -6
  12. package/lib/Test.js +24 -12
  13. package/lib/TestStage.d.ts +1 -1
  14. package/lib/TestStage.js +2 -1
  15. package/lib/code-position-resolution.d.ts +2 -0
  16. package/lib/code-position-resolution.js +50 -0
  17. package/lib/examples/dir-suite/@test-suite +0 -0
  18. package/lib/examples/dir-suite/child-dir-suite/@test-suite +0 -0
  19. package/lib/{exampleTestFile.test.d.ts → examples/dir-suite/child-dir-suite/childDirTests.test.d.ts} +0 -0
  20. package/lib/examples/dir-suite/child-dir-suite/childDirTests.test.js +9 -0
  21. package/lib/examples/dir-suite/inDirSuite.test.d.ts +2 -0
  22. package/lib/examples/dir-suite/inDirSuite.test.js +9 -0
  23. package/lib/examples/dir-suite/just-a-folder/inJustAFolderTest.d.ts +2 -0
  24. package/lib/examples/dir-suite/just-a-folder/inJustAFolderTest.js +9 -0
  25. package/lib/examples/exampleTestFile.test.d.ts +2 -0
  26. package/lib/examples/exampleTestFile.test.js +60 -0
  27. package/lib/help.d.ts +1 -1
  28. package/lib/help.js +2 -1
  29. package/lib/index.d.ts +1 -0
  30. package/lib/index.js +118 -54
  31. package/lib/reporters/JsonReporter.d.ts +20 -0
  32. package/lib/reporters/JsonReporter.js +39 -0
  33. package/lib/reporters/Reporter.d.ts +4 -0
  34. package/lib/reporters/Reporter.js +4 -0
  35. package/lib/reporters/SpecReporter.d.ts +14 -0
  36. package/lib/reporters/SpecReporter.js +85 -0
  37. package/lib/reporters/index.d.ts +3 -0
  38. package/lib/reporters/index.js +17 -0
  39. package/lib/run-results/SuiteRunResult.d.ts +11 -0
  40. package/lib/run-results/SuiteRunResult.js +19 -0
  41. package/lib/run-results/TestRunResult.d.ts +9 -0
  42. package/lib/run-results/TestRunResult.js +15 -0
  43. package/lib/run-results/index.d.ts +2 -0
  44. package/lib/run-results/index.js +16 -0
  45. package/package.json +69 -64
  46. package/lib/OptionsDefinition.d.ts +0 -5
  47. package/lib/OptionsDefinition.js +0 -29
  48. package/lib/PerformancePolyfill.d.ts +0 -1
  49. package/lib/PerformancePolyfill.js +0 -16
  50. package/lib/SpecReporter.d.ts +0 -12
  51. package/lib/SpecReporter.js +0 -76
  52. package/lib/TestRunResult.d.ts +0 -9
  53. package/lib/TestRunResult.js +0 -13
  54. package/lib/TestSuiteClass.d.ts +0 -28
  55. package/lib/TestSuiteClass.js +0 -78
  56. package/lib/exampleTestFile.test.js +0 -59
package/package.json CHANGED
@@ -1,64 +1,69 @@
1
- {
2
- "name": "just-test-node",
3
- "version": "1.5.0",
4
- "description": "just-test on node.",
5
- "main": "./lib/index.js",
6
- "typings": "./lib/index.d.ts",
7
- "files": [
8
- "lib/"
9
- ],
10
- "scripts": {
11
- "test": "gulp build && node ./lib/index.js",
12
- "build": "gulp build",
13
- "prepublishOnly": "gulp clean && gulp build"
14
- },
15
- "author": {
16
- "name": "Itay Ronen",
17
- "url": "https://gitlab.com/itayronen"
18
- },
19
- "homepage": "https://gitlab.com/itayronen/just-test-node",
20
- "repository": {
21
- "type": "git",
22
- "url": "https://gitlab.com/itayronen/just-test-node.git"
23
- },
24
- "license": "MIT",
25
- "keywords": [
26
- "test",
27
- "testing",
28
- "unit",
29
- "unit-test",
30
- "unittest",
31
- "just-test",
32
- "es",
33
- "es6",
34
- "node",
35
- "typescript"
36
- ],
37
- "publishConfig": {
38
- "registry": "https://registry.npmjs.org/"
39
- },
40
- "bin": {
41
- "just-test": "./lib/index.js",
42
- "just-test-node": "./lib/index.js"
43
- },
44
- "dependencies": {
45
- "chalk": "^2.4.1",
46
- "command-line-args": "^5.0.2",
47
- "glob": "^7.1.2",
48
- "itay-events": "^2.1.4",
49
- "just-test-api": "^1.1.0"
50
- },
51
- "devDependencies": {
52
- "@types/chalk": "^2.2.0",
53
- "@types/command-line-args": "^5.0.0",
54
- "@types/glob": "^5.0.35",
55
- "del": "^3.0.0",
56
- "gulp": "^3.9.1",
57
- "gulp-read": "0.0.1",
58
- "gulp-sourcemaps": "^2.6.4",
59
- "gulp-typescript": "^4.0.2",
60
- "itay-gulp-changed": "^1.1.1",
61
- "merge2": "^1.2.2",
62
- "typescript": "^2.8.3"
63
- }
64
- }
1
+ {
2
+ "name": "just-test-node",
3
+ "version": "2.0.0-alpha.3",
4
+ "description": "just-test on node.",
5
+ "main": "./lib/index.js",
6
+ "typings": "./lib/index.d.ts",
7
+ "files": [
8
+ "lib/"
9
+ ],
10
+ "scripts": {
11
+ "build": "gulp build",
12
+ "prepublishOnly": "gulp clean && gulp build",
13
+ "test": "gulp build && node ./lib/index.js --directorySuitesGlob=./lib/**/@test-suite",
14
+ "test-json": "npm run test -- --reporter=json",
15
+ "test-json-partial": "npm run test -- --reporter=json \"Simple test\"",
16
+ "test-discover": "npm run test -- --discover",
17
+ "test-ts": "gulp build && ts-node ./src/index.ts --glob=./src/**/*.test.ts --directorySuitesGlob=./src/**/@test-suite",
18
+ "test-ts-discover": "npm run test-ts -- --discover"
19
+ },
20
+ "author": {
21
+ "name": "Itay Ronen",
22
+ "url": "https://gitlab.com/itayronen"
23
+ },
24
+ "homepage": "https://gitlab.com/itayronen/just-test-node",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://gitlab.com/itayronen/just-test-node.git"
28
+ },
29
+ "license": "MIT",
30
+ "keywords": [
31
+ "test",
32
+ "testing",
33
+ "unit",
34
+ "unit-test",
35
+ "unittest",
36
+ "just-test",
37
+ "es",
38
+ "es6",
39
+ "node",
40
+ "typescript"
41
+ ],
42
+ "publishConfig": {
43
+ "registry": "https://registry.npmjs.org/"
44
+ },
45
+ "bin": {
46
+ "just-test": "./lib/index.js",
47
+ "just-test-node": "./lib/index.js"
48
+ },
49
+ "dependencies": {
50
+ "chalk": "^4.1.2",
51
+ "command-line-args": "^5.2.0",
52
+ "glob": "^7.2.0",
53
+ "itay-events": "^3.0.1",
54
+ "just-test-api": "^2.0.1"
55
+ },
56
+ "devDependencies": {
57
+ "@types/chalk": "^2.2.0",
58
+ "@types/command-line-args": "^5.2.0",
59
+ "@types/glob": "^7.2.0",
60
+ "del": "^6.0.0",
61
+ "gulp": "^4.0.2",
62
+ "gulp-read": "^1.0.1",
63
+ "gulp-sourcemaps": "^3.0.0",
64
+ "gulp-typescript": "^5.0.1",
65
+ "itay-gulp-changed": "^1.2.0",
66
+ "merge2": "^1.4.1",
67
+ "typescript": "^4.5.2"
68
+ }
69
+ }
@@ -1,5 +0,0 @@
1
- import * as args from "command-line-args";
2
- export interface OptionDefinition extends args.OptionDefinition {
3
- description: string;
4
- }
5
- export declare const optionsDefinitions: OptionDefinition[];
@@ -1,29 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.optionsDefinitions = [
4
- {
5
- name: 'glob', alias: 'g',
6
- type: String,
7
- defaultValue: "./!(node_modules)/**/*.test.js",
8
- description: "Test files glob pattern."
9
- },
10
- {
11
- name: "filter", alias: "f",
12
- type: String,
13
- defaultOption: true,
14
- defaultValue: "",
15
- description: "Filters tests."
16
- },
17
- {
18
- name: 'help', alias: 'h',
19
- type: Boolean,
20
- description: "Show help."
21
- },
22
- {
23
- name: 'debug',
24
- type: Boolean,
25
- description: "Debug mode. Will disable timeouts."
26
- }
27
- ];
28
-
29
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk9wdGlvbnNEZWZpbml0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBTWEsUUFBQSxrQkFBa0IsR0FBdUI7SUFDckQ7UUFDQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHO1FBQ3hCLElBQUksRUFBRSxNQUFNO1FBQ1osWUFBWSxFQUFFLGdDQUFnQztRQUM5QyxXQUFXLEVBQUUsMEJBQTBCO0tBQ3ZDO0lBQ0Q7UUFDQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHO1FBQzFCLElBQUksRUFBRSxNQUFNO1FBQ1osYUFBYSxFQUFFLElBQUk7UUFDbkIsWUFBWSxFQUFFLEVBQUU7UUFDaEIsV0FBVyxFQUFFLGdCQUFnQjtLQUM3QjtJQUNEO1FBQ0MsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRztRQUN4QixJQUFJLEVBQUUsT0FBTztRQUNiLFdBQVcsRUFBRSxZQUFZO0tBQ3pCO0lBQ0Q7UUFDQyxJQUFJLEVBQUUsT0FBTztRQUNiLElBQUksRUFBRSxPQUFPO1FBQ2IsV0FBVyxFQUFFLG9DQUFvQztLQUNqRDtDQUNELENBQUMiLCJmaWxlIjoiT3B0aW9uc0RlZmluaXRpb24uanMiLCJzb3VyY2VSb290IjoiLi5cXHNyYyJ9
@@ -1 +0,0 @@
1
- export declare function polyfillPerformance(): void;
@@ -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=
@@ -1,59 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- function someFunction() { }
4
- function default_1(suite) {
5
- suite.describe("Some suite title", suite => {
6
- suite.describe("Pass suite", suite => {
7
- suite.test("Nothing", t => {
8
- });
9
- suite.test("Async", async (t) => {
10
- await Promise.resolve("Hi");
11
- });
12
- suite.describe(someFunction, suite => {
13
- suite.test("Nothing", t => {
14
- });
15
- });
16
- });
17
- suite.describe("Fail suite", suite => {
18
- suite.test("No stage error", t => {
19
- throw "asdf";
20
- });
21
- suite.test("Arrage error", t => {
22
- t.arrange();
23
- throw "asdf";
24
- });
25
- suite.test("Act error", t => {
26
- t.act();
27
- throw "asdf";
28
- });
29
- suite.test("Assert error", t => {
30
- t.assert();
31
- throw "asdf";
32
- });
33
- suite.test("Throw Error", t => {
34
- t.assert();
35
- throw new Error("Some error message.");
36
- });
37
- suite.test("Throws after await", async (t) => {
38
- await new Promise(r => setTimeout(r, 1));
39
- t.assert();
40
- throw "error";
41
- });
42
- suite.test("Timeout reached.", async (t) => {
43
- t.timeout = 1;
44
- await new Promise(r => setTimeout(r, 100));
45
- });
46
- });
47
- suite.describe("Pass suite 2", suite => {
48
- suite.test("Nothing", t => {
49
- });
50
- });
51
- });
52
- suite.describe("Some suite title2", suite => {
53
- suite.test("Nothing", t => {
54
- });
55
- });
56
- }
57
- exports.default = default_1;
58
-
59
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV4YW1wbGVUZXN0RmlsZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsMEJBQTBCLENBQUM7QUFFM0IsbUJBQXlCLEtBQWdCO0lBQ3hDLEtBQUssQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFFMUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFFcEMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDMUIsQ0FBQyxDQUFDLENBQUM7WUFFSCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsQ0FBQyxFQUFDLEVBQUU7Z0JBQzdCLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQztZQUVILEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUNwQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRTtnQkFDMUIsQ0FBQyxDQUFDLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFFcEMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsRUFBRTtnQkFDaEMsTUFBTSxNQUFNLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQztZQUVILEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUM5QixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ1osTUFBTSxNQUFNLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQztZQUVILEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUMzQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxNQUFNLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQztZQUVILEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUM5QixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxNQUFNLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQztZQUVILEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUM3QixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBRUgsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLEVBQUMsQ0FBQyxFQUFDLEVBQUU7Z0JBQzFDLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRXpDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWCxNQUFNLE9BQU8sQ0FBQztZQUNmLENBQUMsQ0FBQyxDQUFDO1lBRUgsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLEVBQUMsQ0FBQyxFQUFDLEVBQUU7Z0JBQ3hDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO2dCQUNkLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEtBQUssQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBRXRDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQzFCLENBQUMsQ0FBQyxDQUFDO1FBRUosQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUVILEtBQUssQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDM0MsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUU7UUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFyRUQsNEJBcUVDIiwiZmlsZSI6ImV4YW1wbGVUZXN0RmlsZS50ZXN0LmpzIiwic291cmNlUm9vdCI6Ii4uXFxzcmMifQ==