@cucumber/cucumber 7.0.0 → 7.3.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.
- package/CHANGELOG.md +63 -17
- package/README.md +8 -11
- package/lib/cli/argv_parser.js.map +1 -1
- package/lib/cli/configuration_builder.js +3 -3
- package/lib/cli/configuration_builder.js.map +1 -1
- package/lib/cli/helpers.js +40 -18
- package/lib/cli/helpers.js.map +1 -1
- package/lib/cli/i18n.js.map +1 -1
- package/lib/cli/index.js +40 -23
- package/lib/cli/index.js.map +1 -1
- package/lib/cli/install_validator.js.map +1 -1
- package/lib/cli/option_splitter.js.map +1 -1
- package/lib/cli/profile_loader.d.ts +1 -2
- package/lib/cli/profile_loader.js.map +1 -1
- package/lib/cli/publish_banner.js.map +1 -1
- package/lib/cli/run.js.map +1 -1
- package/lib/formatter/builder.js.map +1 -1
- package/lib/formatter/get_color_fns.d.ts +2 -2
- package/lib/formatter/get_color_fns.js +7 -8
- package/lib/formatter/get_color_fns.js.map +1 -1
- package/lib/formatter/helpers/event_data_collector.d.ts +14 -17
- package/lib/formatter/helpers/event_data_collector.js +14 -8
- package/lib/formatter/helpers/event_data_collector.js.map +1 -1
- package/lib/formatter/helpers/gherkin_document_parser.d.ts +5 -6
- package/lib/formatter/helpers/gherkin_document_parser.js +1 -4
- package/lib/formatter/helpers/gherkin_document_parser.js.map +1 -1
- package/lib/formatter/helpers/index.js.map +1 -1
- package/lib/formatter/helpers/issue_helpers.d.ts +6 -6
- package/lib/formatter/helpers/issue_helpers.js +5 -6
- package/lib/formatter/helpers/issue_helpers.js.map +1 -1
- package/lib/formatter/helpers/keyword_type.js.map +1 -1
- package/lib/formatter/helpers/location_helpers.js.map +1 -1
- package/lib/formatter/helpers/pickle_parser.d.ts +9 -10
- package/lib/formatter/helpers/pickle_parser.js.map +1 -1
- package/lib/formatter/helpers/step_argument_formatter.d.ts +2 -2
- package/lib/formatter/helpers/step_argument_formatter.js.map +1 -1
- package/lib/formatter/helpers/summary_helpers.d.ts +2 -2
- package/lib/formatter/helpers/summary_helpers.js +32 -14
- package/lib/formatter/helpers/summary_helpers.js.map +1 -1
- package/lib/formatter/helpers/test_case_attempt_formatter.js +33 -14
- package/lib/formatter/helpers/test_case_attempt_formatter.js.map +1 -1
- package/lib/formatter/helpers/test_case_attempt_parser.d.ts +5 -5
- package/lib/formatter/helpers/test_case_attempt_parser.js +27 -9
- package/lib/formatter/helpers/test_case_attempt_parser.js.map +1 -1
- package/lib/formatter/helpers/usage_helpers/index.d.ts +3 -3
- package/lib/formatter/helpers/usage_helpers/index.js +30 -13
- package/lib/formatter/helpers/usage_helpers/index.js.map +1 -1
- package/lib/formatter/html_formatter.js +2 -2
- package/lib/formatter/html_formatter.js.map +1 -1
- package/lib/formatter/http_stream.d.ts +8 -9
- package/lib/formatter/http_stream.js +58 -54
- package/lib/formatter/http_stream.js.map +1 -1
- package/lib/formatter/index.js.map +1 -1
- package/lib/formatter/json_formatter.d.ts +21 -27
- package/lib/formatter/json_formatter.js +50 -23
- package/lib/formatter/json_formatter.js.map +1 -1
- package/lib/formatter/message_formatter.js +1 -1
- package/lib/formatter/message_formatter.js.map +1 -1
- package/lib/formatter/progress_bar_formatter.d.ts +6 -6
- package/lib/formatter/progress_bar_formatter.js +3 -3
- package/lib/formatter/progress_bar_formatter.js.map +1 -1
- package/lib/formatter/progress_formatter.d.ts +2 -2
- package/lib/formatter/progress_formatter.js +29 -10
- package/lib/formatter/progress_formatter.js.map +1 -1
- package/lib/formatter/rerun_formatter.js +22 -4
- package/lib/formatter/rerun_formatter.js.map +1 -1
- package/lib/formatter/snippets_formatter.js +22 -3
- package/lib/formatter/snippets_formatter.js.map +1 -1
- package/lib/formatter/step_definition_snippet_builder/index.d.ts +3 -3
- package/lib/formatter/step_definition_snippet_builder/index.js +1 -1
- package/lib/formatter/step_definition_snippet_builder/index.js.map +1 -1
- package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js.map +1 -1
- package/lib/formatter/step_definition_snippet_builder/snippet_syntax.js.map +1 -1
- package/lib/formatter/summary_formatter.d.ts +2 -2
- package/lib/formatter/summary_formatter.js.map +1 -1
- package/lib/formatter/usage_formatter.js +22 -3
- package/lib/formatter/usage_formatter.js.map +1 -1
- package/lib/formatter/usage_json_formatter.js.map +1 -1
- package/lib/index.d.ts +14 -12
- package/lib/index.js +3 -3
- package/lib/index.js.map +1 -1
- package/lib/models/data_table.d.ts +3 -4
- package/lib/models/data_table.js.map +1 -1
- package/lib/models/definition.d.ts +2 -2
- package/lib/models/definition.js.map +1 -1
- package/lib/models/step_definition.js.map +1 -1
- package/lib/models/test_case_hook_definition.d.ts +2 -2
- package/lib/models/test_case_hook_definition.js.map +1 -1
- package/lib/models/test_run_hook_definition.js.map +1 -1
- package/lib/models/test_step_hook_definition.d.ts +2 -2
- package/lib/models/test_step_hook_definition.js.map +1 -1
- package/lib/pickle_filter.d.ts +9 -11
- package/lib/pickle_filter.js +4 -4
- package/lib/pickle_filter.js.map +1 -1
- package/lib/runtime/assemble_test_cases.d.ts +13 -0
- package/lib/runtime/assemble_test_cases.js +88 -0
- package/lib/runtime/assemble_test_cases.js.map +1 -0
- package/lib/runtime/attachment_manager/index.d.ts +6 -6
- package/lib/runtime/attachment_manager/index.js +33 -6
- package/lib/runtime/attachment_manager/index.js.map +1 -1
- package/lib/runtime/helpers.d.ts +2 -2
- package/lib/runtime/helpers.js.map +1 -1
- package/lib/runtime/index.d.ts +4 -3
- package/lib/runtime/index.js +31 -13
- package/lib/runtime/index.js.map +1 -1
- package/lib/runtime/parallel/command_types.d.ts +10 -9
- package/lib/runtime/parallel/command_types.js.map +1 -1
- package/lib/runtime/parallel/coordinator.d.ts +10 -9
- package/lib/runtime/parallel/coordinator.js +54 -43
- package/lib/runtime/parallel/coordinator.js.map +1 -1
- package/lib/runtime/parallel/run_worker.js.map +1 -1
- package/lib/runtime/parallel/worker.d.ts +2 -2
- package/lib/runtime/parallel/worker.js +8 -14
- package/lib/runtime/parallel/worker.js.map +1 -1
- package/lib/runtime/step_runner.d.ts +3 -3
- package/lib/runtime/step_runner.js +16 -12
- package/lib/runtime/step_runner.js.map +1 -1
- package/lib/runtime/stopwatch.d.ts +4 -4
- package/lib/runtime/stopwatch.js +21 -2
- package/lib/runtime/stopwatch.js.map +1 -1
- package/lib/runtime/{pickle_runner.d.ts → test_case_runner.d.ts} +16 -32
- package/lib/runtime/{pickle_runner.js → test_case_runner.js} +104 -147
- package/lib/runtime/test_case_runner.js.map +1 -0
- package/lib/stack_trace_filter.js.map +1 -1
- package/lib/step_arguments.d.ts +4 -4
- package/lib/step_arguments.js.map +1 -1
- package/lib/support_code_library_builder/build_helpers.js.map +1 -1
- package/lib/support_code_library_builder/finalize_helpers.js.map +1 -1
- package/lib/support_code_library_builder/index.d.ts +9 -7
- package/lib/support_code_library_builder/index.js +10 -10
- package/lib/support_code_library_builder/index.js.map +1 -1
- package/lib/support_code_library_builder/types.d.ts +20 -22
- package/lib/support_code_library_builder/types.js.map +1 -1
- package/lib/support_code_library_builder/validate_arguments.js.map +1 -1
- package/lib/support_code_library_builder/world.d.ts +7 -1
- package/lib/support_code_library_builder/world.js.map +1 -1
- package/lib/time.d.ts +2 -10
- package/lib/time.js +24 -48
- package/lib/time.js.map +1 -1
- package/lib/types/index.js.map +1 -1
- package/lib/uncaught_exception_manager.js +2 -12
- package/lib/uncaught_exception_manager.js.map +1 -1
- package/lib/user_code_runner.js.map +1 -1
- package/lib/value_checker.js.map +1 -1
- package/package.json +49 -46
- package/lib/runtime/pickle_runner.js.map +0 -1
- package/lib/status.d.ts +0 -3
- package/lib/status.js +0 -5
- package/lib/status.js.map +0 -1
|
@@ -1,4 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
2
21
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
22
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
23
|
};
|
|
@@ -8,17 +27,15 @@ const helpers_1 = require("./helpers");
|
|
|
8
27
|
const attachment_manager_1 = __importDefault(require("./attachment_manager"));
|
|
9
28
|
const step_runner_1 = __importDefault(require("./step_runner"));
|
|
10
29
|
const messages_1 = require("@cucumber/messages");
|
|
11
|
-
const
|
|
30
|
+
const messages = __importStar(require("@cucumber/messages"));
|
|
12
31
|
const value_checker_1 = require("../value_checker");
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class PickleRunner {
|
|
16
|
-
constructor({ eventBroadcaster, stopwatch, gherkinDocument, newId, pickle, retries = 0, skip, supportCodeLibrary, worldParameters, }) {
|
|
32
|
+
class TestCaseRunner {
|
|
33
|
+
constructor({ eventBroadcaster, stopwatch, gherkinDocument, newId, pickle, testCase, retries = 0, skip, supportCodeLibrary, worldParameters, }) {
|
|
17
34
|
this.attachmentManager = new attachment_manager_1.default(({ data, media }) => {
|
|
18
35
|
if (value_checker_1.doesNotHaveValue(this.currentTestStepId)) {
|
|
19
36
|
throw new Error('Cannot attach when a step/hook is not running. Ensure your step/hook waits for the attach to finish.');
|
|
20
37
|
}
|
|
21
|
-
|
|
38
|
+
const attachment = {
|
|
22
39
|
attachment: {
|
|
23
40
|
body: data,
|
|
24
41
|
contentEncoding: media.encoding,
|
|
@@ -26,7 +43,8 @@ class PickleRunner {
|
|
|
26
43
|
testCaseStartedId: this.currentTestCaseStartedId,
|
|
27
44
|
testStepId: this.currentTestStepId,
|
|
28
45
|
},
|
|
29
|
-
}
|
|
46
|
+
};
|
|
47
|
+
this.eventBroadcaster.emit('envelope', attachment);
|
|
30
48
|
});
|
|
31
49
|
this.eventBroadcaster = eventBroadcaster;
|
|
32
50
|
this.stopwatch = stopwatch;
|
|
@@ -34,11 +52,10 @@ class PickleRunner {
|
|
|
34
52
|
this.maxAttempts = 1 + (skip ? 0 : retries);
|
|
35
53
|
this.newId = newId;
|
|
36
54
|
this.pickle = pickle;
|
|
55
|
+
this.testCase = testCase;
|
|
37
56
|
this.skip = skip;
|
|
38
57
|
this.supportCodeLibrary = supportCodeLibrary;
|
|
39
58
|
this.worldParameters = worldParameters;
|
|
40
|
-
this.testCaseId = this.newId();
|
|
41
|
-
this.testSteps = this.buildTestSteps();
|
|
42
59
|
this.resetTestProgressData();
|
|
43
60
|
}
|
|
44
61
|
resetTestProgressData() {
|
|
@@ -49,84 +66,6 @@ class PickleRunner {
|
|
|
49
66
|
});
|
|
50
67
|
this.testStepResults = [];
|
|
51
68
|
}
|
|
52
|
-
buildTestSteps() {
|
|
53
|
-
const testSteps = [];
|
|
54
|
-
this.getBeforeHookDefinitions().forEach((hookDefinition) => {
|
|
55
|
-
testSteps.push({
|
|
56
|
-
id: this.newId(),
|
|
57
|
-
hookDefinition,
|
|
58
|
-
isHook: true,
|
|
59
|
-
isBeforeHook: true,
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
this.pickle.steps.forEach((pickleStep) => {
|
|
63
|
-
const stepDefinitions = this.getStepDefinitions(pickleStep);
|
|
64
|
-
testSteps.push({
|
|
65
|
-
id: this.newId(),
|
|
66
|
-
pickleStep,
|
|
67
|
-
stepDefinitions,
|
|
68
|
-
isHook: false,
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
this.getAfterHookDefinitions().forEach((hookDefinition) => {
|
|
72
|
-
testSteps.push({
|
|
73
|
-
id: this.newId(),
|
|
74
|
-
hookDefinition,
|
|
75
|
-
isHook: true,
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
return testSteps;
|
|
79
|
-
}
|
|
80
|
-
emitTestCase() {
|
|
81
|
-
const testCase = {
|
|
82
|
-
pickleId: this.pickle.id,
|
|
83
|
-
id: this.testCaseId,
|
|
84
|
-
testSteps: this.testSteps.map((testStep) => {
|
|
85
|
-
if (testStep.isHook) {
|
|
86
|
-
return {
|
|
87
|
-
id: testStep.id,
|
|
88
|
-
hookId: testStep.hookDefinition.id,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
return {
|
|
93
|
-
id: testStep.id,
|
|
94
|
-
pickleStepId: testStep.pickleStep.id,
|
|
95
|
-
stepDefinitionIds: testStep.stepDefinitions.map((x) => x.id),
|
|
96
|
-
stepMatchArgumentsLists: testStep.stepDefinitions.map((x) => {
|
|
97
|
-
const result = x.expression.match(testStep.pickleStep.text);
|
|
98
|
-
return {
|
|
99
|
-
stepMatchArguments: result.map((arg) => {
|
|
100
|
-
return {
|
|
101
|
-
group: this.mapArgumentGroup(arg.group),
|
|
102
|
-
parameterTypeName: arg.parameterType.name,
|
|
103
|
-
};
|
|
104
|
-
}),
|
|
105
|
-
};
|
|
106
|
-
}),
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
}),
|
|
110
|
-
};
|
|
111
|
-
this.eventBroadcaster.emit('envelope', messages_1.messages.Envelope.fromObject({ testCase }));
|
|
112
|
-
}
|
|
113
|
-
mapArgumentGroup(group) {
|
|
114
|
-
return {
|
|
115
|
-
start: group.start,
|
|
116
|
-
value: group.value,
|
|
117
|
-
children: value_checker_1.doesHaveValue(group.children)
|
|
118
|
-
? group.children.map((child) => this.mapArgumentGroup(child))
|
|
119
|
-
: undefined,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
getAfterHookDefinitions() {
|
|
123
|
-
return lodash_1.clone(this.supportCodeLibrary.afterTestCaseHookDefinitions)
|
|
124
|
-
.reverse()
|
|
125
|
-
.filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle));
|
|
126
|
-
}
|
|
127
|
-
getBeforeHookDefinitions() {
|
|
128
|
-
return this.supportCodeLibrary.beforeTestCaseHookDefinitions.filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle));
|
|
129
|
-
}
|
|
130
69
|
getBeforeStepHookDefinitions() {
|
|
131
70
|
return this.supportCodeLibrary.beforeTestStepHookDefinitions.filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle));
|
|
132
71
|
}
|
|
@@ -135,16 +74,17 @@ class PickleRunner {
|
|
|
135
74
|
.reverse()
|
|
136
75
|
.filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle));
|
|
137
76
|
}
|
|
138
|
-
getStepDefinitions(pickleStep) {
|
|
139
|
-
return this.supportCodeLibrary.stepDefinitions.filter((stepDefinition) => stepDefinition.matchesStepName(pickleStep.text));
|
|
140
|
-
}
|
|
141
77
|
getWorstStepResult() {
|
|
142
78
|
if (this.testStepResults.length === 0) {
|
|
143
|
-
return
|
|
144
|
-
status: this.skip
|
|
145
|
-
|
|
79
|
+
return {
|
|
80
|
+
status: this.skip
|
|
81
|
+
? messages.TestStepResultStatus.SKIPPED
|
|
82
|
+
: messages.TestStepResultStatus.PASSED,
|
|
83
|
+
willBeRetried: false,
|
|
84
|
+
duration: messages.TimeConversion.millisecondsToDuration(0),
|
|
85
|
+
};
|
|
146
86
|
}
|
|
147
|
-
return
|
|
87
|
+
return messages_1.getWorstTestStepResult(this.testStepResults);
|
|
148
88
|
}
|
|
149
89
|
async invokeStep(step, stepDefinition, hookParameter) {
|
|
150
90
|
return await step_runner_1.default.run({
|
|
@@ -156,24 +96,25 @@ class PickleRunner {
|
|
|
156
96
|
});
|
|
157
97
|
}
|
|
158
98
|
isSkippingSteps() {
|
|
159
|
-
return this.getWorstStepResult().status !==
|
|
99
|
+
return (this.getWorstStepResult().status !== messages.TestStepResultStatus.PASSED);
|
|
160
100
|
}
|
|
161
101
|
shouldSkipHook(isBeforeHook) {
|
|
162
102
|
return this.skip || (this.isSkippingSteps() && isBeforeHook);
|
|
163
103
|
}
|
|
164
104
|
async aroundTestStep(testStepId, attempt, runStepFn) {
|
|
165
|
-
|
|
105
|
+
const testStepStarted = {
|
|
166
106
|
testStepStarted: {
|
|
167
107
|
testCaseStartedId: this.currentTestCaseStartedId,
|
|
168
108
|
testStepId,
|
|
169
109
|
timestamp: this.stopwatch.timestamp(),
|
|
170
110
|
},
|
|
171
|
-
}
|
|
111
|
+
};
|
|
112
|
+
this.eventBroadcaster.emit('envelope', testStepStarted);
|
|
172
113
|
this.currentTestStepId = testStepId;
|
|
173
114
|
const testStepResult = await runStepFn();
|
|
174
115
|
this.currentTestStepId = null;
|
|
175
116
|
this.testStepResults.push(testStepResult);
|
|
176
|
-
if (testStepResult.status ===
|
|
117
|
+
if (testStepResult.status === messages.TestStepResultStatus.FAILED &&
|
|
177
118
|
attempt + 1 < this.maxAttempts) {
|
|
178
119
|
/*
|
|
179
120
|
TODO dont rely on `testStepResult.willBeRetried`, it will be moved or removed
|
|
@@ -181,51 +122,58 @@ class PickleRunner {
|
|
|
181
122
|
*/
|
|
182
123
|
testStepResult.willBeRetried = true;
|
|
183
124
|
}
|
|
184
|
-
|
|
125
|
+
const testStepFinished = {
|
|
185
126
|
testStepFinished: {
|
|
186
127
|
testCaseStartedId: this.currentTestCaseStartedId,
|
|
187
128
|
testStepId,
|
|
188
129
|
testStepResult,
|
|
189
130
|
timestamp: this.stopwatch.timestamp(),
|
|
190
131
|
},
|
|
191
|
-
}
|
|
132
|
+
};
|
|
133
|
+
this.eventBroadcaster.emit('envelope', testStepFinished);
|
|
192
134
|
}
|
|
193
135
|
async run() {
|
|
194
|
-
this.emitTestCase();
|
|
195
136
|
for (let attempt = 0; attempt < this.maxAttempts; attempt++) {
|
|
196
137
|
this.currentTestCaseStartedId = this.newId();
|
|
197
|
-
|
|
138
|
+
const testCaseStarted = {
|
|
198
139
|
testCaseStarted: {
|
|
199
140
|
attempt,
|
|
200
|
-
testCaseId: this.
|
|
141
|
+
testCaseId: this.testCase.id,
|
|
201
142
|
id: this.currentTestCaseStartedId,
|
|
202
143
|
timestamp: this.stopwatch.timestamp(),
|
|
203
144
|
},
|
|
204
|
-
}
|
|
205
|
-
|
|
145
|
+
};
|
|
146
|
+
this.eventBroadcaster.emit('envelope', testCaseStarted);
|
|
147
|
+
// used to determine whether a hook is a Before or After
|
|
148
|
+
let didWeRunStepsYet = false;
|
|
149
|
+
for (const testStep of this.testCase.testSteps) {
|
|
206
150
|
await this.aroundTestStep(testStep.id, attempt, async () => {
|
|
207
|
-
if (testStep.
|
|
151
|
+
if (value_checker_1.doesHaveValue(testStep.hookId)) {
|
|
208
152
|
const hookParameter = {
|
|
209
153
|
gherkinDocument: this.gherkinDocument,
|
|
210
154
|
pickle: this.pickle,
|
|
211
155
|
testCaseStartedId: this.currentTestCaseStartedId,
|
|
212
156
|
};
|
|
213
|
-
if (
|
|
157
|
+
if (didWeRunStepsYet) {
|
|
214
158
|
hookParameter.result = this.getWorstStepResult();
|
|
215
159
|
}
|
|
216
|
-
return await this.runHook(testStep.
|
|
160
|
+
return await this.runHook(findHookDefinition(testStep.hookId, this.supportCodeLibrary), hookParameter, !didWeRunStepsYet);
|
|
217
161
|
}
|
|
218
162
|
else {
|
|
219
|
-
|
|
163
|
+
const pickleStep = this.pickle.steps.find((pickleStep) => pickleStep.id === testStep.pickleStepId);
|
|
164
|
+
const testStepResult = await this.runStep(pickleStep, testStep);
|
|
165
|
+
didWeRunStepsYet = true;
|
|
166
|
+
return testStepResult;
|
|
220
167
|
}
|
|
221
168
|
});
|
|
222
169
|
}
|
|
223
|
-
|
|
170
|
+
const testCaseFinished = {
|
|
224
171
|
testCaseFinished: {
|
|
225
172
|
testCaseStartedId: this.currentTestCaseStartedId,
|
|
226
173
|
timestamp: this.stopwatch.timestamp(),
|
|
227
174
|
},
|
|
228
|
-
}
|
|
175
|
+
};
|
|
176
|
+
this.eventBroadcaster.emit('envelope', testCaseFinished);
|
|
229
177
|
if (!this.getWorstStepResult().willBeRetried) {
|
|
230
178
|
break;
|
|
231
179
|
}
|
|
@@ -235,9 +183,11 @@ class PickleRunner {
|
|
|
235
183
|
}
|
|
236
184
|
async runHook(hookDefinition, hookParameter, isBeforeHook) {
|
|
237
185
|
if (this.shouldSkipHook(isBeforeHook)) {
|
|
238
|
-
return
|
|
239
|
-
status:
|
|
240
|
-
|
|
186
|
+
return {
|
|
187
|
+
status: messages.TestStepResultStatus.SKIPPED,
|
|
188
|
+
duration: messages.TimeConversion.millisecondsToDuration(0),
|
|
189
|
+
willBeRetried: false,
|
|
190
|
+
};
|
|
241
191
|
}
|
|
242
192
|
return await this.invokeStep(null, hookDefinition, hookParameter);
|
|
243
193
|
}
|
|
@@ -255,51 +205,58 @@ class PickleRunner {
|
|
|
255
205
|
}
|
|
256
206
|
return stepHooksResult;
|
|
257
207
|
}
|
|
258
|
-
async runStep(testStep) {
|
|
259
|
-
|
|
260
|
-
return
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
208
|
+
async runStep(pickleStep, testStep) {
|
|
209
|
+
const stepDefinitions = testStep.stepDefinitionIds.map((stepDefinitionId) => {
|
|
210
|
+
return findStepDefinition(stepDefinitionId, this.supportCodeLibrary);
|
|
211
|
+
});
|
|
212
|
+
if (stepDefinitions.length === 0) {
|
|
213
|
+
return {
|
|
214
|
+
status: messages.TestStepResultStatus.UNDEFINED,
|
|
215
|
+
duration: messages.TimeConversion.millisecondsToDuration(0),
|
|
216
|
+
willBeRetried: false,
|
|
217
|
+
};
|
|
267
218
|
}
|
|
268
|
-
else if (
|
|
269
|
-
return
|
|
270
|
-
message: helpers_1.getAmbiguousStepException(
|
|
271
|
-
status:
|
|
272
|
-
duration:
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
},
|
|
276
|
-
});
|
|
219
|
+
else if (stepDefinitions.length > 1) {
|
|
220
|
+
return {
|
|
221
|
+
message: helpers_1.getAmbiguousStepException(stepDefinitions),
|
|
222
|
+
status: messages.TestStepResultStatus.AMBIGUOUS,
|
|
223
|
+
duration: messages.TimeConversion.millisecondsToDuration(0),
|
|
224
|
+
willBeRetried: false,
|
|
225
|
+
};
|
|
277
226
|
}
|
|
278
227
|
else if (this.isSkippingSteps()) {
|
|
279
|
-
return
|
|
280
|
-
status:
|
|
281
|
-
duration:
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
},
|
|
285
|
-
});
|
|
228
|
+
return {
|
|
229
|
+
status: messages.TestStepResultStatus.SKIPPED,
|
|
230
|
+
duration: messages.TimeConversion.millisecondsToDuration(0),
|
|
231
|
+
willBeRetried: false,
|
|
232
|
+
};
|
|
286
233
|
}
|
|
287
234
|
let stepResult;
|
|
288
|
-
let stepResults = await this.runStepHooks(this.getBeforeStepHookDefinitions()
|
|
289
|
-
if (
|
|
290
|
-
|
|
235
|
+
let stepResults = await this.runStepHooks(this.getBeforeStepHookDefinitions());
|
|
236
|
+
if (messages_1.getWorstTestStepResult(stepResults).status !==
|
|
237
|
+
messages.TestStepResultStatus.FAILED) {
|
|
238
|
+
stepResult = await this.invokeStep(pickleStep, stepDefinitions[0]);
|
|
291
239
|
stepResults.push(stepResult);
|
|
292
240
|
}
|
|
293
241
|
const afterStepHookResults = await this.runStepHooks(this.getAfterStepHookDefinitions(), stepResult);
|
|
294
242
|
stepResults = stepResults.concat(afterStepHookResults);
|
|
295
|
-
const finalStepResult =
|
|
296
|
-
let finalDuration =
|
|
243
|
+
const finalStepResult = messages_1.getWorstTestStepResult(stepResults);
|
|
244
|
+
let finalDuration = messages.TimeConversion.millisecondsToDuration(0);
|
|
297
245
|
for (const result of stepResults) {
|
|
298
|
-
finalDuration =
|
|
246
|
+
finalDuration = messages.TimeConversion.addDurations(finalDuration, result.duration);
|
|
299
247
|
}
|
|
300
248
|
finalStepResult.duration = finalDuration;
|
|
301
249
|
return finalStepResult;
|
|
302
250
|
}
|
|
303
251
|
}
|
|
304
|
-
exports.default =
|
|
305
|
-
|
|
252
|
+
exports.default = TestCaseRunner;
|
|
253
|
+
function findHookDefinition(id, supportCodeLibrary) {
|
|
254
|
+
return [
|
|
255
|
+
...supportCodeLibrary.beforeTestCaseHookDefinitions,
|
|
256
|
+
...supportCodeLibrary.afterTestCaseHookDefinitions,
|
|
257
|
+
].find((definition) => definition.id === id);
|
|
258
|
+
}
|
|
259
|
+
function findStepDefinition(id, supportCodeLibrary) {
|
|
260
|
+
return supportCodeLibrary.stepDefinitions.find((definition) => definition.id === id);
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=test_case_runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_case_runner.js","sourceRoot":"","sources":["../../src/runtime/test_case_runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { clone } from 'lodash'\nimport { getAmbiguousStepException } from './helpers'\nimport AttachmentManager from './attachment_manager'\nimport StepRunner from './step_runner'\nimport { IdGenerator, getWorstTestStepResult } from '@cucumber/messages'\nimport * as messages from '@cucumber/messages'\nimport { EventEmitter } from 'events'\nimport {\n ISupportCodeLibrary,\n ITestCaseHookParameter,\n ITestStepHookParameter,\n} from '../support_code_library_builder/types'\nimport TestCaseHookDefinition from '../models/test_case_hook_definition'\nimport TestStepHookDefinition from '../models/test_step_hook_definition'\nimport { IDefinition } from '../models/definition'\nimport { doesHaveValue, doesNotHaveValue } from '../value_checker'\nimport { ITestRunStopwatch } from './stopwatch'\nimport StepDefinition from '../models/step_definition'\n\nexport interface INewTestCaseRunnerOptions {\n eventBroadcaster: EventEmitter\n stopwatch: ITestRunStopwatch\n gherkinDocument: messages.GherkinDocument\n newId: IdGenerator.NewId\n pickle: messages.Pickle\n testCase: messages.TestCase\n retries: number\n skip: boolean\n supportCodeLibrary: ISupportCodeLibrary\n worldParameters: any\n}\n\nexport default class TestCaseRunner {\n private readonly attachmentManager: AttachmentManager\n private currentTestCaseStartedId: string\n private currentTestStepId: string\n private readonly eventBroadcaster: EventEmitter\n private readonly stopwatch: ITestRunStopwatch\n private readonly gherkinDocument: messages.GherkinDocument\n private readonly newId: IdGenerator.NewId\n private readonly pickle: messages.Pickle\n private readonly testCase: messages.TestCase\n private readonly maxAttempts: number\n private readonly skip: boolean\n private readonly supportCodeLibrary: ISupportCodeLibrary\n private testStepResults: messages.TestStepResult[]\n private world: any\n private readonly worldParameters: any\n\n constructor({\n eventBroadcaster,\n stopwatch,\n gherkinDocument,\n newId,\n pickle,\n testCase,\n retries = 0,\n skip,\n supportCodeLibrary,\n worldParameters,\n }: INewTestCaseRunnerOptions) {\n this.attachmentManager = new AttachmentManager(({ data, media }) => {\n if (doesNotHaveValue(this.currentTestStepId)) {\n throw new Error(\n 'Cannot attach when a step/hook is not running. Ensure your step/hook waits for the attach to finish.'\n )\n }\n const attachment: messages.Envelope = {\n attachment: {\n body: data,\n contentEncoding: media.encoding,\n mediaType: media.contentType,\n testCaseStartedId: this.currentTestCaseStartedId,\n testStepId: this.currentTestStepId,\n },\n }\n this.eventBroadcaster.emit('envelope', attachment)\n })\n this.eventBroadcaster = eventBroadcaster\n this.stopwatch = stopwatch\n this.gherkinDocument = gherkinDocument\n this.maxAttempts = 1 + (skip ? 0 : retries)\n this.newId = newId\n this.pickle = pickle\n this.testCase = testCase\n this.skip = skip\n this.supportCodeLibrary = supportCodeLibrary\n this.worldParameters = worldParameters\n this.resetTestProgressData()\n }\n\n resetTestProgressData(): void {\n this.world = new this.supportCodeLibrary.World({\n attach: this.attachmentManager.create.bind(this.attachmentManager),\n log: this.attachmentManager.log.bind(this.attachmentManager),\n parameters: this.worldParameters,\n })\n this.testStepResults = []\n }\n\n getBeforeStepHookDefinitions(): TestStepHookDefinition[] {\n return this.supportCodeLibrary.beforeTestStepHookDefinitions.filter(\n (hookDefinition) => hookDefinition.appliesToTestCase(this.pickle)\n )\n }\n\n getAfterStepHookDefinitions(): TestStepHookDefinition[] {\n return clone(this.supportCodeLibrary.afterTestStepHookDefinitions)\n .reverse()\n .filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle))\n }\n\n getWorstStepResult(): messages.TestStepResult {\n if (this.testStepResults.length === 0) {\n return {\n status: this.skip\n ? messages.TestStepResultStatus.SKIPPED\n : messages.TestStepResultStatus.PASSED,\n willBeRetried: false,\n duration: messages.TimeConversion.millisecondsToDuration(0),\n }\n }\n return getWorstTestStepResult(this.testStepResults)\n }\n\n async invokeStep(\n step: messages.PickleStep,\n stepDefinition: IDefinition,\n hookParameter?: any\n ): Promise<messages.TestStepResult> {\n return await StepRunner.run({\n defaultTimeout: this.supportCodeLibrary.defaultTimeout,\n hookParameter,\n step,\n stepDefinition,\n world: this.world,\n })\n }\n\n isSkippingSteps(): boolean {\n return (\n this.getWorstStepResult().status !== messages.TestStepResultStatus.PASSED\n )\n }\n\n shouldSkipHook(isBeforeHook: boolean): boolean {\n return this.skip || (this.isSkippingSteps() && isBeforeHook)\n }\n\n async aroundTestStep(\n testStepId: string,\n attempt: number,\n runStepFn: () => Promise<messages.TestStepResult>\n ): Promise<void> {\n const testStepStarted: messages.Envelope = {\n testStepStarted: {\n testCaseStartedId: this.currentTestCaseStartedId,\n testStepId,\n timestamp: this.stopwatch.timestamp(),\n },\n }\n this.eventBroadcaster.emit('envelope', testStepStarted)\n this.currentTestStepId = testStepId\n const testStepResult = await runStepFn()\n this.currentTestStepId = null\n this.testStepResults.push(testStepResult)\n if (\n testStepResult.status === messages.TestStepResultStatus.FAILED &&\n attempt + 1 < this.maxAttempts\n ) {\n /*\n TODO dont rely on `testStepResult.willBeRetried`, it will be moved or removed\n see https://github.com/cucumber/cucumber/issues/902\n */\n testStepResult.willBeRetried = true\n }\n const testStepFinished: messages.Envelope = {\n testStepFinished: {\n testCaseStartedId: this.currentTestCaseStartedId,\n testStepId,\n testStepResult,\n timestamp: this.stopwatch.timestamp(),\n },\n }\n this.eventBroadcaster.emit('envelope', testStepFinished)\n }\n\n async run(): Promise<messages.TestStepResultStatus> {\n for (let attempt = 0; attempt < this.maxAttempts; attempt++) {\n this.currentTestCaseStartedId = this.newId()\n const testCaseStarted: messages.Envelope = {\n testCaseStarted: {\n attempt,\n testCaseId: this.testCase.id,\n id: this.currentTestCaseStartedId,\n timestamp: this.stopwatch.timestamp(),\n },\n }\n this.eventBroadcaster.emit('envelope', testCaseStarted)\n // used to determine whether a hook is a Before or After\n let didWeRunStepsYet = false\n for (const testStep of this.testCase.testSteps) {\n await this.aroundTestStep(testStep.id, attempt, async () => {\n if (doesHaveValue(testStep.hookId)) {\n const hookParameter: ITestCaseHookParameter = {\n gherkinDocument: this.gherkinDocument,\n pickle: this.pickle,\n testCaseStartedId: this.currentTestCaseStartedId,\n }\n if (didWeRunStepsYet) {\n hookParameter.result = this.getWorstStepResult()\n }\n return await this.runHook(\n findHookDefinition(testStep.hookId, this.supportCodeLibrary),\n hookParameter,\n !didWeRunStepsYet\n )\n } else {\n const pickleStep = this.pickle.steps.find(\n (pickleStep) => pickleStep.id === testStep.pickleStepId\n )\n const testStepResult = await this.runStep(pickleStep, testStep)\n didWeRunStepsYet = true\n return testStepResult\n }\n })\n }\n const testCaseFinished: messages.Envelope = {\n testCaseFinished: {\n testCaseStartedId: this.currentTestCaseStartedId,\n timestamp: this.stopwatch.timestamp(),\n },\n }\n this.eventBroadcaster.emit('envelope', testCaseFinished)\n if (!this.getWorstStepResult().willBeRetried) {\n break\n }\n this.resetTestProgressData()\n }\n return this.getWorstStepResult().status\n }\n\n async runHook(\n hookDefinition: TestCaseHookDefinition,\n hookParameter: ITestCaseHookParameter,\n isBeforeHook: boolean\n ): Promise<messages.TestStepResult> {\n if (this.shouldSkipHook(isBeforeHook)) {\n return {\n status: messages.TestStepResultStatus.SKIPPED,\n duration: messages.TimeConversion.millisecondsToDuration(0),\n willBeRetried: false,\n }\n }\n return await this.invokeStep(null, hookDefinition, hookParameter)\n }\n\n async runStepHooks(\n stepHooks: TestStepHookDefinition[],\n stepResult?: messages.TestStepResult\n ): Promise<messages.TestStepResult[]> {\n const stepHooksResult = []\n const hookParameter: ITestStepHookParameter = {\n gherkinDocument: this.gherkinDocument,\n pickle: this.pickle,\n testCaseStartedId: this.currentTestCaseStartedId,\n testStepId: this.currentTestStepId,\n result: stepResult,\n }\n for (const stepHookDefinition of stepHooks) {\n stepHooksResult.push(\n await this.invokeStep(null, stepHookDefinition, hookParameter)\n )\n }\n return stepHooksResult\n }\n\n async runStep(\n pickleStep: messages.PickleStep,\n testStep: messages.TestStep\n ): Promise<messages.TestStepResult> {\n const stepDefinitions = testStep.stepDefinitionIds.map(\n (stepDefinitionId) => {\n return findStepDefinition(stepDefinitionId, this.supportCodeLibrary)\n }\n )\n if (stepDefinitions.length === 0) {\n return {\n status: messages.TestStepResultStatus.UNDEFINED,\n duration: messages.TimeConversion.millisecondsToDuration(0),\n willBeRetried: false,\n }\n } else if (stepDefinitions.length > 1) {\n return {\n message: getAmbiguousStepException(stepDefinitions),\n status: messages.TestStepResultStatus.AMBIGUOUS,\n duration: messages.TimeConversion.millisecondsToDuration(0),\n willBeRetried: false,\n }\n } else if (this.isSkippingSteps()) {\n return {\n status: messages.TestStepResultStatus.SKIPPED,\n duration: messages.TimeConversion.millisecondsToDuration(0),\n willBeRetried: false,\n }\n }\n\n let stepResult\n let stepResults = await this.runStepHooks(\n this.getBeforeStepHookDefinitions()\n )\n if (\n getWorstTestStepResult(stepResults).status !==\n messages.TestStepResultStatus.FAILED\n ) {\n stepResult = await this.invokeStep(pickleStep, stepDefinitions[0])\n stepResults.push(stepResult)\n }\n const afterStepHookResults = await this.runStepHooks(\n this.getAfterStepHookDefinitions(),\n stepResult\n )\n stepResults = stepResults.concat(afterStepHookResults)\n\n const finalStepResult = getWorstTestStepResult(stepResults)\n let finalDuration = messages.TimeConversion.millisecondsToDuration(0)\n for (const result of stepResults) {\n finalDuration = messages.TimeConversion.addDurations(\n finalDuration,\n result.duration\n )\n }\n finalStepResult.duration = finalDuration\n return finalStepResult\n }\n}\n\nfunction findHookDefinition(\n id: string,\n supportCodeLibrary: ISupportCodeLibrary\n): TestCaseHookDefinition {\n return [\n ...supportCodeLibrary.beforeTestCaseHookDefinitions,\n ...supportCodeLibrary.afterTestCaseHookDefinitions,\n ].find((definition) => definition.id === id)\n}\n\nfunction findStepDefinition(\n id: string,\n supportCodeLibrary: ISupportCodeLibrary\n): StepDefinition {\n return supportCodeLibrary.stepDefinitions.find(\n (definition) => definition.id === id\n )\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stack_trace_filter.js","sourceRoot":"","sources":["../src/stack_trace_filter.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAsB;AACtB,8DAAoC;AACpC,gDAAuB;AACvB,mDAAgD;AAGhD,MAAM,eAAe,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;AAClD,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,CAAA;AAEvD,SAAgB,oBAAoB,CAAC,QAAgB;IACnD,OAAO,gBAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CACtC,gBAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,cAAI,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,CACxD,CAAA;AACH,CAAC;AAJD,oDAIC;AAED,MAAqB,gBAAgB;IAGnC,MAAM;QACJ,IAAI,CAAC,aAAa,GAAG,qBAAU,CAAC,MAAM,CAAC,MAAM,CAC3C,CAAC,IAAS,EAAE,MAAkB,EAAE,EAAE;YAChC,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE;gBAClC,OAAO,MAAM,CAAA;aACd;YACD,MAAM,KAAK,GAAG,gBAAC,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;YACpE,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;gBAChB,OAAO,MAAM,CAAA;aACd;YACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QAC/B,CAAC,CACF,CAAA;IACH,CAAC;IAED,iBAAiB,CAAC,MAAkB;QAClC,MAAM,cAAc,GAAG,gBAAC,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACtE,OAAO,CACL,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CACvE,CAAA;IACH,CAAC;IAED,iBAAiB,CAAC,KAAe;QAC/B,MAAM,QAAQ,GAAG,8BAAc,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAA;QACxD,OAAO,oBAAoB,CAAC,QAAQ,CAAC,CAAA;IACvC,CAAC;IAED,aAAa,CAAC,KAAe;QAC3B,MAAM,QAAQ,GAAG,8BAAc,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAA;QACxD,OAAO,CAAC,gBAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAI,CAAC,GAAG,CAAC,CAAA;IACxC,CAAC;IAED,QAAQ;QACN,qBAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAChD,CAAC;CACF;AAtCD,mCAsCC"}
|
|
1
|
+
{"version":3,"file":"stack_trace_filter.js","sourceRoot":"","sources":["../src/stack_trace_filter.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAsB;AACtB,8DAAoC;AACpC,gDAAuB;AACvB,mDAAgD;AAGhD,MAAM,eAAe,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;AAClD,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,CAAA;AAEvD,SAAgB,oBAAoB,CAAC,QAAgB;IACnD,OAAO,gBAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CACtC,gBAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,cAAI,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,CACxD,CAAA;AACH,CAAC;AAJD,oDAIC;AAED,MAAqB,gBAAgB;IAGnC,MAAM;QACJ,IAAI,CAAC,aAAa,GAAG,qBAAU,CAAC,MAAM,CAAC,MAAM,CAC3C,CAAC,IAAS,EAAE,MAAkB,EAAE,EAAE;YAChC,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE;gBAClC,OAAO,MAAM,CAAA;aACd;YACD,MAAM,KAAK,GAAG,gBAAC,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;YACpE,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;gBAChB,OAAO,MAAM,CAAA;aACd;YACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QAC/B,CAAC,CACF,CAAA;IACH,CAAC;IAED,iBAAiB,CAAC,MAAkB;QAClC,MAAM,cAAc,GAAG,gBAAC,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACtE,OAAO,CACL,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CACvE,CAAA;IACH,CAAC;IAED,iBAAiB,CAAC,KAAe;QAC/B,MAAM,QAAQ,GAAG,8BAAc,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAA;QACxD,OAAO,oBAAoB,CAAC,QAAQ,CAAC,CAAA;IACvC,CAAC;IAED,aAAa,CAAC,KAAe;QAC3B,MAAM,QAAQ,GAAG,8BAAc,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAA;QACxD,OAAO,CAAC,gBAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAI,CAAC,GAAG,CAAC,CAAA;IACxC,CAAC;IAED,QAAQ;QACN,qBAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAChD,CAAC;CACF;AAtCD,mCAsCC","sourcesContent":["import _ from 'lodash'\nimport stackChain from 'stack-chain'\nimport path from 'path'\nimport { valueOrDefault } from './value_checker'\nimport CallSite = NodeJS.CallSite\n\nconst projectRootPath = path.join(__dirname, '..')\nconst projectChildDirs = ['src', 'lib', 'node_modules']\n\nexport function isFileNameInCucumber(fileName: string): boolean {\n return _.some(projectChildDirs, (dir) =>\n _.startsWith(fileName, path.join(projectRootPath, dir))\n )\n}\n\nexport default class StackTraceFilter {\n private currentFilter: CallSite[]\n\n filter(): void {\n this.currentFilter = stackChain.filter.attach(\n (_err: any, frames: CallSite[]) => {\n if (this.isErrorInCucumber(frames)) {\n return frames\n }\n const index = _.findIndex(frames, this.isFrameInCucumber.bind(this))\n if (index === -1) {\n return frames\n }\n return frames.slice(0, index)\n }\n )\n }\n\n isErrorInCucumber(frames: CallSite[]): boolean {\n const filteredFrames = _.reject(frames, this.isFrameInNode.bind(this))\n return (\n filteredFrames.length > 0 && this.isFrameInCucumber(filteredFrames[0])\n )\n }\n\n isFrameInCucumber(frame: CallSite): boolean {\n const fileName = valueOrDefault(frame.getFileName(), '')\n return isFileNameInCucumber(fileName)\n }\n\n isFrameInNode(frame: CallSite): boolean {\n const fileName = valueOrDefault(frame.getFileName(), '')\n return !_.includes(fileName, path.sep)\n }\n\n unfilter(): void {\n stackChain.filter.deattach(this.currentFilter)\n }\n}\n"]}
|
package/lib/step_arguments.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as messages from '@cucumber/messages';
|
|
2
2
|
export interface IPickleStepArgumentFunctionMap<T> {
|
|
3
|
-
dataTable: (arg: messages.
|
|
4
|
-
docString: (arg: messages.
|
|
3
|
+
dataTable: (arg: messages.PickleTable) => T;
|
|
4
|
+
docString: (arg: messages.PickleDocString) => T;
|
|
5
5
|
}
|
|
6
|
-
export declare function parseStepArgument<T>(arg: messages.
|
|
6
|
+
export declare function parseStepArgument<T>(arg: messages.PickleStepArgument, mapping: IPickleStepArgumentFunctionMap<T>): T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step_arguments.js","sourceRoot":"","sources":["../src/step_arguments.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AAEvB,mDAA+C;AAO/C,SAAgB,iBAAiB,CAC/B,
|
|
1
|
+
{"version":3,"file":"step_arguments.js","sourceRoot":"","sources":["../src/step_arguments.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AAEvB,mDAA+C;AAO/C,SAAgB,iBAAiB,CAC/B,GAAgC,EAChC,OAA0C;IAE1C,IAAI,6BAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;QAChC,OAAO,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;KACxC;SAAM,IAAI,6BAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;QACvC,OAAO,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;KACxC;IACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,cAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AAChE,CAAC;AAVD,8CAUC","sourcesContent":["import util from 'util'\nimport * as messages from '@cucumber/messages'\nimport { doesHaveValue } from './value_checker'\n\nexport interface IPickleStepArgumentFunctionMap<T> {\n dataTable: (arg: messages.PickleTable) => T\n docString: (arg: messages.PickleDocString) => T\n}\n\nexport function parseStepArgument<T>(\n arg: messages.PickleStepArgument,\n mapping: IPickleStepArgumentFunctionMap<T>\n): T {\n if (doesHaveValue(arg.dataTable)) {\n return mapping.dataTable(arg.dataTable)\n } else if (doesHaveValue(arg.docString)) {\n return mapping.docString(arg.docString)\n }\n throw new Error(`Unknown step argument: ${util.inspect(arg)}`)\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build_helpers.js","sourceRoot":"","sources":["../../src/support_code_library_builder/build_helpers.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAsB;AACtB,yEAA8D;AAC9D,gDAAuB;AACvB,kEAAsC;AACtC,8DAA4D;AAC5D,oDAAgE;AAIhE,SAAgB,uBAAuB,CAAC,GAAW;IACjD,IAAI,IAAY,CAAA;IAChB,IAAI,GAAW,CAAA;IACf,MAAM,WAAW,GAAG,uBAAU,CAAC,OAAO,EAAE,CAAA;IACxC,MAAM,UAAU,GAAG,gBAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;QAC/C,OAAO,CAAC,yCAAoB,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IACF,IAAI,6BAAa,CAAC,UAAU,CAAC,EAAE;QAC7B,IAAI,GAAG,UAAU,CAAC,aAAa,EAAE,CAAA;QACjC,GAAG,GAAG,UAAU,CAAC,WAAW,EAAE,CAAA;QAC9B,IAAI,6BAAa,CAAC,GAAG,CAAC,EAAE;YACtB,GAAG,GAAG,cAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;SAC9B;KACF;IACD,OAAO;QACL,IAAI,EAAE,8BAAc,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7B,GAAG,EAAE,8BAAc,CAAC,GAAG,EAAE,SAAS,CAAC;KACpC,CAAA;AACH,CAAC;AAlBD,0DAkBC;AAED,SAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,MAAM,EACN,WAAW,EACX,cAAc,EACd,oBAAoB,GACU;IAC9B,IAAI,OAAO,cAAc,KAAK,SAAS;QAAE,cAAc,GAAG,IAAI,CAAA;IAC9D,IAAI,OAAO,oBAAoB,KAAK,SAAS;QAAE,oBAAoB,GAAG,KAAK,CAAA;IAC3E,OAAO,IAAI,oCAAa,CACtB,IAAI,EACJ,MAAM,EACN,IAAI,EACJ,WAAW,EACX,cAAc,EACd,oBAAoB,CACrB,CAAA;AACH,CAAC;AAjBD,gDAiBC"}
|
|
1
|
+
{"version":3,"file":"build_helpers.js","sourceRoot":"","sources":["../../src/support_code_library_builder/build_helpers.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAsB;AACtB,yEAA8D;AAC9D,gDAAuB;AACvB,kEAAsC;AACtC,8DAA4D;AAC5D,oDAAgE;AAIhE,SAAgB,uBAAuB,CAAC,GAAW;IACjD,IAAI,IAAY,CAAA;IAChB,IAAI,GAAW,CAAA;IACf,MAAM,WAAW,GAAG,uBAAU,CAAC,OAAO,EAAE,CAAA;IACxC,MAAM,UAAU,GAAG,gBAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;QAC/C,OAAO,CAAC,yCAAoB,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IACF,IAAI,6BAAa,CAAC,UAAU,CAAC,EAAE;QAC7B,IAAI,GAAG,UAAU,CAAC,aAAa,EAAE,CAAA;QACjC,GAAG,GAAG,UAAU,CAAC,WAAW,EAAE,CAAA;QAC9B,IAAI,6BAAa,CAAC,GAAG,CAAC,EAAE;YACtB,GAAG,GAAG,cAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;SAC9B;KACF;IACD,OAAO;QACL,IAAI,EAAE,8BAAc,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7B,GAAG,EAAE,8BAAc,CAAC,GAAG,EAAE,SAAS,CAAC;KACpC,CAAA;AACH,CAAC;AAlBD,0DAkBC;AAED,SAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,MAAM,EACN,WAAW,EACX,cAAc,EACd,oBAAoB,GACU;IAC9B,IAAI,OAAO,cAAc,KAAK,SAAS;QAAE,cAAc,GAAG,IAAI,CAAA;IAC9D,IAAI,OAAO,oBAAoB,KAAK,SAAS;QAAE,oBAAoB,GAAG,KAAK,CAAA;IAC3E,OAAO,IAAI,oCAAa,CACtB,IAAI,EACJ,MAAM,EACN,IAAI,EACJ,WAAW,EACX,cAAc,EACd,oBAAoB,CACrB,CAAA;AACH,CAAC;AAjBD,gDAiBC","sourcesContent":["import _ from 'lodash'\nimport { ParameterType } from '@cucumber/cucumber-expressions'\nimport path from 'path'\nimport StackTrace from 'stacktrace-js'\nimport { isFileNameInCucumber } from '../stack_trace_filter'\nimport { doesHaveValue, valueOrDefault } from '../value_checker'\nimport { ILineAndUri } from '../types'\nimport { IParameterTypeDefinition } from './types'\n\nexport function getDefinitionLineAndUri(cwd: string): ILineAndUri {\n let line: number\n let uri: string\n const stackframes = StackTrace.getSync()\n const stackframe = _.find(stackframes, (frame) => {\n return !isFileNameInCucumber(frame.getFileName())\n })\n if (doesHaveValue(stackframe)) {\n line = stackframe.getLineNumber()\n uri = stackframe.getFileName()\n if (doesHaveValue(uri)) {\n uri = path.relative(cwd, uri)\n }\n }\n return {\n line: valueOrDefault(line, 0),\n uri: valueOrDefault(uri, 'unknown'),\n }\n}\n\nexport function buildParameterType({\n name,\n regexp,\n transformer,\n useForSnippets,\n preferForRegexpMatch,\n}: IParameterTypeDefinition<any>): ParameterType<any> {\n if (typeof useForSnippets !== 'boolean') useForSnippets = true\n if (typeof preferForRegexpMatch !== 'boolean') preferForRegexpMatch = false\n return new ParameterType(\n name,\n regexp,\n null,\n transformer,\n useForSnippets,\n preferForRegexpMatch\n )\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"finalize_helpers.js","sourceRoot":"","sources":["../../src/support_code_library_builder/finalize_helpers.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAsC;AACtC,gDAAuB;AAavB,SAAgB,4BAA4B,CAAC,EAC3C,GAAG,EACH,iBAAiB,GACoB;IACrC,MAAM,0BAA0B,GAAG,iBAAiB,CAAC,MAAM,CACzD,CAAC,gBAAgB,EAAE,EAAE,CAAC,sBAAW,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAC5D,CAAA;IACD,IAAI,0BAA0B,CAAC,MAAM,GAAG,CAAC,EAAE;QACzC,MAAM,UAAU,GAAG,0BAA0B;aAC1C,GAAG,CACF,CAAC,gBAAgB,EAAE,EAAE,CACnB,GAAG,cAAI,CAAC,QAAQ,CACd,GAAG,EACH,gBAAgB,CAAC,GAAG,CACrB,IAAI,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAC1C;aACA,IAAI,CAAC,MAAM,CAAC,CAAA;QACf,MAAM,OAAO,GAAG;;;UAGV,UAAU;;;OAGb,CAAA;QACH,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAA;KACzB;AACH,CAAC;AA1BD,oEA0BC"}
|
|
1
|
+
{"version":3,"file":"finalize_helpers.js","sourceRoot":"","sources":["../../src/support_code_library_builder/finalize_helpers.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAsC;AACtC,gDAAuB;AAavB,SAAgB,4BAA4B,CAAC,EAC3C,GAAG,EACH,iBAAiB,GACoB;IACrC,MAAM,0BAA0B,GAAG,iBAAiB,CAAC,MAAM,CACzD,CAAC,gBAAgB,EAAE,EAAE,CAAC,sBAAW,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAC5D,CAAA;IACD,IAAI,0BAA0B,CAAC,MAAM,GAAG,CAAC,EAAE;QACzC,MAAM,UAAU,GAAG,0BAA0B;aAC1C,GAAG,CACF,CAAC,gBAAgB,EAAE,EAAE,CACnB,GAAG,cAAI,CAAC,QAAQ,CACd,GAAG,EACH,gBAAgB,CAAC,GAAG,CACrB,IAAI,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAC1C;aACA,IAAI,CAAC,MAAM,CAAC,CAAA;QACf,MAAM,OAAO,GAAG;;;UAGV,UAAU;;;OAGb,CAAA;QACH,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAA;KACzB;AACH,CAAC;AA1BD,oEA0BC","sourcesContent":["import isGenerator from 'is-generator'\nimport path from 'path'\n\nexport interface IDefinitionConfig {\n code: any\n line: number\n uri: string\n}\n\nexport interface IValidateNoGeneratorFunctionsRequest {\n cwd: string\n definitionConfigs: IDefinitionConfig[]\n}\n\nexport function validateNoGeneratorFunctions({\n cwd,\n definitionConfigs,\n}: IValidateNoGeneratorFunctionsRequest): void {\n const generatorDefinitionConfigs = definitionConfigs.filter(\n (definitionConfig) => isGenerator.fn(definitionConfig.code)\n )\n if (generatorDefinitionConfigs.length > 0) {\n const references = generatorDefinitionConfigs\n .map(\n (definitionConfig) =>\n `${path.relative(\n cwd,\n definitionConfig.uri\n )}:${definitionConfig.line.toString()}`\n )\n .join('\\n ')\n const message = `\n The following hook/step definitions use generator functions:\n\n ${references}\n\n Use 'this.setDefinitionFunctionWrapper(fn)' to wrap them in a function that returns a promise.\n `\n throw new Error(message)\n }\n}\n"]}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { IdGenerator
|
|
1
|
+
import { IdGenerator } from '@cucumber/messages';
|
|
2
|
+
import * as messages from '@cucumber/messages';
|
|
2
3
|
import TestCaseHookDefinition from '../models/test_case_hook_definition';
|
|
3
4
|
import TestStepHookDefinition from '../models/test_step_hook_definition';
|
|
4
5
|
import TestRunHookDefinition from '../models/test_run_hook_definition';
|
|
5
6
|
import StepDefinition from '../models/step_definition';
|
|
6
7
|
import { DefineStepPattern, IDefineStepOptions, IDefineSupportCodeMethods, IDefineTestCaseHookOptions, IDefineTestStepHookOptions, IDefineTestRunHookOptions, IParameterTypeDefinition, ISupportCodeLibrary, TestCaseHookFunction, TestStepHookFunction } from './types';
|
|
8
|
+
import { ICanonicalSupportCodeIds } from '../runtime/parallel/command_types';
|
|
7
9
|
interface ITestCaseHookDefinitionConfig {
|
|
8
10
|
code: any;
|
|
9
11
|
line: number;
|
|
@@ -41,21 +43,21 @@ export declare class SupportCodeLibraryBuilder {
|
|
|
41
43
|
constructor();
|
|
42
44
|
defineParameterType(options: IParameterTypeDefinition<any>): void;
|
|
43
45
|
defineStep(pattern: DefineStepPattern, options: IDefineStepOptions | Function, code?: Function): void;
|
|
44
|
-
defineTestCaseHook(getCollection: () => ITestCaseHookDefinitionConfig[]): (options: string | IDefineTestCaseHookOptions | TestCaseHookFunction
|
|
45
|
-
defineTestStepHook(getCollection: () => ITestStepHookDefinitionConfig[]): (options: string | IDefineTestStepHookOptions | TestStepHookFunction
|
|
46
|
+
defineTestCaseHook(getCollection: () => ITestCaseHookDefinitionConfig[]): <WorldType>(options: string | IDefineTestCaseHookOptions | TestCaseHookFunction<WorldType>, code?: TestCaseHookFunction<WorldType>) => void;
|
|
47
|
+
defineTestStepHook(getCollection: () => ITestStepHookDefinitionConfig[]): <WorldType>(options: string | IDefineTestStepHookOptions | TestStepHookFunction<WorldType>, code?: TestStepHookFunction<WorldType>) => void;
|
|
46
48
|
defineTestRunHook(getCollection: () => ITestRunHookDefinitionConfig[]): (options: IDefineTestRunHookOptions | Function, code?: Function) => void;
|
|
47
49
|
wrapCode({ code, wrapperOptions, }: {
|
|
48
50
|
code: Function;
|
|
49
51
|
wrapperOptions: any;
|
|
50
52
|
}): Function;
|
|
51
|
-
buildTestCaseHookDefinitions(configs: ITestCaseHookDefinitionConfig[]): TestCaseHookDefinition[];
|
|
53
|
+
buildTestCaseHookDefinitions(configs: ITestCaseHookDefinitionConfig[], canonicalIds?: string[]): TestCaseHookDefinition[];
|
|
52
54
|
buildTestStepHookDefinitions(configs: ITestStepHookDefinitionConfig[]): TestStepHookDefinition[];
|
|
53
55
|
buildTestRunHookDefinitions(configs: ITestRunHookDefinitionConfig[]): TestRunHookDefinition[];
|
|
54
|
-
buildStepDefinitions(): {
|
|
56
|
+
buildStepDefinitions(canonicalIds?: string[]): {
|
|
55
57
|
stepDefinitions: StepDefinition[];
|
|
56
|
-
undefinedParameterTypes: messages.
|
|
58
|
+
undefinedParameterTypes: messages.UndefinedParameterType[];
|
|
57
59
|
};
|
|
58
|
-
finalize(): ISupportCodeLibrary;
|
|
60
|
+
finalize(canonicalIds?: ICanonicalSupportCodeIds): ISupportCodeLibrary;
|
|
59
61
|
reset(cwd: string, newId: IdGenerator.NewId): void;
|
|
60
62
|
}
|
|
61
63
|
declare const _default: SupportCodeLibraryBuilder;
|
|
@@ -144,15 +144,15 @@ class SupportCodeLibraryBuilder {
|
|
|
144
144
|
}
|
|
145
145
|
return code;
|
|
146
146
|
}
|
|
147
|
-
buildTestCaseHookDefinitions(configs) {
|
|
148
|
-
return configs.map(({ code, line, options, uri }) => {
|
|
147
|
+
buildTestCaseHookDefinitions(configs, canonicalIds) {
|
|
148
|
+
return configs.map(({ code, line, options, uri }, index) => {
|
|
149
149
|
const wrappedCode = this.wrapCode({
|
|
150
150
|
code,
|
|
151
151
|
wrapperOptions: options.wrapperOptions,
|
|
152
152
|
});
|
|
153
153
|
return new test_case_hook_definition_1.default({
|
|
154
154
|
code: wrappedCode,
|
|
155
|
-
id: this.newId(),
|
|
155
|
+
id: canonicalIds ? canonicalIds[index] : this.newId(),
|
|
156
156
|
line,
|
|
157
157
|
options,
|
|
158
158
|
unwrappedCode: code,
|
|
@@ -192,10 +192,10 @@ class SupportCodeLibraryBuilder {
|
|
|
192
192
|
});
|
|
193
193
|
});
|
|
194
194
|
}
|
|
195
|
-
buildStepDefinitions() {
|
|
195
|
+
buildStepDefinitions(canonicalIds) {
|
|
196
196
|
const stepDefinitions = [];
|
|
197
197
|
const undefinedParameterTypes = [];
|
|
198
|
-
this.stepDefinitionConfigs.forEach(({ code, line, options, pattern, uri }) => {
|
|
198
|
+
this.stepDefinitionConfigs.forEach(({ code, line, options, pattern, uri }, index) => {
|
|
199
199
|
let expression;
|
|
200
200
|
if (typeof pattern === 'string') {
|
|
201
201
|
try {
|
|
@@ -222,7 +222,7 @@ class SupportCodeLibraryBuilder {
|
|
|
222
222
|
stepDefinitions.push(new step_definition_1.default({
|
|
223
223
|
code: wrappedCode,
|
|
224
224
|
expression,
|
|
225
|
-
id: this.newId(),
|
|
225
|
+
id: canonicalIds ? canonicalIds[index] : this.newId(),
|
|
226
226
|
line,
|
|
227
227
|
options,
|
|
228
228
|
pattern,
|
|
@@ -232,7 +232,7 @@ class SupportCodeLibraryBuilder {
|
|
|
232
232
|
});
|
|
233
233
|
return { stepDefinitions, undefinedParameterTypes };
|
|
234
234
|
}
|
|
235
|
-
finalize() {
|
|
235
|
+
finalize(canonicalIds) {
|
|
236
236
|
if (value_checker_1.doesNotHaveValue(this.definitionFunctionWrapper)) {
|
|
237
237
|
const definitionConfigs = lodash_1.default.chain([
|
|
238
238
|
this.afterTestCaseHookDefinitionConfigs,
|
|
@@ -245,12 +245,12 @@ class SupportCodeLibraryBuilder {
|
|
|
245
245
|
.value();
|
|
246
246
|
finalize_helpers_1.validateNoGeneratorFunctions({ cwd: this.cwd, definitionConfigs });
|
|
247
247
|
}
|
|
248
|
-
const stepDefinitionsResult = this.buildStepDefinitions();
|
|
248
|
+
const stepDefinitionsResult = this.buildStepDefinitions(canonicalIds === null || canonicalIds === void 0 ? void 0 : canonicalIds.stepDefinitionIds);
|
|
249
249
|
return {
|
|
250
|
-
afterTestCaseHookDefinitions: this.buildTestCaseHookDefinitions(this.afterTestCaseHookDefinitionConfigs),
|
|
250
|
+
afterTestCaseHookDefinitions: this.buildTestCaseHookDefinitions(this.afterTestCaseHookDefinitionConfigs, canonicalIds === null || canonicalIds === void 0 ? void 0 : canonicalIds.afterTestCaseHookDefinitionIds),
|
|
251
251
|
afterTestRunHookDefinitions: this.buildTestRunHookDefinitions(this.afterTestRunHookDefinitionConfigs),
|
|
252
252
|
afterTestStepHookDefinitions: this.buildTestStepHookDefinitions(this.afterTestStepHookDefinitionConfigs),
|
|
253
|
-
beforeTestCaseHookDefinitions: this.buildTestCaseHookDefinitions(this.beforeTestCaseHookDefinitionConfigs),
|
|
253
|
+
beforeTestCaseHookDefinitions: this.buildTestCaseHookDefinitions(this.beforeTestCaseHookDefinitionConfigs, canonicalIds === null || canonicalIds === void 0 ? void 0 : canonicalIds.beforeTestCaseHookDefinitionIds),
|
|
254
254
|
beforeTestRunHookDefinitions: this.buildTestRunHookDefinitions(this.beforeTestRunHookDefinitionConfigs),
|
|
255
255
|
beforeTestStepHookDefinitions: this.buildTestStepHookDefinitions(this.beforeTestStepHookDefinitionConfigs),
|
|
256
256
|
defaultTimeout: this.defaultTimeout,
|