velocious 1.0.643 → 1.0.645
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -10
- package/build/authorization/ability.js +36 -13
- package/build/background-jobs/adapter.js +9 -0
- package/build/background-jobs/main.js +35 -10
- package/build/background-jobs/store.js +217 -38
- package/build/background-jobs/types.js +15 -0
- package/build/configuration-types.js +1 -1
- package/build/configuration.js +45 -9
- package/build/database/drivers/base-column.js +8 -0
- package/build/database/drivers/mssql/sql/update.js +1 -3
- package/build/database/drivers/mysql/sql/update.js +1 -3
- package/build/database/drivers/pgsql/column.js +22 -0
- package/build/database/drivers/pgsql/sql/update.js +1 -3
- package/build/database/drivers/sqlite/sql/alter-table.js +11 -1
- package/build/database/drivers/sqlite/sql/update.js +1 -3
- package/build/database/query/index.js +2 -2
- package/build/database/query/model-class-query.js +26 -10
- package/build/database/query/preloader/has-many.js +4 -1
- package/build/database/query/query-data.js +2 -1
- package/build/database/query/update-base.js +14 -0
- package/build/database/query/with-count.js +3 -1
- package/build/database/record/acts-as-list.js +37 -13
- package/build/database/record/attachments/store.js +336 -26
- package/build/database/record/auditing.js +6 -3
- package/build/database/record/index.js +197 -42
- package/build/database/record/instance-relationships/belongs-to.js +2 -1
- package/build/database/record/validators/uniqueness.js +8 -5
- package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
- package/build/frontend-model-controller.js +136 -53
- package/build/frontend-model-resource/base-resource.js +87 -37
- package/build/frontend-model-resource/velocious-attachment-resource.js +98 -31
- package/build/frontend-models/base.js +307 -59
- package/build/frontend-models/preloader.js +6 -3
- package/build/frontend-models/query.js +15 -6
- package/build/frontend-models/resource-definition.js +21 -2
- package/build/frontend-models/use-destroyed-event.js +1 -1
- package/build/frontend-models/use-model-class-event.js +2 -2
- package/build/frontend-models/use-updated-event.js +1 -1
- package/build/frontend-models/websocket-channel.js +256 -93
- package/build/frontend-models/websocket-publishers.js +218 -18
- package/build/http-server/client/websocket-session.js +13 -1
- package/build/http-server/websocket-channel.js +15 -2
- package/build/src/authorization/ability.d.ts +9 -3
- package/build/src/authorization/ability.d.ts.map +1 -1
- package/build/src/authorization/ability.js +33 -14
- package/build/src/background-jobs/adapter.d.ts +6 -0
- package/build/src/background-jobs/adapter.d.ts.map +1 -1
- package/build/src/background-jobs/adapter.js +9 -1
- package/build/src/background-jobs/main.d.ts +6 -0
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +34 -11
- package/build/src/background-jobs/store.d.ts +66 -12
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +191 -35
- package/build/src/background-jobs/types.d.ts +55 -0
- package/build/src/background-jobs/types.d.ts.map +1 -1
- package/build/src/background-jobs/types.js +16 -1
- package/build/src/configuration-types.d.ts +3 -3
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +2 -2
- package/build/src/configuration.d.ts +18 -8
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +38 -7
- package/build/src/database/drivers/base-column.d.ts +5 -0
- package/build/src/database/drivers/base-column.d.ts.map +1 -1
- package/build/src/database/drivers/base-column.js +8 -1
- package/build/src/database/drivers/mssql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/sql/update.js +2 -4
- package/build/src/database/drivers/mysql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/sql/update.js +2 -4
- package/build/src/database/drivers/pgsql/column.d.ts +5 -0
- package/build/src/database/drivers/pgsql/column.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/column.js +19 -1
- package/build/src/database/drivers/pgsql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/sql/update.js +2 -4
- package/build/src/database/drivers/sqlite/sql/alter-table.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/alter-table.js +6 -2
- package/build/src/database/drivers/sqlite/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/update.js +2 -4
- package/build/src/database/query/index.d.ts +4 -4
- package/build/src/database/query/index.d.ts.map +1 -1
- package/build/src/database/query/index.js +3 -3
- package/build/src/database/query/model-class-query.d.ts +8 -2
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +25 -11
- package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
- package/build/src/database/query/preloader/has-many.js +4 -2
- package/build/src/database/query/query-data.d.ts.map +1 -1
- package/build/src/database/query/query-data.js +3 -2
- package/build/src/database/query/update-base.d.ts +7 -0
- package/build/src/database/query/update-base.d.ts.map +1 -1
- package/build/src/database/query/update-base.js +13 -1
- package/build/src/database/query/with-count.d.ts.map +1 -1
- package/build/src/database/query/with-count.js +3 -2
- package/build/src/database/record/acts-as-list.d.ts.map +1 -1
- package/build/src/database/record/acts-as-list.js +35 -14
- package/build/src/database/record/attachments/store.d.ts +67 -0
- package/build/src/database/record/attachments/store.d.ts.map +1 -1
- package/build/src/database/record/attachments/store.js +301 -25
- package/build/src/database/record/auditing.d.ts.map +1 -1
- package/build/src/database/record/auditing.js +7 -4
- package/build/src/database/record/index.d.ts +78 -26
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +171 -42
- package/build/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/belongs-to.js +3 -2
- package/build/src/database/record/validators/uniqueness.d.ts.map +1 -1
- package/build/src/database/record/validators/uniqueness.js +8 -6
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +4 -4
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -12
- package/build/src/frontend-model-controller.d.ts +29 -8
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +122 -51
- package/build/src/frontend-model-resource/base-resource.d.ts +51 -24
- package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/base-resource.js +83 -37
- package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts +45 -26
- package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/velocious-attachment-resource.js +89 -31
- package/build/src/frontend-models/base.d.ts +53 -20
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +275 -59
- package/build/src/frontend-models/preloader.d.ts.map +1 -1
- package/build/src/frontend-models/preloader.js +6 -4
- package/build/src/frontend-models/query.d.ts +2 -2
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +14 -7
- package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
- package/build/src/frontend-models/resource-definition.js +20 -3
- package/build/src/frontend-models/use-destroyed-event.d.ts +1 -1
- package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-destroyed-event.js +2 -2
- package/build/src/frontend-models/use-model-class-event.d.ts +2 -2
- package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-model-class-event.js +3 -3
- package/build/src/frontend-models/use-updated-event.d.ts +1 -1
- package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-updated-event.js +2 -2
- package/build/src/frontend-models/websocket-channel.d.ts +60 -41
- package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-channel.js +225 -85
- package/build/src/frontend-models/websocket-publishers.d.ts +9 -0
- package/build/src/frontend-models/websocket-publishers.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-publishers.js +190 -19
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-session.js +11 -2
- package/build/src/http-server/websocket-channel.d.ts +20 -8
- package/build/src/http-server/websocket-channel.d.ts.map +1 -1
- package/build/src/http-server/websocket-channel.js +15 -3
- package/build/src/sync/assets/cache.d.ts +288 -0
- package/build/src/sync/assets/cache.d.ts.map +1 -0
- package/build/src/sync/assets/cache.js +883 -0
- package/build/src/sync/assets/types.d.ts +199 -0
- package/build/src/sync/assets/types.d.ts.map +1 -0
- package/build/src/sync/assets/types.js +56 -0
- package/build/src/sync/sync-api-client.d.ts.map +1 -1
- package/build/src/sync/sync-api-client.js +4 -3
- package/build/src/sync/sync-client.d.ts.map +1 -1
- package/build/src/sync/sync-client.js +3 -2
- package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
- package/build/src/sync/sync-envelope-replay-service.js +6 -5
- package/build/src/sync/sync-publisher.d.ts.map +1 -1
- package/build/src/sync/sync-publisher.js +4 -3
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +2 -2
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +3 -3
- package/build/src/testing/test-profiler.d.ts +4 -4
- package/build/src/testing/test-profiler.d.ts.map +1 -1
- package/build/src/testing/test-profiler.js +3 -3
- package/build/src/testing/test-runner.d.ts +279 -117
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +503 -933
- package/build/src/testing/test.d.ts +11 -72
- package/build/src/testing/test.d.ts.map +1 -1
- package/build/src/testing/test.js +131 -284
- package/build/src/testing/velocious-attempt-executor.d.ts +54 -0
- package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -0
- package/build/src/testing/velocious-attempt-executor.js +408 -0
- package/build/src/testing/velocious-runner-reporter.d.ts +67 -0
- package/build/src/testing/velocious-runner-reporter.d.ts.map +1 -0
- package/build/src/testing/velocious-runner-reporter.js +240 -0
- package/build/src/testing/velocious-suite-hook-executor.d.ts +19 -0
- package/build/src/testing/velocious-suite-hook-executor.d.ts.map +1 -0
- package/build/src/testing/velocious-suite-hook-executor.js +41 -0
- package/build/src/testing/velocious-test-arguments.d.ts +39 -0
- package/build/src/testing/velocious-test-arguments.d.ts.map +1 -0
- package/build/src/testing/velocious-test-arguments.js +55 -0
- package/build/src/utils/model-primary-key.d.ts +73 -0
- package/build/src/utils/model-primary-key.d.ts.map +1 -0
- package/build/src/utils/model-primary-key.js +144 -0
- package/build/src/utils/sha256-bytes-hex.d.ts +7 -0
- package/build/src/utils/sha256-bytes-hex.d.ts.map +1 -0
- package/build/src/utils/sha256-bytes-hex.js +117 -0
- package/build/src/utils/sha256-hex.d.ts +2 -4
- package/build/src/utils/sha256-hex.d.ts.map +1 -1
- package/build/src/utils/sha256-hex.js +6 -120
- package/build/sync/assets/cache.js +998 -0
- package/build/sync/assets/types.js +62 -0
- package/build/sync/sync-api-client.js +3 -2
- package/build/sync/sync-client.js +2 -1
- package/build/sync/sync-envelope-replay-service.js +5 -4
- package/build/sync/sync-publisher.js +3 -2
- package/build/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
- package/build/testing/test-profiler.js +2 -2
- package/build/testing/test-runner.js +496 -990
- package/build/testing/test.js +164 -306
- package/build/testing/velocious-attempt-executor.js +441 -0
- package/build/testing/velocious-runner-reporter.js +264 -0
- package/build/testing/velocious-suite-hook-executor.js +43 -0
- package/build/testing/velocious-test-arguments.js +64 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/utils/model-primary-key.js +171 -0
- package/build/utils/sha256-bytes-hex.js +132 -0
- package/build/utils/sha256-hex.js +7 -135
- package/package.json +5 -4
- package/src/authorization/ability.js +36 -13
- package/src/background-jobs/adapter.js +9 -0
- package/src/background-jobs/main.js +35 -10
- package/src/background-jobs/store.js +217 -38
- package/src/background-jobs/types.js +15 -0
- package/src/configuration-types.js +1 -1
- package/src/configuration.js +45 -9
- package/src/database/drivers/base-column.js +8 -0
- package/src/database/drivers/mssql/sql/update.js +1 -3
- package/src/database/drivers/mysql/sql/update.js +1 -3
- package/src/database/drivers/pgsql/column.js +22 -0
- package/src/database/drivers/pgsql/sql/update.js +1 -3
- package/src/database/drivers/sqlite/sql/alter-table.js +11 -1
- package/src/database/drivers/sqlite/sql/update.js +1 -3
- package/src/database/query/index.js +2 -2
- package/src/database/query/model-class-query.js +26 -10
- package/src/database/query/preloader/has-many.js +4 -1
- package/src/database/query/query-data.js +2 -1
- package/src/database/query/update-base.js +14 -0
- package/src/database/query/with-count.js +3 -1
- package/src/database/record/acts-as-list.js +37 -13
- package/src/database/record/attachments/store.js +336 -26
- package/src/database/record/auditing.js +6 -3
- package/src/database/record/index.js +197 -42
- package/src/database/record/instance-relationships/belongs-to.js +2 -1
- package/src/database/record/validators/uniqueness.js +8 -5
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
- package/src/frontend-model-controller.js +136 -53
- package/src/frontend-model-resource/base-resource.js +87 -37
- package/src/frontend-model-resource/velocious-attachment-resource.js +98 -31
- package/src/frontend-models/base.js +307 -59
- package/src/frontend-models/preloader.js +6 -3
- package/src/frontend-models/query.js +15 -6
- package/src/frontend-models/resource-definition.js +21 -2
- package/src/frontend-models/use-destroyed-event.js +1 -1
- package/src/frontend-models/use-model-class-event.js +2 -2
- package/src/frontend-models/use-updated-event.js +1 -1
- package/src/frontend-models/websocket-channel.js +256 -93
- package/src/frontend-models/websocket-publishers.js +218 -18
- package/src/http-server/client/websocket-session.js +13 -1
- package/src/http-server/websocket-channel.js +15 -2
- package/src/sync/assets/cache.js +998 -0
- package/src/sync/assets/types.js +62 -0
- package/src/sync/sync-api-client.js +3 -2
- package/src/sync/sync-client.js +2 -1
- package/src/sync/sync-envelope-replay-service.js +5 -4
- package/src/sync/sync-publisher.js +3 -2
- package/src/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
- package/src/testing/test-profiler.js +2 -2
- package/src/testing/test-runner.js +496 -990
- package/src/testing/test.js +164 -306
- package/src/testing/velocious-attempt-executor.js +441 -0
- package/src/testing/velocious-runner-reporter.js +264 -0
- package/src/testing/velocious-suite-hook-executor.js +43 -0
- package/src/testing/velocious-test-arguments.js +64 -0
- package/src/utils/model-primary-key.js +171 -0
- package/src/utils/sha256-bytes-hex.js +132 -0
- package/src/utils/sha256-hex.js +7 -135
- package/build/src/testing/testing-package-adapter.d.ts +0 -9
- package/build/src/testing/testing-package-adapter.d.ts.map +0 -1
- package/build/src/testing/testing-package-adapter.js +0 -69
- package/build/testing/testing-package-adapter.js +0 -76
- package/src/testing/testing-package-adapter.js +0 -76
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
-
import
|
|
3
|
-
import { fileURLToPath } from "url";
|
|
4
|
-
import { defaultTestContext, waitForEvent } from "@velocious/testing";
|
|
2
|
+
import { afterAll, afterEach, beforeAll, beforeEach, configureTests, defaultTestContext, describe, fdescribe, fit, it, test, waitForEvent, xdescribe, xit, xtest } from "@velocious/testing";
|
|
5
3
|
import EventEmitter from "../utils/event-emitter.js";
|
|
6
4
|
import Expect from "./expect.js";
|
|
7
5
|
import { arrayContaining, objectContaining } from "./expect-utils.js";
|
|
6
|
+
/** @typedef {(typeof defaultTestContext.registry.suites)[number]} PackageSuiteDeclaration */
|
|
8
7
|
/**
|
|
9
8
|
* VelociousTestConfig type.
|
|
10
9
|
* @typedef {object} VelociousTestConfig
|
|
@@ -13,224 +12,6 @@ import { arrayContaining, objectContaining } from "./expect-utils.js";
|
|
|
13
12
|
* @property {number} defaultTimeoutSeconds - Default timeout in seconds.
|
|
14
13
|
* @property {number} failedConsoleOutputMaxLines - Maximum failed console lines to print inline.
|
|
15
14
|
*/
|
|
16
|
-
/**
|
|
17
|
-
* Tests.
|
|
18
|
-
* @type {import("./test-runner.js").TestsArgument} */
|
|
19
|
-
const tests = {
|
|
20
|
-
/**
|
|
21
|
-
* Narrows the runtime value to the documented type.
|
|
22
|
-
* @type {import("./test-runner.js").AfterBeforeEachCallbackObjectType[]} */
|
|
23
|
-
afterEaches: [],
|
|
24
|
-
/**
|
|
25
|
-
* Narrows the runtime value to the documented type.
|
|
26
|
-
* @type {import("./test-runner.js").BeforeAfterAllCallbackObjectType[]} */
|
|
27
|
-
afterAlls: [],
|
|
28
|
-
args: { databaseCleaning: { transaction: true } },
|
|
29
|
-
/**
|
|
30
|
-
* Narrows the runtime value to the documented type.
|
|
31
|
-
* @type {import("./test-runner.js").BeforeAfterAllCallbackObjectType[]} */
|
|
32
|
-
beforeAlls: [],
|
|
33
|
-
/**
|
|
34
|
-
* Narrows the runtime value to the documented type.
|
|
35
|
-
* @type {import("./test-runner.js").AfterBeforeEachCallbackObjectType[]} */
|
|
36
|
-
beforeEaches: [],
|
|
37
|
-
filePath: undefined,
|
|
38
|
-
line: undefined,
|
|
39
|
-
subs: {},
|
|
40
|
-
tests: {}
|
|
41
|
-
};
|
|
42
|
-
const testEvents = new EventEmitter();
|
|
43
|
-
let currentPath = [tests];
|
|
44
|
-
/**
|
|
45
|
-
* Runs capture location.
|
|
46
|
-
* @returns {{filePath?: string, line?: number}} - Location.
|
|
47
|
-
*/
|
|
48
|
-
function captureLocation() {
|
|
49
|
-
const error = new Error();
|
|
50
|
-
const stack = typeof error.stack === "string" ? error.stack.split("\n") : [];
|
|
51
|
-
for (const line of stack) {
|
|
52
|
-
const trimmed = line.trim();
|
|
53
|
-
if (!trimmed.includes("at"))
|
|
54
|
-
continue;
|
|
55
|
-
if (trimmed.includes("/src/testing/test.js"))
|
|
56
|
-
continue;
|
|
57
|
-
if (trimmed.includes("/@velocious/testing/"))
|
|
58
|
-
continue;
|
|
59
|
-
const match = trimmed.match(/(?:\(|\s)(file:\/\/.*?|\/.*?):(\d+):(\d+)\)?$/);
|
|
60
|
-
if (!match)
|
|
61
|
-
continue;
|
|
62
|
-
const rawPath = match[1];
|
|
63
|
-
const lineNumber = Number(match[2]);
|
|
64
|
-
const filePath = rawPath.startsWith("file://")
|
|
65
|
-
? fileURLToPath(rawPath)
|
|
66
|
-
: rawPath;
|
|
67
|
-
return {
|
|
68
|
-
filePath: path.resolve(filePath),
|
|
69
|
-
line: Number.isFinite(lineNumber) ? lineNumber : undefined
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
return {};
|
|
73
|
-
}
|
|
74
|
-
defaultTestContext.setDeclarationLocator(captureLocation);
|
|
75
|
-
/**
|
|
76
|
-
* Runs normalize tags.
|
|
77
|
-
* @param {string[] | string | undefined} tags - Tags.
|
|
78
|
-
* @returns {string[]} - Normalized tags.
|
|
79
|
-
*/
|
|
80
|
-
function normalizeTags(tags) {
|
|
81
|
-
if (!tags)
|
|
82
|
-
return [];
|
|
83
|
-
const values = [];
|
|
84
|
-
const rawTags = Array.isArray(tags) ? tags : [tags];
|
|
85
|
-
for (const rawTag of rawTags) {
|
|
86
|
-
if (rawTag === undefined || rawTag === null)
|
|
87
|
-
continue;
|
|
88
|
-
const parts = String(rawTag).split(",");
|
|
89
|
-
for (const part of parts) {
|
|
90
|
-
const trimmed = part.trim();
|
|
91
|
-
if (trimmed)
|
|
92
|
-
values.push(trimmed);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return Array.from(new Set(values));
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Test config.
|
|
99
|
-
* @type {VelociousTestConfig} */
|
|
100
|
-
const testConfig = {
|
|
101
|
-
consoleOutput: "failure",
|
|
102
|
-
failedConsoleOutputMaxLines: 200,
|
|
103
|
-
excludeTags: [],
|
|
104
|
-
defaultTimeoutSeconds: 60
|
|
105
|
-
};
|
|
106
|
-
/**
|
|
107
|
-
* Runs configure tests.
|
|
108
|
-
* @param {object} args - Options.
|
|
109
|
-
* @param {"failure" | "live"} [args.consoleOutput] - Console output mode.
|
|
110
|
-
* @param {string[] | string} [args.excludeTags] - Tags to exclude.
|
|
111
|
-
* @param {number} [args.defaultTimeoutSeconds] - Default timeout in seconds.
|
|
112
|
-
* @param {number} [args.failedConsoleOutputMaxLines] - Maximum failed console lines to print inline.
|
|
113
|
-
* @returns {void}
|
|
114
|
-
*/
|
|
115
|
-
function configureTests({ consoleOutput, excludeTags, defaultTimeoutSeconds, failedConsoleOutputMaxLines } = {}) {
|
|
116
|
-
if (excludeTags !== undefined) {
|
|
117
|
-
testConfig.excludeTags = normalizeTags(excludeTags);
|
|
118
|
-
}
|
|
119
|
-
if (consoleOutput !== undefined) {
|
|
120
|
-
if (consoleOutput !== "failure" && consoleOutput !== "live") {
|
|
121
|
-
throw new Error(`Invalid consoleOutput config: ${consoleOutput}`);
|
|
122
|
-
}
|
|
123
|
-
testConfig.consoleOutput = consoleOutput;
|
|
124
|
-
}
|
|
125
|
-
if (typeof defaultTimeoutSeconds === "number") {
|
|
126
|
-
testConfig.defaultTimeoutSeconds = defaultTimeoutSeconds;
|
|
127
|
-
}
|
|
128
|
-
if (typeof failedConsoleOutputMaxLines === "number") {
|
|
129
|
-
testConfig.failedConsoleOutputMaxLines = failedConsoleOutputMaxLines;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Runs merge test args.
|
|
134
|
-
* @param {Record<string, ReturnType<typeof JSON.parse>>} baseArgs - Base args.
|
|
135
|
-
* @param {Record<string, ReturnType<typeof JSON.parse>>} extraArgs - Extra args.
|
|
136
|
-
* @returns {Record<string, ReturnType<typeof JSON.parse>>} - Merged args.
|
|
137
|
-
*/
|
|
138
|
-
function mergeTestArgs(baseArgs, extraArgs) {
|
|
139
|
-
const merged = Object.assign({}, baseArgs, extraArgs);
|
|
140
|
-
const mergedTags = [...normalizeTags(baseArgs?.tags), ...normalizeTags(extraArgs?.tags)];
|
|
141
|
-
if (mergedTags.length > 0) {
|
|
142
|
-
merged.tags = Array.from(new Set(mergedTags));
|
|
143
|
-
}
|
|
144
|
-
else if ("tags" in merged) {
|
|
145
|
-
delete merged.tags;
|
|
146
|
-
}
|
|
147
|
-
return merged;
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Runs before each.
|
|
151
|
-
* @param {import("./test-runner.js").AfterBeforeEachCallbackType} callback - Callback function.
|
|
152
|
-
* @returns {void} - No return value.
|
|
153
|
-
*/
|
|
154
|
-
function beforeEach(callback) {
|
|
155
|
-
const currentTest = currentPath[currentPath.length - 1];
|
|
156
|
-
currentTest.beforeEaches.push({ callback });
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Runs before all.
|
|
160
|
-
* @param {import("./test-runner.js").BeforeAfterAllCallbackType} callback - Callback function.
|
|
161
|
-
* @returns {void} - No return value.
|
|
162
|
-
*/
|
|
163
|
-
function beforeAll(callback) {
|
|
164
|
-
const currentTest = currentPath[currentPath.length - 1];
|
|
165
|
-
currentTest.beforeAlls.push({ callback });
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Runs after each.
|
|
169
|
-
* @param {import("./test-runner.js").AfterBeforeEachCallbackType} callback - Callback function.
|
|
170
|
-
* @returns {void} - No return value.
|
|
171
|
-
*/
|
|
172
|
-
function afterEach(callback) {
|
|
173
|
-
const currentTest = currentPath[currentPath.length - 1];
|
|
174
|
-
currentTest.afterEaches.push({ callback });
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Runs after all.
|
|
178
|
-
* @param {import("./test-runner.js").BeforeAfterAllCallbackType} callback - Callback function.
|
|
179
|
-
* @returns {void} - No return value.
|
|
180
|
-
*/
|
|
181
|
-
function afterAll(callback) {
|
|
182
|
-
const currentTest = currentPath[currentPath.length - 1];
|
|
183
|
-
currentTest.afterAlls.push({ callback });
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Runs describe.
|
|
187
|
-
* @param {string} description - Description.
|
|
188
|
-
* @param {object|(() => (void|Promise<void>))} arg1 - Arg1.
|
|
189
|
-
* @param {undefined|(() => (void|Promise<void>))} [arg2] - Arg2.
|
|
190
|
-
* @returns {Promise<void>} - Resolves when complete.
|
|
191
|
-
*/
|
|
192
|
-
async function describe(description, arg1, arg2) {
|
|
193
|
-
/**
|
|
194
|
-
* Defines testArgs.
|
|
195
|
-
* @type {Record<string, ReturnType<typeof JSON.parse>>} */
|
|
196
|
-
let testArgs, testFunction;
|
|
197
|
-
if (typeof arg2 == "function") {
|
|
198
|
-
testFunction = arg2;
|
|
199
|
-
testArgs = arg1;
|
|
200
|
-
}
|
|
201
|
-
else if (typeof arg1 == "function") {
|
|
202
|
-
testFunction = arg1;
|
|
203
|
-
testArgs = {};
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
throw new Error(`Invalid arguments for describe: ${arg1}, ${arg2}`);
|
|
207
|
-
}
|
|
208
|
-
const currentTest = currentPath[currentPath.length - 1];
|
|
209
|
-
const newTestArgs = mergeTestArgs(currentTest.args, testArgs);
|
|
210
|
-
if (description in currentTest.subs) {
|
|
211
|
-
throw new Error(`Duplicate test description: ${description}`);
|
|
212
|
-
}
|
|
213
|
-
const location = captureLocation();
|
|
214
|
-
const newTestData = {
|
|
215
|
-
afterEaches: [],
|
|
216
|
-
afterAlls: [],
|
|
217
|
-
args: newTestArgs,
|
|
218
|
-
beforeAlls: [],
|
|
219
|
-
beforeEaches: [],
|
|
220
|
-
filePath: location.filePath,
|
|
221
|
-
line: location.line,
|
|
222
|
-
subs: {},
|
|
223
|
-
tests: {}
|
|
224
|
-
};
|
|
225
|
-
currentTest.subs[description] = newTestData;
|
|
226
|
-
currentPath.push(newTestData);
|
|
227
|
-
try {
|
|
228
|
-
await testFunction();
|
|
229
|
-
}
|
|
230
|
-
finally {
|
|
231
|
-
currentPath.pop();
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
15
|
/**
|
|
235
16
|
* Runs expect.
|
|
236
17
|
* @param {ReturnType<typeof JSON.parse>} arg - Arg.
|
|
@@ -241,73 +22,134 @@ function expect(arg) {
|
|
|
241
22
|
}
|
|
242
23
|
expect.objectContaining = objectContaining;
|
|
243
24
|
expect.arrayContaining = arrayContaining;
|
|
25
|
+
/** Velocious-owned awaited compatibility events. */
|
|
26
|
+
const testEvents = new EventEmitter();
|
|
244
27
|
/**
|
|
245
|
-
*
|
|
246
|
-
* @param {
|
|
247
|
-
* @
|
|
248
|
-
* @param {undefined|(() => (void|Promise<void>))} [arg2] - Arg2.
|
|
249
|
-
* @returns {void} - No return value.
|
|
28
|
+
* Detaches and freezes declaration metadata exposed by the compatibility view.
|
|
29
|
+
* @param {ReturnType<typeof JSON.parse>} value - Package declaration value.
|
|
30
|
+
* @returns {ReturnType<typeof JSON.parse>} - Immutable detached value.
|
|
250
31
|
*/
|
|
251
|
-
function
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
32
|
+
function readOnlySnapshot(value) {
|
|
33
|
+
if (Array.isArray(value))
|
|
34
|
+
return Object.freeze(value.map((entry) => readOnlySnapshot(entry)));
|
|
35
|
+
if (value === null || typeof value !== "object")
|
|
36
|
+
return value;
|
|
37
|
+
/** @type {Record<string, ReturnType<typeof JSON.parse>>} */
|
|
38
|
+
const projectedValue = {};
|
|
39
|
+
for (const [key, entry] of Object.entries(value))
|
|
40
|
+
projectedValue[key] = readOnlySnapshot(entry);
|
|
41
|
+
return Object.freeze(projectedValue);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Backward-compatible view of the package configuration.
|
|
45
|
+
* @type {VelociousTestConfig}
|
|
46
|
+
*/
|
|
47
|
+
const testConfig = {
|
|
48
|
+
get consoleOutput() { return defaultTestContext.config.consoleOutput; },
|
|
49
|
+
set consoleOutput(value) { defaultTestContext.configureTests({ consoleOutput: value }); },
|
|
50
|
+
get excludeTags() { return defaultTestContext.config.excludeTags; },
|
|
51
|
+
set excludeTags(value) { defaultTestContext.configureTests({ excludeTags: value }); },
|
|
52
|
+
get defaultTimeoutSeconds() { return defaultTestContext.config.defaultTimeoutMs / 1000; },
|
|
53
|
+
set defaultTimeoutSeconds(value) { defaultTestContext.configureTests({ defaultTimeoutSeconds: value }); },
|
|
54
|
+
get failedConsoleOutputMaxLines() { return defaultTestContext.config.failedConsoleOutputMaxLines; },
|
|
55
|
+
set failedConsoleOutputMaxLines(value) { defaultTestContext.configureTests({ failedConsoleOutputMaxLines: value }); }
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Projects one package suite into the deprecated legacy inspection shape.
|
|
59
|
+
* The returned objects are snapshots and never participate in execution.
|
|
60
|
+
* @param {PackageSuiteDeclaration} suite - Package declaration.
|
|
61
|
+
* @returns {import("./test-runner.js").TestsArgument} - Read-only compatibility snapshot.
|
|
62
|
+
*/
|
|
63
|
+
function projectSuite(suite) {
|
|
64
|
+
/** @type {Record<string, import("./test-runner.js").TestData>} */
|
|
65
|
+
const projectedTests = {};
|
|
66
|
+
/** @type {Record<string, import("./test-runner.js").TestsArgument>} */
|
|
67
|
+
const projectedSuites = {};
|
|
68
|
+
for (const declaration of suite.tests) {
|
|
69
|
+
const mutableArgs = { ...declaration.options };
|
|
70
|
+
if (mutableArgs.retry === undefined && typeof mutableArgs.retries === "number")
|
|
71
|
+
mutableArgs.retry = mutableArgs.retries;
|
|
72
|
+
if (mutableArgs.timeoutSeconds === undefined && typeof mutableArgs.timeoutMs === "number")
|
|
73
|
+
mutableArgs.timeoutSeconds = mutableArgs.timeoutMs / 1000;
|
|
74
|
+
projectedTests[declaration.name] = Object.freeze({
|
|
75
|
+
args: readOnlySnapshot(mutableArgs),
|
|
76
|
+
filePath: declaration.location.filePath,
|
|
77
|
+
function: declaration.callback,
|
|
78
|
+
line: declaration.location.line
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
for (const child of suite.suites)
|
|
82
|
+
projectedSuites[child.name] = projectSuite(child);
|
|
83
|
+
const projection = {
|
|
84
|
+
afterAlls: Object.freeze(suite.hooks.afterAll.map((hook) => Object.freeze({ callback: hook.callback }))),
|
|
85
|
+
afterEaches: Object.freeze(suite.hooks.afterEach.map((hook) => Object.freeze({ callback: hook.callback }))),
|
|
86
|
+
args: readOnlySnapshot(suite.options),
|
|
87
|
+
beforeAlls: Object.freeze(suite.hooks.beforeAll.map((hook) => Object.freeze({ callback: hook.callback }))),
|
|
88
|
+
beforeEaches: Object.freeze(suite.hooks.beforeEach.map((hook) => Object.freeze({ callback: hook.callback }))),
|
|
89
|
+
filePath: suite.location.filePath,
|
|
90
|
+
line: suite.location.line,
|
|
91
|
+
subs: Object.freeze(projectedSuites),
|
|
92
|
+
tests: Object.freeze(projectedTests)
|
|
279
93
|
};
|
|
94
|
+
// Narrows the immutable snapshot to the historical inspection contract.
|
|
95
|
+
return /** @type {import("./test-runner.js").TestsArgument} */ (Object.freeze(projection));
|
|
280
96
|
}
|
|
281
97
|
/**
|
|
282
|
-
*
|
|
283
|
-
*
|
|
284
|
-
* @param {object|(() => (void|Promise<void>))} arg1 - Arg1.
|
|
285
|
-
* @param {undefined|(() => (void|Promise<void>))} [arg2] - Arg2.
|
|
286
|
-
* @returns {void} - No return value.
|
|
98
|
+
* Deprecated read-only declaration projection. Package declarations in
|
|
99
|
+
* defaultTestContext are the sole execution source.
|
|
287
100
|
*/
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
|
|
101
|
+
/** @type {import("./test-runner.js").BeforeAfterAllCallbackObjectType[]} */
|
|
102
|
+
const emptyAfterAlls = [];
|
|
103
|
+
/** @type {import("./test-runner.js").AfterBeforeEachCallbackObjectType[]} */
|
|
104
|
+
const emptyAfterEaches = [];
|
|
105
|
+
/** @type {import("./test-runner.js").BeforeAfterAllCallbackObjectType[]} */
|
|
106
|
+
const emptyBeforeAlls = [];
|
|
107
|
+
/** @type {import("./test-runner.js").AfterBeforeEachCallbackObjectType[]} */
|
|
108
|
+
const emptyBeforeEaches = [];
|
|
109
|
+
const defaultTestArguments = { databaseCleaning: { transaction: true } };
|
|
110
|
+
Object.freeze(emptyAfterAlls);
|
|
111
|
+
Object.freeze(emptyAfterEaches);
|
|
112
|
+
Object.freeze(emptyBeforeAlls);
|
|
113
|
+
Object.freeze(emptyBeforeEaches);
|
|
114
|
+
Object.freeze(defaultTestArguments.databaseCleaning);
|
|
115
|
+
Object.freeze(defaultTestArguments);
|
|
116
|
+
const testsProjection = {
|
|
117
|
+
get afterAlls() { return emptyAfterAlls; },
|
|
118
|
+
get afterEaches() { return emptyAfterEaches; },
|
|
119
|
+
get args() { return defaultTestArguments; },
|
|
120
|
+
get beforeAlls() { return emptyBeforeAlls; },
|
|
121
|
+
get beforeEaches() { return emptyBeforeEaches; },
|
|
122
|
+
get filePath() { return undefined; },
|
|
123
|
+
get line() { return undefined; },
|
|
124
|
+
get subs() {
|
|
125
|
+
/** @type {Record<string, import("./test-runner.js").TestsArgument>} */
|
|
126
|
+
const projectedSuites = {};
|
|
127
|
+
for (const suite of defaultTestContext.registry.suites) {
|
|
128
|
+
if (suite.name === "") {
|
|
129
|
+
for (const childSuite of suite.suites)
|
|
130
|
+
projectedSuites[childSuite.name] = projectSuite(childSuite);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
projectedSuites[suite.name] = projectSuite(suite);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return Object.freeze(projectedSuites);
|
|
137
|
+
},
|
|
138
|
+
get tests() {
|
|
139
|
+
/** @type {Record<string, import("./test-runner.js").TestData>} */
|
|
140
|
+
const projectedTests = {};
|
|
141
|
+
for (const suite of defaultTestContext.registry.suites) {
|
|
142
|
+
if (suite.name !== "")
|
|
143
|
+
continue;
|
|
144
|
+
Object.assign(projectedTests, projectSuite(suite).tests);
|
|
145
|
+
}
|
|
146
|
+
return Object.freeze(projectedTests);
|
|
307
147
|
}
|
|
308
|
-
|
|
309
|
-
}
|
|
310
|
-
|
|
148
|
+
};
|
|
149
|
+
/** @type {import("./test-runner.js").TestsArgument} */
|
|
150
|
+
const tests = testsProjection;
|
|
151
|
+
Object.freeze(tests);
|
|
152
|
+
// Make the compatibility facade global so existing test files remain source-compatible.
|
|
311
153
|
Object.assign(globalThis, {
|
|
312
154
|
afterAll,
|
|
313
155
|
afterEach,
|
|
@@ -316,9 +158,14 @@ Object.assign(globalThis, {
|
|
|
316
158
|
configureTests,
|
|
317
159
|
describe,
|
|
318
160
|
expect,
|
|
161
|
+
fdescribe,
|
|
319
162
|
fit,
|
|
320
163
|
it,
|
|
321
|
-
|
|
164
|
+
test,
|
|
165
|
+
testEvents,
|
|
166
|
+
xdescribe,
|
|
167
|
+
xit,
|
|
168
|
+
xtest
|
|
322
169
|
});
|
|
323
|
-
export { afterAll, afterEach, beforeAll, beforeEach, configureTests, describe, expect, fit, it, arrayContaining, objectContaining, testConfig, testEvents, tests, waitForEvent };
|
|
324
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3Rlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUN2QixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sS0FBSyxDQUFBO0FBQ2pDLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUNuRSxPQUFPLFlBQVksTUFBTSwyQkFBMkIsQ0FBQTtBQUNwRCxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxFQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBRW5FOzs7Ozs7O0dBT0c7QUFDSDs7c0RBRXNEO0FBQ3RELE1BQU0sS0FBSyxHQUFHO0lBQ1o7O2dGQUU0RTtJQUM1RSxXQUFXLEVBQUUsRUFBRTtJQUNmOzsrRUFFMkU7SUFDM0UsU0FBUyxFQUFFLEVBQUU7SUFDYixJQUFJLEVBQUUsRUFBQyxnQkFBZ0IsRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUMsRUFBQztJQUU3Qzs7K0VBRTJFO0lBQzNFLFVBQVUsRUFBRSxFQUFFO0lBQ2Q7O2dGQUU0RTtJQUM1RSxZQUFZLEVBQUUsRUFBRTtJQUNoQixRQUFRLEVBQUUsU0FBUztJQUNuQixJQUFJLEVBQUUsU0FBUztJQUNmLElBQUksRUFBRSxFQUFFO0lBQ1IsS0FBSyxFQUFFLEVBQUU7Q0FDVixDQUFBO0FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtBQUVyQyxJQUFJLFdBQVcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBRXpCOzs7R0FHRztBQUNILFNBQVMsZUFBZTtJQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFBO0lBQ3pCLE1BQU0sS0FBSyxHQUFHLE9BQU8sS0FBSyxDQUFDLEtBQUss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UyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gXCJ1cmxcIlxuaW1wb3J0IHtkZWZhdWx0VGVzdENvbnRleHQsIHdhaXRGb3JFdmVudH0gZnJvbSBcIkB2ZWxvY2lvdXMvdGVzdGluZ1wiXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCIuLi91dGlscy9ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCBFeHBlY3QgZnJvbSBcIi4vZXhwZWN0LmpzXCJcbmltcG9ydCB7YXJyYXlDb250YWluaW5nLCBvYmplY3RDb250YWluaW5nfSBmcm9tIFwiLi9leHBlY3QtdXRpbHMuanNcIlxuXG4vKipcbiAqIFZlbG9jaW91c1Rlc3RDb25maWcgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZlbG9jaW91c1Rlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7XCJmYWlsdXJlXCIgfCBcImxpdmVcIn0gY29uc29sZU91dHB1dCAtIENvbnNvbGUgb3V0cHV0IG1vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBleGNsdWRlVGFncyAtIFRhZ3MgZXhjbHVkZWQgYnkgZGVmYXVsdC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkZWZhdWx0VGltZW91dFNlY29uZHMgLSBEZWZhdWx0IHRpbWVvdXQgaW4gc2Vjb25kcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBmYWlsZWRDb25zb2xlT3V0cHV0TWF4TGluZXMgLSBNYXhpbXVtIGZhaWxlZCBjb25zb2xlIGxpbmVzIHRvIHByaW50IGlubGluZS5cbiAqL1xuLyoqXG4gKiBUZXN0cy5cbiAqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLlRlc3RzQXJndW1lbnR9ICovXG5jb25zdCB0ZXN0cyA9IHtcbiAgLyoqXG4gICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICogQHR5cGUge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQWZ0ZXJCZWZvcmVFYWNoQ2FsbGJhY2tPYmplY3RUeXBlW119ICovXG4gIGFmdGVyRWFjaGVzOiBbXSxcbiAgLyoqXG4gICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICogQHR5cGUge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQmVmb3JlQWZ0ZXJBbGxDYWxsYmFja09iamVjdFR5cGVbXX0gKi9cbiAgYWZ0ZXJBbGxzOiBbXSxcbiAgYXJnczoge2RhdGFiYXNlQ2xlYW5pbmc6IHt0cmFuc2FjdGlvbjogdHJ1ZX19LFxuXG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkJlZm9yZUFmdGVyQWxsQ2FsbGJhY2tPYmplY3RUeXBlW119ICovXG4gIGJlZm9yZUFsbHM6IFtdLFxuICAvKipcbiAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgKiBAdHlwZSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5BZnRlckJlZm9yZUVhY2hDYWxsYmFja09iamVjdFR5cGVbXX0gKi9cbiAgYmVmb3JlRWFjaGVzOiBbXSxcbiAgZmlsZVBhdGg6IHVuZGVmaW5lZCxcbiAgbGluZTogdW5kZWZpbmVkLFxuICBzdWJzOiB7fSxcbiAgdGVzdHM6IHt9XG59XG5cbmNvbnN0IHRlc3RFdmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxubGV0IGN1cnJlbnRQYXRoID0gW3Rlc3RzXVxuXG4vKipcbiAqIFJ1bnMgY2FwdHVyZSBsb2NhdGlvbi5cbiAqIEByZXR1cm5zIHt7ZmlsZVBhdGg/OiBzdHJpbmcsIGxpbmU/OiBudW1iZXJ9fSAtIExvY2F0aW9uLlxuICovXG5mdW5jdGlvbiBjYXB0dXJlTG9jYXRpb24oKSB7XG4gIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKClcbiAgY29uc3Qgc3RhY2sgPSB0eXBlb2YgZXJyb3Iuc3RhY2sgPT09IFwic3RyaW5nXCIgPyBlcnJvci5zdGFjay5zcGxpdChcIlxcblwiKSA6IFtdXG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIHN0YWNrKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpXG5cbiAgICBpZiAoIXRyaW1tZWQuaW5jbHVkZXMoXCJhdFwiKSkgY29udGludWVcbiAgICBpZiAodHJpbW1lZC5pbmNsdWRlcyhcIi9zcmMvdGVzdGluZy90ZXN0LmpzXCIpKSBjb250aW51ZVxuICAgIGlmICh0cmltbWVkLmluY2x1ZGVzKFwiL0B2ZWxvY2lvdXMvdGVzdGluZy9cIikpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBtYXRjaCA9IHRyaW1tZWQubWF0Y2goLyg/OlxcKHxcXHMpKGZpbGU6XFwvXFwvLio/fFxcLy4qPyk6KFxcZCspOihcXGQrKVxcKT8kLylcblxuICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlXG5cbiAgICBjb25zdCByYXdQYXRoID0gbWF0Y2hbMV1cbiAgICBjb25zdCBsaW5lTnVtYmVyID0gTnVtYmVyKG1hdGNoWzJdKVxuICAgIGNvbnN0IGZpbGVQYXRoID0gcmF3UGF0aC5zdGFydHNXaXRoKFwiZmlsZTovL1wiKVxuICAgICAgPyBmaWxlVVJMVG9QYXRoKHJhd1BhdGgpXG4gICAgICA6IHJhd1BhdGhcblxuICAgIHJldHVybiB7XG4gICAgICBmaWxlUGF0aDogcGF0aC5yZXNvbHZlKGZpbGVQYXRoKSxcbiAgICAgIGxpbmU6IE51bWJlci5pc0Zpbml0ZShsaW5lTnVtYmVyKSA/IGxpbmVOdW1iZXIgOiB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge31cbn1cblxuZGVmYXVsdFRlc3RDb250ZXh0LnNldERlY2xhcmF0aW9uTG9jYXRvcihjYXB0dXJlTG9jYXRpb24pXG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgdGFncy5cbiAqIEBwYXJhbSB7c3RyaW5nW10gfCBzdHJpbmcgfCB1bmRlZmluZWR9IHRhZ3MgLSBUYWdzLlxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIE5vcm1hbGl6ZWQgdGFncy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplVGFncyh0YWdzKSB7XG4gIGlmICghdGFncykgcmV0dXJuIFtdXG5cbiAgY29uc3QgdmFsdWVzID0gW11cbiAgY29uc3QgcmF3VGFncyA9IEFycmF5LmlzQXJyYXkodGFncykgPyB0YWdzIDogW3RhZ3NdXG5cbiAgZm9yIChjb25zdCByYXdUYWcgb2YgcmF3VGFncykge1xuICAgIGlmIChyYXdUYWcgPT09IHVuZGVmaW5lZCB8fCByYXdUYWcgPT09IG51bGwpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBwYXJ0cyA9IFN0cmluZyhyYXdUYWcpLnNwbGl0KFwiLFwiKVxuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gcGFydC50cmltKClcblxuICAgICAgaWYgKHRyaW1tZWQpIHZhbHVlcy5wdXNoKHRyaW1tZWQpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldCh2YWx1ZXMpKVxufVxuXG4vKipcbiAqIFRlc3QgY29uZmlnLlxuICogQHR5cGUge1ZlbG9jaW91c1Rlc3RDb25maWd9ICovXG5jb25zdCB0ZXN0Q29uZmlnID0ge1xuICBjb25zb2xlT3V0cHV0OiBcImZhaWx1cmVcIixcbiAgZmFpbGVkQ29uc29sZU91dHB1dE1heExpbmVzOiAyMDAsXG4gIGV4Y2x1ZGVUYWdzOiBbXSxcbiAgZGVmYXVsdFRpbWVvdXRTZWNvbmRzOiA2MFxufVxuXG4vKipcbiAqIFJ1bnMgY29uZmlndXJlIHRlc3RzLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtcImZhaWx1cmVcIiB8IFwibGl2ZVwifSBbYXJncy5jb25zb2xlT3V0cHV0XSAtIENvbnNvbGUgb3V0cHV0IG1vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgc3RyaW5nfSBbYXJncy5leGNsdWRlVGFnc10gLSBUYWdzIHRvIGV4Y2x1ZGUuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuZGVmYXVsdFRpbWVvdXRTZWNvbmRzXSAtIERlZmF1bHQgdGltZW91dCBpbiBzZWNvbmRzLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmZhaWxlZENvbnNvbGVPdXRwdXRNYXhMaW5lc10gLSBNYXhpbXVtIGZhaWxlZCBjb25zb2xlIGxpbmVzIHRvIHByaW50IGlubGluZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBjb25maWd1cmVUZXN0cyh7Y29uc29sZU91dHB1dCwgZXhjbHVkZVRhZ3MsIGRlZmF1bHRUaW1lb3V0U2Vjb25kcywgZmFpbGVkQ29uc29sZU91dHB1dE1heExpbmVzfSA9IHt9KSB7XG4gIGlmIChleGNsdWRlVGFncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGVzdENvbmZpZy5leGNsdWRlVGFncyA9IG5vcm1hbGl6ZVRhZ3MoZXhjbHVkZVRhZ3MpXG4gIH1cblxuICBpZiAoY29uc29sZU91dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGNvbnNvbGVPdXRwdXQgIT09IFwiZmFpbHVyZVwiICYmIGNvbnNvbGVPdXRwdXQgIT09IFwibGl2ZVwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29uc29sZU91dHB1dCBjb25maWc6ICR7Y29uc29sZU91dHB1dH1gKVxuICAgIH1cblxuICAgIHRlc3RDb25maWcuY29uc29sZU91dHB1dCA9IGNvbnNvbGVPdXRwdXRcbiAgfVxuXG4gIGlmICh0eXBlb2YgZGVmYXVsdFRpbWVvdXRTZWNvbmRzID09PSBcIm51bWJlclwiKSB7XG4gICAgdGVzdENvbmZpZy5kZWZhdWx0VGltZW91dFNlY29uZHMgPSBkZWZhdWx0VGltZW91dFNlY29uZHNcbiAgfVxuXG4gIGlmICh0eXBlb2YgZmFpbGVkQ29uc29sZU91dHB1dE1heExpbmVzID09PSBcIm51bWJlclwiKSB7XG4gICAgdGVzdENvbmZpZy5mYWlsZWRDb25zb2xlT3V0cHV0TWF4TGluZXMgPSBmYWlsZWRDb25zb2xlT3V0cHV0TWF4TGluZXNcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgbWVyZ2UgdGVzdCBhcmdzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGJhc2VBcmdzIC0gQmFzZSBhcmdzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGV4dHJhQXJncyAtIEV4dHJhIGFyZ3MuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIE1lcmdlZCBhcmdzLlxuICovXG5mdW5jdGlvbiBtZXJnZVRlc3RBcmdzKGJhc2VBcmdzLCBleHRyYUFyZ3MpIHtcbiAgY29uc3QgbWVyZ2VkID0gT2JqZWN0LmFzc2lnbih7fSwgYmFzZUFyZ3MsIGV4dHJhQXJncylcbiAgY29uc3QgbWVyZ2VkVGFncyA9IFsuLi5ub3JtYWxpemVUYWdzKGJhc2VBcmdzPy50YWdzKSwgLi4ubm9ybWFsaXplVGFncyhleHRyYUFyZ3M/LnRhZ3MpXVxuXG4gIGlmIChtZXJnZWRUYWdzLmxlbmd0aCA+IDApIHtcbiAgICBtZXJnZWQudGFncyA9IEFycmF5LmZyb20obmV3IFNldChtZXJnZWRUYWdzKSlcbiAgfSBlbHNlIGlmIChcInRhZ3NcIiBpbiBtZXJnZWQpIHtcbiAgICBkZWxldGUgbWVyZ2VkLnRhZ3NcbiAgfVxuXG4gIHJldHVybiBtZXJnZWRcbn1cblxuLyoqXG4gKiBSdW5zIGJlZm9yZSBlYWNoLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkFmdGVyQmVmb3JlRWFjaENhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmVmb3JlRWFjaChjYWxsYmFjaykge1xuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG5cbiAgY3VycmVudFRlc3QuYmVmb3JlRWFjaGVzLnB1c2goe2NhbGxiYWNrfSlcbn1cblxuLyoqXG4gKiBSdW5zIGJlZm9yZSBhbGwuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQmVmb3JlQWZ0ZXJBbGxDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJlZm9yZUFsbChjYWxsYmFjaykge1xuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG5cbiAgY3VycmVudFRlc3QuYmVmb3JlQWxscy5wdXNoKHtjYWxsYmFja30pXG59XG5cbi8qKlxuICogUnVucyBhZnRlciBlYWNoLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkFmdGVyQmVmb3JlRWFjaENhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYWZ0ZXJFYWNoKGNhbGxiYWNrKSB7XG4gIGNvbnN0IGN1cnJlbnRUZXN0ID0gY3VycmVudFBhdGhbY3VycmVudFBhdGgubGVuZ3RoIC0gMV1cblxuICBjdXJyZW50VGVzdC5hZnRlckVhY2hlcy5wdXNoKHtjYWxsYmFja30pXG59XG5cbi8qKlxuICogUnVucyBhZnRlciBhbGwuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQmVmb3JlQWZ0ZXJBbGxDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGFmdGVyQWxsKGNhbGxiYWNrKSB7XG4gIGNvbnN0IGN1cnJlbnRUZXN0ID0gY3VycmVudFBhdGhbY3VycmVudFBhdGgubGVuZ3RoIC0gMV1cblxuICBjdXJyZW50VGVzdC5hZnRlckFsbHMucHVzaCh7Y2FsbGJhY2t9KVxufVxuXG4vKipcbiAqIFJ1bnMgZGVzY3JpYmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb24gLSBEZXNjcmlwdGlvbi5cbiAqIEBwYXJhbSB7b2JqZWN0fCgoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KSl9IGFyZzEgLSBBcmcxLlxuICogQHBhcmFtIHt1bmRlZmluZWR8KCgpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pKX0gW2FyZzJdIC0gQXJnMi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlc2NyaWJlKGRlc2NyaXB0aW9uLCBhcmcxLCBhcmcyKSB7XG4gIC8qKlxuICAgKiBEZWZpbmVzIHRlc3RBcmdzLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqL1xuICBsZXQgdGVzdEFyZ3MsIHRlc3RGdW5jdGlvblxuXG4gIGlmICh0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0ZXN0RnVuY3Rpb24gPSBhcmcyXG4gICAgdGVzdEFyZ3MgPSBhcmcxXG4gIH0gZWxzZSBpZiAodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGVzdEZ1bmN0aW9uID0gYXJnMVxuICAgIHRlc3RBcmdzID0ge31cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXJndW1lbnRzIGZvciBkZXNjcmliZTogJHthcmcxfSwgJHthcmcyfWApXG4gIH1cblxuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG4gIGNvbnN0IG5ld1Rlc3RBcmdzID0gbWVyZ2VUZXN0QXJncyhjdXJyZW50VGVzdC5hcmdzLCB0ZXN0QXJncylcblxuICBpZiAoZGVzY3JpcHRpb24gaW4gY3VycmVudFRlc3Quc3Vicykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHRlc3QgZGVzY3JpcHRpb246ICR7ZGVzY3JpcHRpb259YClcbiAgfVxuXG4gIGNvbnN0IGxvY2F0aW9uID0gY2FwdHVyZUxvY2F0aW9uKClcbiAgY29uc3QgbmV3VGVzdERhdGEgPSB7XG4gICAgYWZ0ZXJFYWNoZXM6IFtdLFxuICAgIGFmdGVyQWxsczogW10sXG4gICAgYXJnczogbmV3VGVzdEFyZ3MsXG4gICAgYmVmb3JlQWxsczogW10sXG4gICAgYmVmb3JlRWFjaGVzOiBbXSxcbiAgICBmaWxlUGF0aDogbG9jYXRpb24uZmlsZVBhdGgsXG4gICAgbGluZTogbG9jYXRpb24ubGluZSxcbiAgICBzdWJzOiB7fSxcbiAgICB0ZXN0czoge31cbiAgfVxuXG4gIGN1cnJlbnRUZXN0LnN1YnNbZGVzY3JpcHRpb25dID0gbmV3VGVzdERhdGFcbiAgY3VycmVudFBhdGgucHVzaChuZXdUZXN0RGF0YSlcblxuICB0cnkge1xuICAgIGF3YWl0IHRlc3RGdW5jdGlvbigpXG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFBhdGgucG9wKClcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgZXhwZWN0LlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYXJnIC0gQXJnLlxuICogQHJldHVybnMge0V4cGVjdH0gLSBUaGUgZXhwZWN0LlxuICovXG5mdW5jdGlvbiBleHBlY3QoYXJnKSB7XG4gIHJldHVybiBuZXcgRXhwZWN0KGFyZylcbn1cblxuZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcgPSBvYmplY3RDb250YWluaW5nXG5leHBlY3QuYXJyYXlDb250YWluaW5nID0gYXJyYXlDb250YWluaW5nXG5cbi8qKlxuICogUnVucyBpdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvbiAtIERlc2NyaXB0aW9uLlxuICogQHBhcmFtIHtvYmplY3R8KCgpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pKX0gYXJnMSAtIEFyZzEuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZHwoKCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPikpfSBbYXJnMl0gLSBBcmcyLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBpdChkZXNjcmlwdGlvbiwgYXJnMSwgYXJnMikge1xuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRlc3RBcmdzLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqL1xuICBsZXQgdGVzdEFyZ3NcblxuICAvKipcbiAgICogRGVmaW5lcyB0ZXN0RnVuY3Rpb24uXG4gICAqIEB0eXBlIHsoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KX0gKi9cbiAgbGV0IHRlc3RGdW5jdGlvblxuXG4gIGlmICh0eXBlb2YgYXJnMSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0ZXN0RnVuY3Rpb24gPSAvKiogQHR5cGUgeygpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pfSAqLyAoYXJnMSlcbiAgICB0ZXN0QXJncyA9IHt9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGFyZzIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGVzdEZ1bmN0aW9uID0gLyoqIEB0eXBlIHsoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KX0gKi8gKGFyZzIpXG4gICAgdGVzdEFyZ3MgPSBhcmcxXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50cyBmb3IgaXQ6ICR7ZGVzY3JpcHRpb259LCAke2FyZzF9YClcbiAgfVxuXG4gIGNvbnN0IG5ld1Rlc3RBcmdzID0gbWVyZ2VUZXN0QXJncyhjdXJyZW50VGVzdC5hcmdzLCB0ZXN0QXJncylcblxuICBjb25zdCBsb2NhdGlvbiA9IGNhcHR1cmVMb2NhdGlvbigpXG5cbiAgY3VycmVudFRlc3QudGVzdHNbZGVzY3JpcHRpb25dID0ge1xuICAgIGFyZ3M6IG5ld1Rlc3RBcmdzLFxuICAgIGZ1bmN0aW9uOiB0ZXN0RnVuY3Rpb24sXG4gICAgZmlsZVBhdGg6IGxvY2F0aW9uLmZpbGVQYXRoLFxuICAgIGxpbmU6IGxvY2F0aW9uLmxpbmVcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgZml0LlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uIC0gRGVzY3JpcHRpb24uXG4gKiBAcGFyYW0ge29iamVjdHwoKCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPikpfSBhcmcxIC0gQXJnMS5cbiAqIEBwYXJhbSB7dW5kZWZpbmVkfCgoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KSl9IFthcmcyXSAtIEFyZzIuXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGZpdChkZXNjcmlwdGlvbiwgYXJnMSwgYXJnMikge1xuICAvKipcbiAgICogRGVmaW5lcyB0ZXN0QXJncy5cbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi9cbiAgbGV0IHRlc3RBcmdzXG5cbiAgLyoqXG4gICAqIERlZmluZXMgdGVzdEZ1bmN0aW9uLlxuICAgKiBAdHlwZSB7KCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPil9ICovXG4gIGxldCB0ZXN0RnVuY3Rpb25cblxuICBpZiAodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGVzdEZ1bmN0aW9uID0gLyoqIEB0eXBlIHsoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KX0gKi8gKGFyZzEpXG4gICAgdGVzdEFyZ3MgPSB7Zm9jdXM6IHRydWV9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGFyZzIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGVzdEZ1bmN0aW9uID0gLyoqIEB0eXBlIHsoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KX0gKi8gKGFyZzIpXG4gICAgdGVzdEFyZ3MgPSBPYmplY3QuYXNzaWduKHtmb2N1czogdHJ1ZX0sIGFyZzEpXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50cyBmb3IgaXQ6ICR7ZGVzY3JpcHRpb259LCAke2FyZzF9YClcbiAgfVxuXG4gIHJldHVybiBpdChkZXNjcmlwdGlvbiwgdGVzdEFyZ3MsIHRlc3RGdW5jdGlvbilcbn1cblxuLy8gTWFrZSB0aGUgbWV0aG9kcyBnbG9iYWwgc28gdGhleSBjYW4gYmUgdXNlZCBpbiB0ZXN0IGZpbGVzXG5PYmplY3QuYXNzaWduKGdsb2JhbFRoaXMsIHtcbiAgYWZ0ZXJBbGwsXG4gIGFmdGVyRWFjaCxcbiAgYmVmb3JlQWxsLFxuICBiZWZvcmVFYWNoLFxuICBjb25maWd1cmVUZXN0cyxcbiAgZGVzY3JpYmUsXG4gIGV4cGVjdCxcbiAgZml0LFxuICBpdCxcbiAgdGVzdEV2ZW50c1xufSlcblxuZXhwb3J0IHthZnRlckFsbCwgYWZ0ZXJFYWNoLCBiZWZvcmVBbGwsIGJlZm9yZUVhY2gsIGNvbmZpZ3VyZVRlc3RzLCBkZXNjcmliZSwgZXhwZWN0LCBmaXQsIGl0LCBhcnJheUNvbnRhaW5pbmcsIG9iamVjdENvbnRhaW5pbmcsIHRlc3RDb25maWcsIHRlc3RFdmVudHMsIHRlc3RzLCB3YWl0Rm9yRXZlbnR9XG4iXX0=
|
|
170
|
+
export { afterAll, afterEach, beforeAll, beforeEach, configureTests, describe, expect, fdescribe, fit, it, test, xdescribe, xit, xtest, arrayContaining, objectContaining, testConfig, testEvents, tests, waitForEvent };
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3Rlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEVBQ1YsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixRQUFRLEVBQ1IsU0FBUyxFQUNULEdBQUcsRUFDSCxFQUFFLEVBQ0YsSUFBSSxFQUNKLFlBQVksRUFDWixTQUFTLEVBQ1QsR0FBRyxFQUNILEtBQUssRUFDTixNQUFNLG9CQUFvQixDQUFBO0FBQzNCLE9BQU8sWUFBWSxNQUFNLDJCQUEyQixDQUFBO0FBQ3BELE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQTtBQUNoQyxPQUFPLEVBQUMsZUFBZSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sbUJBQW1CLENBQUE7QUFFbkUsNkZBQTZGO0FBRTdGOzs7Ozs7O0dBT0c7QUFFSDs7OztHQUlHO0FBQ0gsU0FBUyxNQUFNLENBQUMsR0FBRztJQUNqQixPQUFPLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ3hCLENBQUM7QUFFRCxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUE7QUFDMUMsTUFBTSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUE7QUFFeEMsb0RBQW9EO0FBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUE7QUFFckM7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsS0FBSztJQUM3QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM3RixJQUFJLEtBQUssS0FBSyxJQUFJLElBQUks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Q0QsdURBQXVEO0FBQ3ZELE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQTtBQUM3QixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBRXBCLHdGQUF3RjtBQUN4RixNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtJQUN4QixRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsY0FBYztJQUNkLFFBQVE7SUFDUixNQUFNO0lBQ04sU0FBUztJQUNULEdBQUc7SUFDSCxFQUFFO0lBQ0YsSUFBSTtJQUNKLFVBQVU7SUFDVixTQUFTO0lBQ1QsR0FBRztJQUNILEtBQUs7Q0FDTixDQUFDLENBQUE7QUFFRixPQUFPLEVBQ0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxTQUFTLEVBQ1QsVUFBVSxFQUNWLGNBQWMsRUFDZCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxHQUFHLEVBQ0gsRUFBRSxFQUNGLElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxFQUNILEtBQUssRUFDTCxlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixVQUFVLEVBQ1YsS0FBSyxFQUNMLFlBQVksRUFDYixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7XG4gIGFmdGVyQWxsLFxuICBhZnRlckVhY2gsXG4gIGJlZm9yZUFsbCxcbiAgYmVmb3JlRWFjaCxcbiAgY29uZmlndXJlVGVzdHMsXG4gIGRlZmF1bHRUZXN0Q29udGV4dCxcbiAgZGVzY3JpYmUsXG4gIGZkZXNjcmliZSxcbiAgZml0LFxuICBpdCxcbiAgdGVzdCxcbiAgd2FpdEZvckV2ZW50LFxuICB4ZGVzY3JpYmUsXG4gIHhpdCxcbiAgeHRlc3Rcbn0gZnJvbSBcIkB2ZWxvY2lvdXMvdGVzdGluZ1wiXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCIuLi91dGlscy9ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCBFeHBlY3QgZnJvbSBcIi4vZXhwZWN0LmpzXCJcbmltcG9ydCB7YXJyYXlDb250YWluaW5nLCBvYmplY3RDb250YWluaW5nfSBmcm9tIFwiLi9leHBlY3QtdXRpbHMuanNcIlxuXG4vKiogQHR5cGVkZWYgeyh0eXBlb2YgZGVmYXVsdFRlc3RDb250ZXh0LnJlZ2lzdHJ5LnN1aXRlcylbbnVtYmVyXX0gUGFja2FnZVN1aXRlRGVjbGFyYXRpb24gKi9cblxuLyoqXG4gKiBWZWxvY2lvdXNUZXN0Q29uZmlnIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWZWxvY2lvdXNUZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge1wiZmFpbHVyZVwiIHwgXCJsaXZlXCJ9IGNvbnNvbGVPdXRwdXQgLSBDb25zb2xlIG91dHB1dCBtb2RlLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gZXhjbHVkZVRhZ3MgLSBUYWdzIGV4Y2x1ZGVkIGJ5IGRlZmF1bHQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZGVmYXVsdFRpbWVvdXRTZWNvbmRzIC0gRGVmYXVsdCB0aW1lb3V0IGluIHNlY29uZHMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZmFpbGVkQ29uc29sZU91dHB1dE1heExpbmVzIC0gTWF4aW11bSBmYWlsZWQgY29uc29sZSBsaW5lcyB0byBwcmludCBpbmxpbmUuXG4gKi9cblxuLyoqXG4gKiBSdW5zIGV4cGVjdC5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZyAtIEFyZy5cbiAqIEByZXR1cm5zIHtFeHBlY3R9IC0gVGhlIGV4cGVjdC5cbiAqL1xuZnVuY3Rpb24gZXhwZWN0KGFyZykge1xuICByZXR1cm4gbmV3IEV4cGVjdChhcmcpXG59XG5cbmV4cGVjdC5vYmplY3RDb250YWluaW5nID0gb2JqZWN0Q29udGFpbmluZ1xuZXhwZWN0LmFycmF5Q29udGFpbmluZyA9IGFycmF5Q29udGFpbmluZ1xuXG4vKiogVmVsb2Npb3VzLW93bmVkIGF3YWl0ZWQgY29tcGF0aWJpbGl0eSBldmVudHMuICovXG5jb25zdCB0ZXN0RXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbi8qKlxuICogRGV0YWNoZXMgYW5kIGZyZWV6ZXMgZGVjbGFyYXRpb24gbWV0YWRhdGEgZXhwb3NlZCBieSB0aGUgY29tcGF0aWJpbGl0eSB2aWV3LlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBQYWNrYWdlIGRlY2xhcmF0aW9uIHZhbHVlLlxuICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAtIEltbXV0YWJsZSBkZXRhY2hlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcmVhZE9ubHlTbmFwc2hvdCh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBPYmplY3QuZnJlZXplKHZhbHVlLm1hcCgoZW50cnkpID0+IHJlYWRPbmx5U25hcHNob3QoZW50cnkpKSlcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHZhbHVlXG5cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovXG4gIGNvbnN0IHByb2plY3RlZFZhbHVlID0ge31cblxuICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHByb2plY3RlZFZhbHVlW2tleV0gPSByZWFkT25seVNuYXBzaG90KGVudHJ5KVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHByb2plY3RlZFZhbHVlKVxufVxuXG4vKipcbiAqIEJhY2t3YXJkLWNvbXBhdGlibGUgdmlldyBvZiB0aGUgcGFja2FnZSBjb25maWd1cmF0aW9uLlxuICogQHR5cGUge1ZlbG9jaW91c1Rlc3RDb25maWd9XG4gKi9cbmNvbnN0IHRlc3RDb25maWcgPSB7XG4gIGdldCBjb25zb2xlT3V0cHV0KCkgeyByZXR1cm4gZGVmYXVsdFRlc3RDb250ZXh0LmNvbmZpZy5jb25zb2xlT3V0cHV0IH0sXG4gIHNldCBjb25zb2xlT3V0cHV0KHZhbHVlKSB7IGRlZmF1bHRUZXN0Q29udGV4dC5jb25maWd1cmVUZXN0cyh7Y29uc29sZU91dHB1dDogdmFsdWV9KSB9LFxuICBnZXQgZXhjbHVkZVRhZ3MoKSB7IHJldHVybiBkZWZhdWx0VGVzdENvbnRleHQuY29uZmlnLmV4Y2x1ZGVUYWdzIH0sXG4gIHNldCBleGNsdWRlVGFncyh2YWx1ZSkgeyBkZWZhdWx0VGVzdENvbnRleHQuY29uZmlndXJlVGVzdHMoe2V4Y2x1ZGVUYWdzOiB2YWx1ZX0pIH0sXG4gIGdldCBkZWZhdWx0VGltZW91dFNlY29uZHMoKSB7IHJldHVybiBkZWZhdWx0VGVzdENvbnRleHQuY29uZmlnLmRlZmF1bHRUaW1lb3V0TXMgLyAxMDAwIH0sXG4gIHNldCBkZWZhdWx0VGltZW91dFNlY29uZHModmFsdWUpIHsgZGVmYXVsdFRlc3RDb250ZXh0LmNvbmZpZ3VyZVRlc3RzKHtkZWZhdWx0VGltZW91dFNlY29uZHM6IHZhbHVlfSkgfSxcbiAgZ2V0IGZhaWxlZENvbnNvbGVPdXRwdXRNYXhMaW5lcygpIHsgcmV0dXJuIGRlZmF1bHRUZXN0Q29udGV4dC5jb25maWcuZmFpbGVkQ29uc29sZU91dHB1dE1heExpbmVzIH0sXG4gIHNldCBmYWlsZWRDb25zb2xlT3V0cHV0TWF4TGluZXModmFsdWUpIHsgZGVmYXVsdFRlc3RDb250ZXh0LmNvbmZpZ3VyZVRlc3RzKHtmYWlsZWRDb25zb2xlT3V0cHV0TWF4TGluZXM6IHZhbHVlfSkgfVxufVxuXG4vKipcbiAqIFByb2plY3RzIG9uZSBwYWNrYWdlIHN1aXRlIGludG8gdGhlIGRlcHJlY2F0ZWQgbGVnYWN5IGluc3BlY3Rpb24gc2hhcGUuXG4gKiBUaGUgcmV0dXJuZWQgb2JqZWN0cyBhcmUgc25hcHNob3RzIGFuZCBuZXZlciBwYXJ0aWNpcGF0ZSBpbiBleGVjdXRpb24uXG4gKiBAcGFyYW0ge1BhY2thZ2VTdWl0ZURlY2xhcmF0aW9ufSBzdWl0ZSAtIFBhY2thZ2UgZGVjbGFyYXRpb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5UZXN0c0FyZ3VtZW50fSAtIFJlYWQtb25seSBjb21wYXRpYmlsaXR5IHNuYXBzaG90LlxuICovXG5mdW5jdGlvbiBwcm9qZWN0U3VpdGUoc3VpdGUpIHtcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLlRlc3REYXRhPn0gKi9cbiAgY29uc3QgcHJvamVjdGVkVGVzdHMgPSB7fVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuVGVzdHNBcmd1bWVudD59ICovXG4gIGNvbnN0IHByb2plY3RlZFN1aXRlcyA9IHt9XG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBzdWl0ZS50ZXN0cykge1xuICAgIGNvbnN0IG11dGFibGVBcmdzID0gey4uLmRlY2xhcmF0aW9uLm9wdGlvbnN9XG5cbiAgICBpZiAobXV0YWJsZUFyZ3MucmV0cnkgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbXV0YWJsZUFyZ3MucmV0cmllcyA9PT0gXCJudW1iZXJcIikgbXV0YWJsZUFyZ3MucmV0cnkgPSBtdXRhYmxlQXJncy5yZXRyaWVzXG4gICAgaWYgKG11dGFibGVBcmdzLnRpbWVvdXRTZWNvbmRzID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG11dGFibGVBcmdzLnRpbWVvdXRNcyA9PT0gXCJudW1iZXJcIikgbXV0YWJsZUFyZ3MudGltZW91dFNlY29uZHMgPSBtdXRhYmxlQXJncy50aW1lb3V0TXMgLyAxMDAwXG4gICAgcHJvamVjdGVkVGVzdHNbZGVjbGFyYXRpb24ubmFtZV0gPSBPYmplY3QuZnJlZXplKHtcbiAgICAgIGFyZ3M6IHJlYWRPbmx5U25hcHNob3QobXV0YWJsZUFyZ3MpLFxuICAgICAgZmlsZVBhdGg6IGRlY2xhcmF0aW9uLmxvY2F0aW9uLmZpbGVQYXRoLFxuICAgICAgZnVuY3Rpb246IGRlY2xhcmF0aW9uLmNhbGxiYWNrLFxuICAgICAgbGluZTogZGVjbGFyYXRpb24ubG9jYXRpb24ubGluZVxuICAgIH0pXG4gIH1cblxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIHN1aXRlLnN1aXRlcykgcHJvamVjdGVkU3VpdGVzW2NoaWxkLm5hbWVdID0gcHJvamVjdFN1aXRlKGNoaWxkKVxuXG4gIGNvbnN0IHByb2plY3Rpb24gPSB7XG4gICAgYWZ0ZXJBbGxzOiBPYmplY3QuZnJlZXplKHN1aXRlLmhvb2tzLmFmdGVyQWxsLm1hcCgoaG9vaykgPT4gT2JqZWN0LmZyZWV6ZSh7Y2FsbGJhY2s6IGhvb2suY2FsbGJhY2t9KSkpLFxuICAgIGFmdGVyRWFjaGVzOiBPYmplY3QuZnJlZXplKHN1aXRlLmhvb2tzLmFmdGVyRWFjaC5tYXAoKGhvb2spID0+IE9iamVjdC5mcmVlemUoe2NhbGxiYWNrOiBob29rLmNhbGxiYWNrfSkpKSxcbiAgICBhcmdzOiByZWFkT25seVNuYXBzaG90KHN1aXRlLm9wdGlvbnMpLFxuICAgIGJlZm9yZUFsbHM6IE9iamVjdC5mcmVlemUoc3VpdGUuaG9va3MuYmVmb3JlQWxsLm1hcCgoaG9vaykgPT4gT2JqZWN0LmZyZWV6ZSh7Y2FsbGJhY2s6IGhvb2suY2FsbGJhY2t9KSkpLFxuICAgIGJlZm9yZUVhY2hlczogT2JqZWN0LmZyZWV6ZShzdWl0ZS5ob29rcy5iZWZvcmVFYWNoLm1hcCgoaG9vaykgPT4gT2JqZWN0LmZyZWV6ZSh7Y2FsbGJhY2s6IGhvb2suY2FsbGJhY2t9KSkpLFxuICAgIGZpbGVQYXRoOiBzdWl0ZS5sb2NhdGlvbi5maWxlUGF0aCxcbiAgICBsaW5lOiBzdWl0ZS5sb2NhdGlvbi5saW5lLFxuICAgIHN1YnM6IE9iamVjdC5mcmVlemUocHJvamVjdGVkU3VpdGVzKSxcbiAgICB0ZXN0czogT2JqZWN0LmZyZWV6ZShwcm9qZWN0ZWRUZXN0cylcbiAgfVxuXG4gIC8vIE5hcnJvd3MgdGhlIGltbXV0YWJsZSBzbmFwc2hvdCB0byB0aGUgaGlzdG9yaWNhbCBpbnNwZWN0aW9uIGNvbnRyYWN0LlxuICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLlRlc3RzQXJndW1lbnR9ICovIChPYmplY3QuZnJlZXplKHByb2plY3Rpb24pKVxufVxuXG4vKipcbiAqIERlcHJlY2F0ZWQgcmVhZC1vbmx5IGRlY2xhcmF0aW9uIHByb2plY3Rpb24uIFBhY2thZ2UgZGVjbGFyYXRpb25zIGluXG4gKiBkZWZhdWx0VGVzdENvbnRleHQgYXJlIHRoZSBzb2xlIGV4ZWN1dGlvbiBzb3VyY2UuXG4gKi9cbi8qKiBAdHlwZSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5CZWZvcmVBZnRlckFsbENhbGxiYWNrT2JqZWN0VHlwZVtdfSAqL1xuY29uc3QgZW1wdHlBZnRlckFsbHMgPSBbXVxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkFmdGVyQmVmb3JlRWFjaENhbGxiYWNrT2JqZWN0VHlwZVtdfSAqL1xuY29uc3QgZW1wdHlBZnRlckVhY2hlcyA9IFtdXG4vKiogQHR5cGUge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQmVmb3JlQWZ0ZXJBbGxDYWxsYmFja09iamVjdFR5cGVbXX0gKi9cbmNvbnN0IGVtcHR5QmVmb3JlQWxscyA9IFtdXG4vKiogQHR5cGUge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQWZ0ZXJCZWZvcmVFYWNoQ2FsbGJhY2tPYmplY3RUeXBlW119ICovXG5jb25zdCBlbXB0eUJlZm9yZUVhY2hlcyA9IFtdXG5jb25zdCBkZWZhdWx0VGVzdEFyZ3VtZW50cyA9IHtkYXRhYmFzZUNsZWFuaW5nOiB7dHJhbnNhY3Rpb246IHRydWV9fVxuXG5PYmplY3QuZnJlZXplKGVtcHR5QWZ0ZXJBbGxzKVxuT2JqZWN0LmZyZWV6ZShlbXB0eUFmdGVyRWFjaGVzKVxuT2JqZWN0LmZyZWV6ZShlbXB0eUJlZm9yZUFsbHMpXG5PYmplY3QuZnJlZXplKGVtcHR5QmVmb3JlRWFjaGVzKVxuT2JqZWN0LmZyZWV6ZShkZWZhdWx0VGVzdEFyZ3VtZW50cy5kYXRhYmFzZUNsZWFuaW5nKVxuT2JqZWN0LmZyZWV6ZShkZWZhdWx0VGVzdEFyZ3VtZW50cylcblxuY29uc3QgdGVzdHNQcm9qZWN0aW9uID0ge1xuICBnZXQgYWZ0ZXJBbGxzKCkgeyByZXR1cm4gZW1wdHlBZnRlckFsbHMgfSxcbiAgZ2V0IGFmdGVyRWFjaGVzKCkgeyByZXR1cm4gZW1wdHlBZnRlckVhY2hlcyB9LFxuICBnZXQgYXJncygpIHsgcmV0dXJuIGRlZmF1bHRUZXN0QXJndW1lbnRzIH0sXG4gIGdldCBiZWZvcmVBbGxzKCkgeyByZXR1cm4gZW1wdHlCZWZvcmVBbGxzIH0sXG4gIGdldCBiZWZvcmVFYWNoZXMoKSB7IHJldHVybiBlbXB0eUJlZm9yZUVhY2hlcyB9LFxuICBnZXQgZmlsZVBhdGgoKSB7IHJldHVybiB1bmRlZmluZWQgfSxcbiAgZ2V0IGxpbmUoKSB7IHJldHVybiB1bmRlZmluZWQgfSxcbiAgZ2V0IHN1YnMoKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLlRlc3RzQXJndW1lbnQ+fSAqL1xuICAgIGNvbnN0IHByb2plY3RlZFN1aXRlcyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IHN1aXRlIG9mIGRlZmF1bHRUZXN0Q29udGV4dC5yZWdpc3RyeS5zdWl0ZXMpIHtcbiAgICAgIGlmIChzdWl0ZS5uYW1lID09PSBcIlwiKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGRTdWl0ZSBvZiBzdWl0ZS5zdWl0ZXMpIHByb2plY3RlZFN1aXRlc1tjaGlsZFN1aXRlLm5hbWVdID0gcHJvamVjdFN1aXRlKGNoaWxkU3VpdGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9qZWN0ZWRTdWl0ZXNbc3VpdGUubmFtZV0gPSBwcm9qZWN0U3VpdGUoc3VpdGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUocHJvamVjdGVkU3VpdGVzKVxuICB9LFxuICBnZXQgdGVzdHMoKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLlRlc3REYXRhPn0gKi9cbiAgICBjb25zdCBwcm9qZWN0ZWRUZXN0cyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IHN1aXRlIG9mIGRlZmF1bHRUZXN0Q29udGV4dC5yZWdpc3RyeS5zdWl0ZXMpIHtcbiAgICAgIGlmIChzdWl0ZS5uYW1lICE9PSBcIlwiKSBjb250aW51ZVxuXG4gICAgICBPYmplY3QuYXNzaWduKHByb2plY3RlZFRlc3RzLCBwcm9qZWN0U3VpdGUoc3VpdGUpLnRlc3RzKVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHByb2plY3RlZFRlc3RzKVxuICB9XG59XG4vKiogQHR5cGUge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuVGVzdHNBcmd1bWVudH0gKi9cbmNvbnN0IHRlc3RzID0gdGVzdHNQcm9qZWN0aW9uXG5PYmplY3QuZnJlZXplKHRlc3RzKVxuXG4vLyBNYWtlIHRoZSBjb21wYXRpYmlsaXR5IGZhY2FkZSBnbG9iYWwgc28gZXhpc3RpbmcgdGVzdCBmaWxlcyByZW1haW4gc291cmNlLWNvbXBhdGlibGUuXG5PYmplY3QuYXNzaWduKGdsb2JhbFRoaXMsIHtcbiAgYWZ0ZXJBbGwsXG4gIGFmdGVyRWFjaCxcbiAgYmVmb3JlQWxsLFxuICBiZWZvcmVFYWNoLFxuICBjb25maWd1cmVUZXN0cyxcbiAgZGVzY3JpYmUsXG4gIGV4cGVjdCxcbiAgZmRlc2NyaWJlLFxuICBmaXQsXG4gIGl0LFxuICB0ZXN0LFxuICB0ZXN0RXZlbnRzLFxuICB4ZGVzY3JpYmUsXG4gIHhpdCxcbiAgeHRlc3Rcbn0pXG5cbmV4cG9ydCB7XG4gIGFmdGVyQWxsLFxuICBhZnRlckVhY2gsXG4gIGJlZm9yZUFsbCxcbiAgYmVmb3JlRWFjaCxcbiAgY29uZmlndXJlVGVzdHMsXG4gIGRlc2NyaWJlLFxuICBleHBlY3QsXG4gIGZkZXNjcmliZSxcbiAgZml0LFxuICBpdCxcbiAgdGVzdCxcbiAgeGRlc2NyaWJlLFxuICB4aXQsXG4gIHh0ZXN0LFxuICBhcnJheUNvbnRhaW5pbmcsXG4gIG9iamVjdENvbnRhaW5pbmcsXG4gIHRlc3RDb25maWcsXG4gIHRlc3RFdmVudHMsXG4gIHRlc3RzLFxuICB3YWl0Rm9yRXZlbnRcbn1cbiJdfQ==
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export type PackageHookDeclaration = import("@velocious/testing/runner").AttemptExecutorInput["beforeEach"][number];
|
|
2
|
+
export type TestTimeoutError = Error & {
|
|
3
|
+
velociousTestTimeout?: true;
|
|
4
|
+
};
|
|
5
|
+
export default class VelociousAttemptExecutor {
|
|
6
|
+
testRunner: import("./test-runner.js").default;
|
|
7
|
+
/**
|
|
8
|
+
* Creates an executor for framework-owned attempt lifecycle work.
|
|
9
|
+
* @param {object} args - Constructor arguments.
|
|
10
|
+
* @param {import("./test-runner.js").default} args.testRunner - Owning Velocious runner.
|
|
11
|
+
*/
|
|
12
|
+
constructor({ testRunner, ...restArgs }: {
|
|
13
|
+
testRunner: import("./test-runner.js").default;
|
|
14
|
+
});
|
|
15
|
+
/**
|
|
16
|
+
* Normalizes the legacy timeout contract at the framework adapter boundary.
|
|
17
|
+
* @param {number | undefined} timeoutMs - Declared package timeout.
|
|
18
|
+
* @returns {number | undefined} - Positive finite timeout, or no timeout.
|
|
19
|
+
*/
|
|
20
|
+
normalizeTimeoutMs(timeoutMs: number | undefined): number | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Executes exactly one complete Velocious-owned test attempt.
|
|
23
|
+
* @param {import("@velocious/testing/runner").AttemptExecutorInput} input - Package attempt.
|
|
24
|
+
* @returns {Promise<void>} - Resolves after one complete framework attempt.
|
|
25
|
+
*/
|
|
26
|
+
execute({ afterEach, args, attemptNumber, beforeEach, context, defaultExecute, fullName, suite, test, timeoutMs, ...restArgs }: import("@velocious/testing/runner").AttemptExecutorInput): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Runs before-each hooks in inherited declaration order.
|
|
29
|
+
* @param {object} args - Hook arguments.
|
|
30
|
+
* @param {PackageHookDeclaration[]} args.beforeEaches - Setup hooks.
|
|
31
|
+
* @param {import("./velocious-test-arguments.js").TestArgs} args.testArgs - Stable test arguments.
|
|
32
|
+
* @param {import("./velocious-test-arguments.js").TestData} args.testData - Test registration.
|
|
33
|
+
* @returns {Promise<void>} - Resolves after all setup hooks complete.
|
|
34
|
+
*/
|
|
35
|
+
runBeforeEaches({ beforeEaches, testArgs, testData }: {
|
|
36
|
+
beforeEaches: PackageHookDeclaration[];
|
|
37
|
+
testArgs: import("./velocious-test-arguments.js").TestArgs;
|
|
38
|
+
testData: import("./velocious-test-arguments.js").TestData;
|
|
39
|
+
}): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Runs every after-each hook while preserving all failures.
|
|
42
|
+
* @param {object} args - Hook arguments.
|
|
43
|
+
* @param {PackageHookDeclaration[]} args.afterEaches - Cleanup hooks.
|
|
44
|
+
* @param {import("./velocious-test-arguments.js").TestArgs} args.testArgs - Stable test arguments.
|
|
45
|
+
* @param {import("./velocious-test-arguments.js").TestData} args.testData - Test registration.
|
|
46
|
+
* @returns {Promise<void>} - Resolves after every cleanup hook settles.
|
|
47
|
+
*/
|
|
48
|
+
runAfterEaches({ afterEaches, testArgs, testData }: {
|
|
49
|
+
afterEaches: PackageHookDeclaration[];
|
|
50
|
+
testArgs: import("./velocious-test-arguments.js").TestArgs;
|
|
51
|
+
testData: import("./velocious-test-arguments.js").TestData;
|
|
52
|
+
}): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=velocious-attempt-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"velocious-attempt-executor.d.ts","sourceRoot":"","sources":["../../../src/testing/velocious-attempt-executor.js"],"names":[],"mappings":"AAOI,YAA0F,sBAAsB,GAAtG,OAAO,2BAA2B,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAwB;AAIjH,YAAiD,gBAAgB,GAAvD,KAAK,GAAG;IAAC,oBAAoB,CAAC,EAAE,IAAI,CAAA;CAAC,CAAkB;AA8EpE,MAAM,CAAC,OAAO,OAAO,wBAAwB;IAQpC,UAAU;IAPjB;;;;OAIG;IACH,YAAY,EAAC,UAAU,EAAE,GAAG,QAAQ,EAAC,EAFlC;QAAiD,UAAU,EAAnD,OAAO,kBAAkB,EAAE,OAAO,CAC5C;KACoC,EAGpC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,SAAS,EAHjB,MAAM,GAAG,SAGQ,GAFf,MAAM,GAAG,SAAS,CAI9B;IAED;;;;OAIG;IACG,OAAO,CAAC,EAAC,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,QAAQ,EAAC,EAHvH,OAAO,2BAA2B,EAAE,oBAGmF,GAFrH,OAAO,CAAC,IAAI,CAAC,CA6QzB;IAED;;;;;;;OAOG;IACG,eAAe,CAAC,EAAC,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAC,EALrD;QAAuC,YAAY,EAA3C,sBAAsB,EAAE,CAChC;QAA+D,QAAQ,EAA/D,OAAO,+BAA+B,EAAE,QAAQ,CACxD;QAA+D,QAAQ,EAA/D,OAAO,+BAA+B,EAAE,QAAQ,CACxD;KAEqD,GAF3C,OAAO,CAAC,IAAI,CAAC,CAezB;IAED;;;;;;;OAOG;IACG,cAAc,CAAC,EAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAC,EALnD;QAAuC,WAAW,EAA1C,sBAAsB,EAAE,CAChC;QAA+D,QAAQ,EAA/D,OAAO,+BAA+B,EAAE,QAAQ,CACxD;QAA+D,QAAQ,EAA/D,OAAO,+BAA+B,EAAE,QAAQ,CACxD;KAEmD,GAFzC,OAAO,CAAC,IAAI,CAAC,CA2BzB;CACF"}
|