@dev-blinq/cucumber-js 1.0.36 → 1.0.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/bin/cucumber-js +0 -0
  2. package/bin/cucumber.js +0 -0
  3. package/lib/api/console_logger.d.ts +12 -12
  4. package/lib/api/console_logger.js +23 -23
  5. package/lib/api/convert_configuration.d.ts +4 -4
  6. package/lib/api/convert_configuration.js +65 -65
  7. package/lib/api/environment.d.ts +2 -2
  8. package/lib/api/environment.js +13 -13
  9. package/lib/api/formatters.d.ts +20 -20
  10. package/lib/api/formatters.js +60 -60
  11. package/lib/api/gherkin.d.ts +21 -21
  12. package/lib/api/gherkin.js +99 -99
  13. package/lib/api/index.d.ts +12 -12
  14. package/lib/api/index.js +27 -27
  15. package/lib/api/load_configuration.d.ts +9 -9
  16. package/lib/api/load_configuration.js +40 -40
  17. package/lib/api/load_sources.d.ts +9 -9
  18. package/lib/api/load_sources.js +52 -52
  19. package/lib/api/load_support.d.ts +10 -10
  20. package/lib/api/load_support.js +29 -29
  21. package/lib/api/paths.d.ts +8 -8
  22. package/lib/api/paths.js +101 -101
  23. package/lib/api/plugins.d.ts +4 -4
  24. package/lib/api/plugins.js +18 -18
  25. package/lib/api/run_cucumber.d.ts +11 -11
  26. package/lib/api/run_cucumber.js +114 -114
  27. package/lib/api/runtime.d.ts +21 -21
  28. package/lib/api/runtime.js +35 -35
  29. package/lib/api/support.d.ts +9 -9
  30. package/lib/api/support.js +25 -25
  31. package/lib/api/test_helpers.d.ts +3 -3
  32. package/lib/api/test_helpers.js +30 -30
  33. package/lib/api/types.d.ts +177 -177
  34. package/lib/api/types.js +2 -2
  35. package/lib/cli/helpers.d.ts +39 -39
  36. package/lib/cli/helpers.js +223 -223
  37. package/lib/cli/i18n.d.ts +2 -2
  38. package/lib/cli/i18n.js +69 -69
  39. package/lib/cli/index.d.ts +21 -21
  40. package/lib/cli/index.js +63 -63
  41. package/lib/cli/install_validator.d.ts +1 -1
  42. package/lib/cli/install_validator.js +13 -13
  43. package/lib/cli/run.d.ts +1 -1
  44. package/lib/cli/run.js +43 -43
  45. package/lib/cli/validate_node_engine_version.d.ts +10 -10
  46. package/lib/cli/validate_node_engine_version.js +23 -23
  47. package/lib/configuration/argv_parser.d.ts +20 -20
  48. package/lib/configuration/argv_parser.js +102 -102
  49. package/lib/configuration/check_schema.d.ts +2 -2
  50. package/lib/configuration/check_schema.js +59 -59
  51. package/lib/configuration/default_configuration.d.ts +2 -2
  52. package/lib/configuration/default_configuration.js +28 -28
  53. package/lib/configuration/from_file.d.ts +3 -3
  54. package/lib/configuration/from_file.js +84 -84
  55. package/lib/configuration/helpers.d.ts +1 -1
  56. package/lib/configuration/helpers.js +10 -10
  57. package/lib/configuration/index.d.ts +7 -7
  58. package/lib/configuration/index.js +28 -28
  59. package/lib/configuration/locate_file.d.ts +1 -1
  60. package/lib/configuration/locate_file.js +20 -20
  61. package/lib/configuration/merge_configurations.d.ts +2 -2
  62. package/lib/configuration/merge_configurations.js +47 -47
  63. package/lib/configuration/option_splitter.d.ts +3 -3
  64. package/lib/configuration/option_splitter.js +22 -22
  65. package/lib/configuration/types.d.ts +30 -30
  66. package/lib/configuration/types.js +2 -2
  67. package/lib/configuration/validate_configuration.d.ts +3 -3
  68. package/lib/configuration/validate_configuration.js +12 -12
  69. package/lib/filter_stack_trace.d.ts +3 -3
  70. package/lib/filter_stack_trace.js +37 -37
  71. package/lib/formatter/builder.d.ts +37 -37
  72. package/lib/formatter/builder.js +100 -100
  73. package/lib/formatter/bvt_analysis_formatter.d.ts +18 -18
  74. package/lib/formatter/bvt_analysis_formatter.js +192 -192
  75. package/lib/formatter/feature_data_format.d.ts +14 -14
  76. package/lib/formatter/feature_data_format.js +80 -80
  77. package/lib/formatter/fixtures/typescript.d.ts +2 -2
  78. package/lib/formatter/fixtures/typescript.js +5 -5
  79. package/lib/formatter/get_color_fns.d.ts +15 -15
  80. package/lib/formatter/get_color_fns.js +55 -55
  81. package/lib/formatter/helpers/duration_helpers.d.ts +2 -2
  82. package/lib/formatter/helpers/duration_helpers.js +8 -8
  83. package/lib/formatter/helpers/event_data_collector.d.ts +30 -30
  84. package/lib/formatter/helpers/event_data_collector.js +125 -125
  85. package/lib/formatter/helpers/formatters.d.ts +6 -6
  86. package/lib/formatter/helpers/formatters.js +44 -44
  87. package/lib/formatter/helpers/gherkin_document_parser.d.ts +5 -5
  88. package/lib/formatter/helpers/gherkin_document_parser.js +65 -65
  89. package/lib/formatter/helpers/index.d.ts +10 -10
  90. package/lib/formatter/helpers/index.js +51 -51
  91. package/lib/formatter/helpers/issue_helpers.d.ts +19 -19
  92. package/lib/formatter/helpers/issue_helpers.js +58 -58
  93. package/lib/formatter/helpers/keyword_type.d.ts +11 -11
  94. package/lib/formatter/helpers/keyword_type.js +31 -31
  95. package/lib/formatter/helpers/location_helpers.d.ts +2 -2
  96. package/lib/formatter/helpers/location_helpers.js +16 -16
  97. package/lib/formatter/helpers/pickle_parser.d.ts +17 -17
  98. package/lib/formatter/helpers/pickle_parser.js +27 -27
  99. package/lib/formatter/helpers/report_generator.d.ts +107 -103
  100. package/lib/formatter/helpers/report_generator.js +310 -247
  101. package/lib/formatter/helpers/report_generator.js.map +1 -1
  102. package/lib/formatter/helpers/step_argument_formatter.d.ts +2 -2
  103. package/lib/formatter/helpers/step_argument_formatter.js +47 -47
  104. package/lib/formatter/helpers/summary_helpers.d.ts +9 -9
  105. package/lib/formatter/helpers/summary_helpers.js +95 -95
  106. package/lib/formatter/helpers/test_case_attempt_formatter.d.ts +12 -12
  107. package/lib/formatter/helpers/test_case_attempt_formatter.js +113 -113
  108. package/lib/formatter/helpers/test_case_attempt_parser.d.ts +32 -32
  109. package/lib/formatter/helpers/test_case_attempt_parser.js +134 -134
  110. package/lib/formatter/helpers/upload_serivce.d.ts +9 -9
  111. package/lib/formatter/helpers/upload_serivce.js +46 -46
  112. package/lib/formatter/helpers/uploader.d.ts +11 -11
  113. package/lib/formatter/helpers/uploader.js +56 -56
  114. package/lib/formatter/helpers/usage_helpers/index.d.ts +23 -23
  115. package/lib/formatter/helpers/usage_helpers/index.js +110 -110
  116. package/lib/formatter/html_formatter.d.ts +7 -7
  117. package/lib/formatter/html_formatter.js +29 -29
  118. package/lib/formatter/index.d.ts +53 -53
  119. package/lib/formatter/index.js +20 -20
  120. package/lib/formatter/json_formatter.d.ts +78 -78
  121. package/lib/formatter/json_formatter.js +229 -229
  122. package/lib/formatter/junit_formatter.d.ts +17 -17
  123. package/lib/formatter/junit_formatter.js +180 -180
  124. package/lib/formatter/message_formatter.d.ts +5 -5
  125. package/lib/formatter/message_formatter.js +14 -14
  126. package/lib/formatter/progress_bar_formatter.d.ts +18 -18
  127. package/lib/formatter/progress_bar_formatter.js +98 -98
  128. package/lib/formatter/progress_formatter.d.ts +9 -9
  129. package/lib/formatter/progress_formatter.js +58 -58
  130. package/lib/formatter/rerun_formatter.d.ts +13 -13
  131. package/lib/formatter/rerun_formatter.js +79 -79
  132. package/lib/formatter/snippets_formatter.d.ts +6 -6
  133. package/lib/formatter/snippets_formatter.js +60 -60
  134. package/lib/formatter/step_definition_snippet_builder/index.d.ts +20 -20
  135. package/lib/formatter/step_definition_snippet_builder/index.js +45 -45
  136. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.d.ts +7 -7
  137. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js +45 -45
  138. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.d.ts +16 -16
  139. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.js +10 -10
  140. package/lib/formatter/summary_formatter.d.ts +14 -14
  141. package/lib/formatter/summary_formatter.js +67 -67
  142. package/lib/formatter/usage_formatter.d.ts +6 -6
  143. package/lib/formatter/usage_formatter.js +97 -97
  144. package/lib/formatter/usage_json_formatter.d.ts +7 -7
  145. package/lib/formatter/usage_json_formatter.js +33 -33
  146. package/lib/index.d.ts +58 -58
  147. package/lib/index.js +108 -108
  148. package/lib/logger.d.ts +5 -5
  149. package/lib/logger.js +2 -2
  150. package/lib/models/data_table.d.ts +10 -10
  151. package/lib/models/data_table.js +45 -45
  152. package/lib/models/definition.d.ts +55 -55
  153. package/lib/models/definition.js +21 -21
  154. package/lib/models/gherkin_step_keyword.d.ts +1 -1
  155. package/lib/models/gherkin_step_keyword.js +2 -2
  156. package/lib/models/pickle_order.d.ts +1 -1
  157. package/lib/models/pickle_order.js +2 -2
  158. package/lib/models/step_definition.d.ts +11 -11
  159. package/lib/models/step_definition.js +36 -36
  160. package/lib/models/test_case_hook_definition.d.ts +10 -10
  161. package/lib/models/test_case_hook_definition.js +26 -26
  162. package/lib/models/test_run_hook_definition.d.ts +3 -3
  163. package/lib/models/test_run_hook_definition.js +9 -9
  164. package/lib/models/test_step_hook_definition.d.ts +9 -9
  165. package/lib/models/test_step_hook_definition.js +25 -25
  166. package/lib/pickle_filter.d.ts +42 -42
  167. package/lib/pickle_filter.js +98 -98
  168. package/lib/plugin/index.d.ts +2 -2
  169. package/lib/plugin/index.js +18 -18
  170. package/lib/plugin/plugin_manager.d.ts +13 -13
  171. package/lib/plugin/plugin_manager.js +35 -35
  172. package/lib/plugin/types.d.ts +14 -14
  173. package/lib/plugin/types.js +2 -2
  174. package/lib/publish/http_stream.d.ts +30 -30
  175. package/lib/publish/http_stream.js +111 -111
  176. package/lib/publish/index.d.ts +2 -2
  177. package/lib/publish/index.js +4 -4
  178. package/lib/publish/publish_plugin.d.ts +2 -2
  179. package/lib/publish/publish_plugin.js +47 -47
  180. package/lib/runtime/assemble_test_cases.d.ts +13 -13
  181. package/lib/runtime/assemble_test_cases.js +87 -87
  182. package/lib/runtime/attachment_manager/index.d.ts +33 -33
  183. package/lib/runtime/attachment_manager/index.js +118 -118
  184. package/lib/runtime/format_error.d.ts +2 -2
  185. package/lib/runtime/format_error.js +35 -35
  186. package/lib/runtime/helpers.d.ts +6 -6
  187. package/lib/runtime/helpers.js +100 -100
  188. package/lib/runtime/index.d.ts +40 -40
  189. package/lib/runtime/index.js +75 -75
  190. package/lib/runtime/parallel/command_types.d.ts +32 -32
  191. package/lib/runtime/parallel/command_types.js +2 -2
  192. package/lib/runtime/parallel/coordinator.d.ts +72 -72
  193. package/lib/runtime/parallel/coordinator.js +221 -221
  194. package/lib/runtime/parallel/run_worker.d.ts +1 -1
  195. package/lib/runtime/parallel/run_worker.js +28 -28
  196. package/lib/runtime/parallel/worker.d.ts +26 -26
  197. package/lib/runtime/parallel/worker.js +86 -86
  198. package/lib/runtime/run_test_run_hooks.d.ts +3 -3
  199. package/lib/runtime/run_test_run_hooks.js +27 -27
  200. package/lib/runtime/step_runner.d.ts +16 -16
  201. package/lib/runtime/step_runner.js +87 -87
  202. package/lib/runtime/stopwatch.d.ts +12 -12
  203. package/lib/runtime/stopwatch.js +33 -33
  204. package/lib/runtime/test_case_runner.d.ts +54 -54
  205. package/lib/runtime/test_case_runner.js +267 -267
  206. package/lib/step_arguments.d.ts +6 -6
  207. package/lib/step_arguments.js +18 -18
  208. package/lib/support_code_library_builder/build_parameter_type.d.ts +3 -3
  209. package/lib/support_code_library_builder/build_parameter_type.js +12 -12
  210. package/lib/support_code_library_builder/get_definition_line_and_uri.d.ts +3 -3
  211. package/lib/support_code_library_builder/get_definition_line_and_uri.js +28 -28
  212. package/lib/support_code_library_builder/index.d.ts +74 -74
  213. package/lib/support_code_library_builder/index.js +296 -296
  214. package/lib/support_code_library_builder/parallel_can_assign_helpers.d.ts +2 -2
  215. package/lib/support_code_library_builder/parallel_can_assign_helpers.js +15 -15
  216. package/lib/support_code_library_builder/sourced_parameter_type_registry.d.ts +7 -7
  217. package/lib/support_code_library_builder/sourced_parameter_type_registry.js +18 -18
  218. package/lib/support_code_library_builder/types.d.ts +88 -88
  219. package/lib/support_code_library_builder/types.js +2 -2
  220. package/lib/support_code_library_builder/validate_arguments.d.ts +12 -12
  221. package/lib/support_code_library_builder/validate_arguments.js +72 -72
  222. package/lib/support_code_library_builder/world.d.ts +18 -18
  223. package/lib/support_code_library_builder/world.js +10 -10
  224. package/lib/time.d.ts +18 -18
  225. package/lib/time.js +60 -60
  226. package/lib/try_require.d.ts +7 -7
  227. package/lib/try_require.js +22 -22
  228. package/lib/types/index.d.ts +4 -4
  229. package/lib/types/index.js +2 -2
  230. package/lib/uncaught_exception_manager.d.ts +7 -7
  231. package/lib/uncaught_exception_manager.js +11 -11
  232. package/lib/user_code_runner.d.ts +14 -14
  233. package/lib/user_code_runner.js +81 -81
  234. package/lib/value_checker.d.ts +3 -3
  235. package/lib/value_checker.js +18 -18
  236. package/lib/version.d.ts +1 -1
  237. package/lib/version.js +5 -5
  238. package/lib/version.js.map +1 -1
  239. package/package.json +1 -1
@@ -1,268 +1,268 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- const helpers_1 = require("./helpers");
30
- const attachment_manager_1 = __importDefault(require("./attachment_manager"));
31
- const step_runner_1 = __importDefault(require("./step_runner"));
32
- const messages = __importStar(require("@cucumber/messages"));
33
- const messages_1 = require("@cucumber/messages");
34
- const value_checker_1 = require("../value_checker");
35
- class TestCaseRunner {
36
- constructor({ eventBroadcaster, stopwatch, gherkinDocument, newId, pickle, testCase, retries = 0, skip, filterStackTraces, supportCodeLibrary, worldParameters, }) {
37
- this.attachmentManager = new attachment_manager_1.default(({ data, media, fileName }) => {
38
- if ((0, value_checker_1.doesNotHaveValue)(this.currentTestStepId)) {
39
- throw new Error('Cannot attach when a step/hook is not running. Ensure your step/hook waits for the attach to finish.');
40
- }
41
- const attachment = {
42
- attachment: {
43
- body: data,
44
- contentEncoding: media.encoding,
45
- mediaType: media.contentType,
46
- fileName,
47
- testCaseStartedId: this.currentTestCaseStartedId,
48
- testStepId: this.currentTestStepId,
49
- },
50
- };
51
- this.eventBroadcaster.emit('envelope', attachment);
52
- });
53
- this.eventBroadcaster = eventBroadcaster;
54
- this.stopwatch = stopwatch;
55
- this.gherkinDocument = gherkinDocument;
56
- this.maxAttempts = 1 + (skip ? 0 : retries);
57
- this.newId = newId;
58
- this.pickle = pickle;
59
- this.testCase = testCase;
60
- this.skip = skip;
61
- this.filterStackTraces = filterStackTraces;
62
- this.supportCodeLibrary = supportCodeLibrary;
63
- this.worldParameters = worldParameters;
64
- this.resetTestProgressData();
65
- }
66
- resetTestProgressData() {
67
- this.world = new this.supportCodeLibrary.World({
68
- attach: this.attachmentManager.create.bind(this.attachmentManager),
69
- log: this.attachmentManager.log.bind(this.attachmentManager),
70
- parameters: this.worldParameters,
71
- });
72
- this.testStepResults = [];
73
- }
74
- getBeforeStepHookDefinitions() {
75
- return this.supportCodeLibrary.beforeTestStepHookDefinitions.filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle));
76
- }
77
- getAfterStepHookDefinitions() {
78
- return this.supportCodeLibrary.afterTestStepHookDefinitions
79
- .slice(0)
80
- .reverse()
81
- .filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle));
82
- }
83
- getWorstStepResult() {
84
- if (this.testStepResults.length === 0) {
85
- return {
86
- status: this.skip
87
- ? messages.TestStepResultStatus.SKIPPED
88
- : messages.TestStepResultStatus.PASSED,
89
- duration: messages.TimeConversion.millisecondsToDuration(0),
90
- };
91
- }
92
- return (0, messages_1.getWorstTestStepResult)(this.testStepResults);
93
- }
94
- async invokeStep(step, stepDefinition, hookParameter) {
95
- return await step_runner_1.default.run({
96
- defaultTimeout: this.supportCodeLibrary.defaultTimeout,
97
- filterStackTraces: this.filterStackTraces,
98
- hookParameter,
99
- step,
100
- stepDefinition,
101
- world: this.world,
102
- });
103
- }
104
- isSkippingSteps() {
105
- return (this.getWorstStepResult().status !== messages.TestStepResultStatus.PASSED);
106
- }
107
- shouldSkipHook(isBeforeHook) {
108
- return this.skip || (this.isSkippingSteps() && isBeforeHook);
109
- }
110
- async aroundTestStep(testStepId, runStepFn) {
111
- const testStepStarted = {
112
- testStepStarted: {
113
- testCaseStartedId: this.currentTestCaseStartedId,
114
- testStepId,
115
- timestamp: this.stopwatch.timestamp(),
116
- },
117
- };
118
- this.eventBroadcaster.emit('envelope', testStepStarted);
119
- this.currentTestStepId = testStepId;
120
- const testStepResult = await runStepFn();
121
- this.currentTestStepId = null;
122
- this.testStepResults.push(testStepResult);
123
- const testStepFinished = {
124
- testStepFinished: {
125
- testCaseStartedId: this.currentTestCaseStartedId,
126
- testStepId,
127
- testStepResult,
128
- timestamp: this.stopwatch.timestamp(),
129
- },
130
- };
131
- this.eventBroadcaster.emit('envelope', testStepFinished);
132
- }
133
- async run() {
134
- for (let attempt = 0; attempt < this.maxAttempts; attempt++) {
135
- const moreAttemptsRemaining = attempt + 1 < this.maxAttempts;
136
- const willBeRetried = await this.runAttempt(attempt, moreAttemptsRemaining);
137
- if (!willBeRetried) {
138
- break;
139
- }
140
- this.resetTestProgressData();
141
- }
142
- return this.getWorstStepResult().status;
143
- }
144
- async runAttempt(attempt, moreAttemptsRemaining) {
145
- this.currentTestCaseStartedId = this.newId();
146
- const testCaseStarted = {
147
- testCaseStarted: {
148
- attempt,
149
- testCaseId: this.testCase.id,
150
- id: this.currentTestCaseStartedId,
151
- timestamp: this.stopwatch.timestamp(),
152
- },
153
- };
154
- this.eventBroadcaster.emit('envelope', testCaseStarted);
155
- // used to determine whether a hook is a Before or After
156
- let didWeRunStepsYet = false;
157
- for (const testStep of this.testCase.testSteps) {
158
- await this.aroundTestStep(testStep.id, async () => {
159
- if ((0, value_checker_1.doesHaveValue)(testStep.hookId)) {
160
- const hookParameter = {
161
- gherkinDocument: this.gherkinDocument,
162
- pickle: this.pickle,
163
- testCaseStartedId: this.currentTestCaseStartedId,
164
- };
165
- if (didWeRunStepsYet) {
166
- hookParameter.result = this.getWorstStepResult();
167
- hookParameter.willBeRetried =
168
- this.getWorstStepResult().status ===
169
- messages.TestStepResultStatus.FAILED && moreAttemptsRemaining;
170
- }
171
- return await this.runHook(findHookDefinition(testStep.hookId, this.supportCodeLibrary), hookParameter, !didWeRunStepsYet);
172
- }
173
- else {
174
- const pickleStep = this.pickle.steps.find((pickleStep) => pickleStep.id === testStep.pickleStepId);
175
- const testStepResult = await this.runStep(pickleStep, testStep);
176
- didWeRunStepsYet = true;
177
- return testStepResult;
178
- }
179
- });
180
- }
181
- const willBeRetried = this.getWorstStepResult().status ===
182
- messages.TestStepResultStatus.FAILED && moreAttemptsRemaining;
183
- const testCaseFinished = {
184
- testCaseFinished: {
185
- testCaseStartedId: this.currentTestCaseStartedId,
186
- timestamp: this.stopwatch.timestamp(),
187
- willBeRetried,
188
- },
189
- };
190
- this.eventBroadcaster.emit('envelope', testCaseFinished);
191
- return willBeRetried;
192
- }
193
- async runHook(hookDefinition, hookParameter, isBeforeHook) {
194
- if (this.shouldSkipHook(isBeforeHook)) {
195
- return {
196
- status: messages.TestStepResultStatus.SKIPPED,
197
- duration: messages.TimeConversion.millisecondsToDuration(0),
198
- };
199
- }
200
- return await this.invokeStep(null, hookDefinition, hookParameter);
201
- }
202
- async runStepHooks(stepHooks, pickleStep, stepResult) {
203
- const stepHooksResult = [];
204
- const hookParameter = {
205
- gherkinDocument: this.gherkinDocument,
206
- pickle: this.pickle,
207
- pickleStep,
208
- testCaseStartedId: this.currentTestCaseStartedId,
209
- testStepId: this.currentTestStepId,
210
- result: stepResult,
211
- };
212
- for (const stepHookDefinition of stepHooks) {
213
- stepHooksResult.push(await this.invokeStep(null, stepHookDefinition, hookParameter));
214
- }
215
- return stepHooksResult;
216
- }
217
- async runStep(pickleStep, testStep) {
218
- const stepDefinitions = testStep.stepDefinitionIds.map((stepDefinitionId) => {
219
- return findStepDefinition(stepDefinitionId, this.supportCodeLibrary);
220
- });
221
- if (stepDefinitions.length === 0) {
222
- return {
223
- status: messages.TestStepResultStatus.UNDEFINED,
224
- duration: messages.TimeConversion.millisecondsToDuration(0),
225
- };
226
- }
227
- else if (stepDefinitions.length > 1) {
228
- return {
229
- message: (0, helpers_1.getAmbiguousStepException)(stepDefinitions),
230
- status: messages.TestStepResultStatus.AMBIGUOUS,
231
- duration: messages.TimeConversion.millisecondsToDuration(0),
232
- };
233
- }
234
- else if (this.isSkippingSteps()) {
235
- return {
236
- status: messages.TestStepResultStatus.SKIPPED,
237
- duration: messages.TimeConversion.millisecondsToDuration(0),
238
- };
239
- }
240
- let stepResult;
241
- let stepResults = await this.runStepHooks(this.getBeforeStepHookDefinitions(), pickleStep);
242
- if ((0, messages_1.getWorstTestStepResult)(stepResults).status !==
243
- messages.TestStepResultStatus.FAILED) {
244
- stepResult = await this.invokeStep(pickleStep, stepDefinitions[0]);
245
- stepResults.push(stepResult);
246
- }
247
- const afterStepHookResults = await this.runStepHooks(this.getAfterStepHookDefinitions(), pickleStep, stepResult);
248
- stepResults = stepResults.concat(afterStepHookResults);
249
- const finalStepResult = (0, messages_1.getWorstTestStepResult)(stepResults);
250
- let finalDuration = messages.TimeConversion.millisecondsToDuration(0);
251
- for (const result of stepResults) {
252
- finalDuration = messages.TimeConversion.addDurations(finalDuration, result.duration);
253
- }
254
- finalStepResult.duration = finalDuration;
255
- return finalStepResult;
256
- }
257
- }
258
- exports.default = TestCaseRunner;
259
- function findHookDefinition(id, supportCodeLibrary) {
260
- return [
261
- ...supportCodeLibrary.beforeTestCaseHookDefinitions,
262
- ...supportCodeLibrary.afterTestCaseHookDefinitions,
263
- ].find((definition) => definition.id === id);
264
- }
265
- function findStepDefinition(id, supportCodeLibrary) {
266
- return supportCodeLibrary.stepDefinitions.find((definition) => definition.id === id);
267
- }
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const helpers_1 = require("./helpers");
30
+ const attachment_manager_1 = __importDefault(require("./attachment_manager"));
31
+ const step_runner_1 = __importDefault(require("./step_runner"));
32
+ const messages = __importStar(require("@cucumber/messages"));
33
+ const messages_1 = require("@cucumber/messages");
34
+ const value_checker_1 = require("../value_checker");
35
+ class TestCaseRunner {
36
+ constructor({ eventBroadcaster, stopwatch, gherkinDocument, newId, pickle, testCase, retries = 0, skip, filterStackTraces, supportCodeLibrary, worldParameters, }) {
37
+ this.attachmentManager = new attachment_manager_1.default(({ data, media, fileName }) => {
38
+ if ((0, value_checker_1.doesNotHaveValue)(this.currentTestStepId)) {
39
+ throw new Error('Cannot attach when a step/hook is not running. Ensure your step/hook waits for the attach to finish.');
40
+ }
41
+ const attachment = {
42
+ attachment: {
43
+ body: data,
44
+ contentEncoding: media.encoding,
45
+ mediaType: media.contentType,
46
+ fileName,
47
+ testCaseStartedId: this.currentTestCaseStartedId,
48
+ testStepId: this.currentTestStepId,
49
+ },
50
+ };
51
+ this.eventBroadcaster.emit('envelope', attachment);
52
+ });
53
+ this.eventBroadcaster = eventBroadcaster;
54
+ this.stopwatch = stopwatch;
55
+ this.gherkinDocument = gherkinDocument;
56
+ this.maxAttempts = 1 + (skip ? 0 : retries);
57
+ this.newId = newId;
58
+ this.pickle = pickle;
59
+ this.testCase = testCase;
60
+ this.skip = skip;
61
+ this.filterStackTraces = filterStackTraces;
62
+ this.supportCodeLibrary = supportCodeLibrary;
63
+ this.worldParameters = worldParameters;
64
+ this.resetTestProgressData();
65
+ }
66
+ resetTestProgressData() {
67
+ this.world = new this.supportCodeLibrary.World({
68
+ attach: this.attachmentManager.create.bind(this.attachmentManager),
69
+ log: this.attachmentManager.log.bind(this.attachmentManager),
70
+ parameters: this.worldParameters,
71
+ });
72
+ this.testStepResults = [];
73
+ }
74
+ getBeforeStepHookDefinitions() {
75
+ return this.supportCodeLibrary.beforeTestStepHookDefinitions.filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle));
76
+ }
77
+ getAfterStepHookDefinitions() {
78
+ return this.supportCodeLibrary.afterTestStepHookDefinitions
79
+ .slice(0)
80
+ .reverse()
81
+ .filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle));
82
+ }
83
+ getWorstStepResult() {
84
+ if (this.testStepResults.length === 0) {
85
+ return {
86
+ status: this.skip
87
+ ? messages.TestStepResultStatus.SKIPPED
88
+ : messages.TestStepResultStatus.PASSED,
89
+ duration: messages.TimeConversion.millisecondsToDuration(0),
90
+ };
91
+ }
92
+ return (0, messages_1.getWorstTestStepResult)(this.testStepResults);
93
+ }
94
+ async invokeStep(step, stepDefinition, hookParameter) {
95
+ return await step_runner_1.default.run({
96
+ defaultTimeout: this.supportCodeLibrary.defaultTimeout,
97
+ filterStackTraces: this.filterStackTraces,
98
+ hookParameter,
99
+ step,
100
+ stepDefinition,
101
+ world: this.world,
102
+ });
103
+ }
104
+ isSkippingSteps() {
105
+ return (this.getWorstStepResult().status !== messages.TestStepResultStatus.PASSED);
106
+ }
107
+ shouldSkipHook(isBeforeHook) {
108
+ return this.skip || (this.isSkippingSteps() && isBeforeHook);
109
+ }
110
+ async aroundTestStep(testStepId, runStepFn) {
111
+ const testStepStarted = {
112
+ testStepStarted: {
113
+ testCaseStartedId: this.currentTestCaseStartedId,
114
+ testStepId,
115
+ timestamp: this.stopwatch.timestamp(),
116
+ },
117
+ };
118
+ this.eventBroadcaster.emit('envelope', testStepStarted);
119
+ this.currentTestStepId = testStepId;
120
+ const testStepResult = await runStepFn();
121
+ this.currentTestStepId = null;
122
+ this.testStepResults.push(testStepResult);
123
+ const testStepFinished = {
124
+ testStepFinished: {
125
+ testCaseStartedId: this.currentTestCaseStartedId,
126
+ testStepId,
127
+ testStepResult,
128
+ timestamp: this.stopwatch.timestamp(),
129
+ },
130
+ };
131
+ this.eventBroadcaster.emit('envelope', testStepFinished);
132
+ }
133
+ async run() {
134
+ for (let attempt = 0; attempt < this.maxAttempts; attempt++) {
135
+ const moreAttemptsRemaining = attempt + 1 < this.maxAttempts;
136
+ const willBeRetried = await this.runAttempt(attempt, moreAttemptsRemaining);
137
+ if (!willBeRetried) {
138
+ break;
139
+ }
140
+ this.resetTestProgressData();
141
+ }
142
+ return this.getWorstStepResult().status;
143
+ }
144
+ async runAttempt(attempt, moreAttemptsRemaining) {
145
+ this.currentTestCaseStartedId = this.newId();
146
+ const testCaseStarted = {
147
+ testCaseStarted: {
148
+ attempt,
149
+ testCaseId: this.testCase.id,
150
+ id: this.currentTestCaseStartedId,
151
+ timestamp: this.stopwatch.timestamp(),
152
+ },
153
+ };
154
+ this.eventBroadcaster.emit('envelope', testCaseStarted);
155
+ // used to determine whether a hook is a Before or After
156
+ let didWeRunStepsYet = false;
157
+ for (const testStep of this.testCase.testSteps) {
158
+ await this.aroundTestStep(testStep.id, async () => {
159
+ if ((0, value_checker_1.doesHaveValue)(testStep.hookId)) {
160
+ const hookParameter = {
161
+ gherkinDocument: this.gherkinDocument,
162
+ pickle: this.pickle,
163
+ testCaseStartedId: this.currentTestCaseStartedId,
164
+ };
165
+ if (didWeRunStepsYet) {
166
+ hookParameter.result = this.getWorstStepResult();
167
+ hookParameter.willBeRetried =
168
+ this.getWorstStepResult().status ===
169
+ messages.TestStepResultStatus.FAILED && moreAttemptsRemaining;
170
+ }
171
+ return await this.runHook(findHookDefinition(testStep.hookId, this.supportCodeLibrary), hookParameter, !didWeRunStepsYet);
172
+ }
173
+ else {
174
+ const pickleStep = this.pickle.steps.find((pickleStep) => pickleStep.id === testStep.pickleStepId);
175
+ const testStepResult = await this.runStep(pickleStep, testStep);
176
+ didWeRunStepsYet = true;
177
+ return testStepResult;
178
+ }
179
+ });
180
+ }
181
+ const willBeRetried = this.getWorstStepResult().status ===
182
+ messages.TestStepResultStatus.FAILED && moreAttemptsRemaining;
183
+ const testCaseFinished = {
184
+ testCaseFinished: {
185
+ testCaseStartedId: this.currentTestCaseStartedId,
186
+ timestamp: this.stopwatch.timestamp(),
187
+ willBeRetried,
188
+ },
189
+ };
190
+ this.eventBroadcaster.emit('envelope', testCaseFinished);
191
+ return willBeRetried;
192
+ }
193
+ async runHook(hookDefinition, hookParameter, isBeforeHook) {
194
+ if (this.shouldSkipHook(isBeforeHook)) {
195
+ return {
196
+ status: messages.TestStepResultStatus.SKIPPED,
197
+ duration: messages.TimeConversion.millisecondsToDuration(0),
198
+ };
199
+ }
200
+ return await this.invokeStep(null, hookDefinition, hookParameter);
201
+ }
202
+ async runStepHooks(stepHooks, pickleStep, stepResult) {
203
+ const stepHooksResult = [];
204
+ const hookParameter = {
205
+ gherkinDocument: this.gherkinDocument,
206
+ pickle: this.pickle,
207
+ pickleStep,
208
+ testCaseStartedId: this.currentTestCaseStartedId,
209
+ testStepId: this.currentTestStepId,
210
+ result: stepResult,
211
+ };
212
+ for (const stepHookDefinition of stepHooks) {
213
+ stepHooksResult.push(await this.invokeStep(null, stepHookDefinition, hookParameter));
214
+ }
215
+ return stepHooksResult;
216
+ }
217
+ async runStep(pickleStep, testStep) {
218
+ const stepDefinitions = testStep.stepDefinitionIds.map((stepDefinitionId) => {
219
+ return findStepDefinition(stepDefinitionId, this.supportCodeLibrary);
220
+ });
221
+ if (stepDefinitions.length === 0) {
222
+ return {
223
+ status: messages.TestStepResultStatus.UNDEFINED,
224
+ duration: messages.TimeConversion.millisecondsToDuration(0),
225
+ };
226
+ }
227
+ else if (stepDefinitions.length > 1) {
228
+ return {
229
+ message: (0, helpers_1.getAmbiguousStepException)(stepDefinitions),
230
+ status: messages.TestStepResultStatus.AMBIGUOUS,
231
+ duration: messages.TimeConversion.millisecondsToDuration(0),
232
+ };
233
+ }
234
+ else if (this.isSkippingSteps()) {
235
+ return {
236
+ status: messages.TestStepResultStatus.SKIPPED,
237
+ duration: messages.TimeConversion.millisecondsToDuration(0),
238
+ };
239
+ }
240
+ let stepResult;
241
+ let stepResults = await this.runStepHooks(this.getBeforeStepHookDefinitions(), pickleStep);
242
+ if ((0, messages_1.getWorstTestStepResult)(stepResults).status !==
243
+ messages.TestStepResultStatus.FAILED) {
244
+ stepResult = await this.invokeStep(pickleStep, stepDefinitions[0]);
245
+ stepResults.push(stepResult);
246
+ }
247
+ const afterStepHookResults = await this.runStepHooks(this.getAfterStepHookDefinitions(), pickleStep, stepResult);
248
+ stepResults = stepResults.concat(afterStepHookResults);
249
+ const finalStepResult = (0, messages_1.getWorstTestStepResult)(stepResults);
250
+ let finalDuration = messages.TimeConversion.millisecondsToDuration(0);
251
+ for (const result of stepResults) {
252
+ finalDuration = messages.TimeConversion.addDurations(finalDuration, result.duration);
253
+ }
254
+ finalStepResult.duration = finalDuration;
255
+ return finalStepResult;
256
+ }
257
+ }
258
+ exports.default = TestCaseRunner;
259
+ function findHookDefinition(id, supportCodeLibrary) {
260
+ return [
261
+ ...supportCodeLibrary.beforeTestCaseHookDefinitions,
262
+ ...supportCodeLibrary.afterTestCaseHookDefinitions,
263
+ ].find((definition) => definition.id === id);
264
+ }
265
+ function findStepDefinition(id, supportCodeLibrary) {
266
+ return supportCodeLibrary.stepDefinitions.find((definition) => definition.id === id);
267
+ }
268
268
  //# sourceMappingURL=test_case_runner.js.map
@@ -1,6 +1,6 @@
1
- import * as messages from '@cucumber/messages';
2
- export interface IPickleStepArgumentFunctionMap<T> {
3
- dataTable: (arg: messages.PickleTable) => T;
4
- docString: (arg: messages.PickleDocString) => T;
5
- }
6
- export declare function parseStepArgument<T>(arg: messages.PickleStepArgument, mapping: IPickleStepArgumentFunctionMap<T>): T;
1
+ import * as messages from '@cucumber/messages';
2
+ export interface IPickleStepArgumentFunctionMap<T> {
3
+ dataTable: (arg: messages.PickleTable) => T;
4
+ docString: (arg: messages.PickleDocString) => T;
5
+ }
6
+ export declare function parseStepArgument<T>(arg: messages.PickleStepArgument, mapping: IPickleStepArgumentFunctionMap<T>): T;
@@ -1,19 +1,19 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.parseStepArgument = void 0;
7
- const util_1 = __importDefault(require("util"));
8
- const value_checker_1 = require("./value_checker");
9
- function parseStepArgument(arg, mapping) {
10
- if ((0, value_checker_1.doesHaveValue)(arg.dataTable)) {
11
- return mapping.dataTable(arg.dataTable);
12
- }
13
- else if ((0, value_checker_1.doesHaveValue)(arg.docString)) {
14
- return mapping.docString(arg.docString);
15
- }
16
- throw new Error(`Unknown step argument: ${util_1.default.inspect(arg)}`);
17
- }
18
- exports.parseStepArgument = parseStepArgument;
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.parseStepArgument = void 0;
7
+ const util_1 = __importDefault(require("util"));
8
+ const value_checker_1 = require("./value_checker");
9
+ function parseStepArgument(arg, mapping) {
10
+ if ((0, value_checker_1.doesHaveValue)(arg.dataTable)) {
11
+ return mapping.dataTable(arg.dataTable);
12
+ }
13
+ else if ((0, value_checker_1.doesHaveValue)(arg.docString)) {
14
+ return mapping.docString(arg.docString);
15
+ }
16
+ throw new Error(`Unknown step argument: ${util_1.default.inspect(arg)}`);
17
+ }
18
+ exports.parseStepArgument = parseStepArgument;
19
19
  //# sourceMappingURL=step_arguments.js.map
@@ -1,3 +1,3 @@
1
- import { ParameterType } from '@cucumber/cucumber-expressions';
2
- import { IParameterTypeDefinition } from './types';
3
- export declare function buildParameterType({ name, regexp, transformer, useForSnippets, preferForRegexpMatch, }: IParameterTypeDefinition<any>): ParameterType<any>;
1
+ import { ParameterType } from '@cucumber/cucumber-expressions';
2
+ import { IParameterTypeDefinition } from './types';
3
+ export declare function buildParameterType({ name, regexp, transformer, useForSnippets, preferForRegexpMatch, }: IParameterTypeDefinition<any>): ParameterType<any>;
@@ -1,13 +1,13 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildParameterType = void 0;
4
- const cucumber_expressions_1 = require("@cucumber/cucumber-expressions");
5
- function buildParameterType({ name, regexp, transformer, useForSnippets, preferForRegexpMatch, }) {
6
- if (typeof useForSnippets !== 'boolean')
7
- useForSnippets = true;
8
- if (typeof preferForRegexpMatch !== 'boolean')
9
- preferForRegexpMatch = false;
10
- return new cucumber_expressions_1.ParameterType(name, regexp, null, transformer, useForSnippets, preferForRegexpMatch);
11
- }
12
- exports.buildParameterType = buildParameterType;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildParameterType = void 0;
4
+ const cucumber_expressions_1 = require("@cucumber/cucumber-expressions");
5
+ function buildParameterType({ name, regexp, transformer, useForSnippets, preferForRegexpMatch, }) {
6
+ if (typeof useForSnippets !== 'boolean')
7
+ useForSnippets = true;
8
+ if (typeof preferForRegexpMatch !== 'boolean')
9
+ preferForRegexpMatch = false;
10
+ return new cucumber_expressions_1.ParameterType(name, regexp, null, transformer, useForSnippets, preferForRegexpMatch);
11
+ }
12
+ exports.buildParameterType = buildParameterType;
13
13
  //# sourceMappingURL=build_parameter_type.js.map
@@ -1,3 +1,3 @@
1
- import { isFileNameInCucumber } from '../filter_stack_trace';
2
- import { ILineAndUri } from '../types';
3
- export declare function getDefinitionLineAndUri(cwd: string, isExcluded?: typeof isFileNameInCucumber): ILineAndUri;
1
+ import { isFileNameInCucumber } from '../filter_stack_trace';
2
+ import { ILineAndUri } from '../types';
3
+ export declare function getDefinitionLineAndUri(cwd: string, isExcluded?: typeof isFileNameInCucumber): ILineAndUri;