@dev-blinq/cucumber-js 1.0.6 → 1.0.8

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 (238) 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 +64 -64
  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 +175 -175
  34. package/lib/api/types.js +2 -2
  35. package/lib/cli/helpers.d.ts +37 -37
  36. package/lib/cli/helpers.js +202 -202
  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 +58 -58
  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 +100 -100
  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 +26 -26
  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 +28 -28
  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_formatter.d.ts +5 -0
  74. package/lib/formatter/bvt_formatter.js +21 -0
  75. package/lib/formatter/bvt_formatter.js.map +1 -0
  76. package/lib/formatter/feature_data_format.d.ts +14 -14
  77. package/lib/formatter/feature_data_format.js +80 -80
  78. package/lib/formatter/feature_data_format.js.map +1 -1
  79. package/lib/formatter/fixtures/typescript.d.ts +2 -2
  80. package/lib/formatter/fixtures/typescript.js +5 -5
  81. package/lib/formatter/get_color_fns.d.ts +15 -15
  82. package/lib/formatter/get_color_fns.js +55 -55
  83. package/lib/formatter/helpers/duration_helpers.d.ts +2 -2
  84. package/lib/formatter/helpers/duration_helpers.js +8 -8
  85. package/lib/formatter/helpers/event_data_collector.d.ts +30 -30
  86. package/lib/formatter/helpers/event_data_collector.js +125 -125
  87. package/lib/formatter/helpers/formatters.d.ts +6 -6
  88. package/lib/formatter/helpers/formatters.js +44 -42
  89. package/lib/formatter/helpers/formatters.js.map +1 -1
  90. package/lib/formatter/helpers/gherkin_document_parser.d.ts +5 -5
  91. package/lib/formatter/helpers/gherkin_document_parser.js +65 -65
  92. package/lib/formatter/helpers/index.d.ts +10 -10
  93. package/lib/formatter/helpers/index.js +51 -51
  94. package/lib/formatter/helpers/issue_helpers.d.ts +19 -19
  95. package/lib/formatter/helpers/issue_helpers.js +58 -58
  96. package/lib/formatter/helpers/keyword_type.d.ts +11 -11
  97. package/lib/formatter/helpers/keyword_type.js +31 -31
  98. package/lib/formatter/helpers/location_helpers.d.ts +2 -2
  99. package/lib/formatter/helpers/location_helpers.js +16 -16
  100. package/lib/formatter/helpers/pickle_parser.d.ts +17 -17
  101. package/lib/formatter/helpers/pickle_parser.js +27 -27
  102. package/lib/formatter/helpers/report_generator.d.ts +91 -0
  103. package/lib/formatter/helpers/report_generator.js +235 -0
  104. package/lib/formatter/helpers/report_generator.js.map +1 -0
  105. package/lib/formatter/helpers/step_argument_formatter.d.ts +2 -2
  106. package/lib/formatter/helpers/step_argument_formatter.js +47 -47
  107. package/lib/formatter/helpers/summary_helpers.d.ts +9 -9
  108. package/lib/formatter/helpers/summary_helpers.js +95 -95
  109. package/lib/formatter/helpers/test_case_attempt_formatter.d.ts +12 -12
  110. package/lib/formatter/helpers/test_case_attempt_formatter.js +113 -113
  111. package/lib/formatter/helpers/test_case_attempt_parser.d.ts +32 -32
  112. package/lib/formatter/helpers/test_case_attempt_parser.js +134 -134
  113. package/lib/formatter/helpers/usage_helpers/index.d.ts +23 -23
  114. package/lib/formatter/helpers/usage_helpers/index.js +110 -110
  115. package/lib/formatter/html_formatter.d.ts +7 -7
  116. package/lib/formatter/html_formatter.js +29 -29
  117. package/lib/formatter/index.d.ts +53 -53
  118. package/lib/formatter/index.js +20 -20
  119. package/lib/formatter/json_formatter.d.ts +78 -78
  120. package/lib/formatter/json_formatter.js +229 -229
  121. package/lib/formatter/junit_formatter.d.ts +17 -17
  122. package/lib/formatter/junit_formatter.js +180 -180
  123. package/lib/formatter/message_formatter.d.ts +5 -5
  124. package/lib/formatter/message_formatter.js +14 -14
  125. package/lib/formatter/progress_bar_formatter.d.ts +18 -18
  126. package/lib/formatter/progress_bar_formatter.js +98 -98
  127. package/lib/formatter/progress_formatter.d.ts +9 -9
  128. package/lib/formatter/progress_formatter.js +58 -58
  129. package/lib/formatter/rerun_formatter.d.ts +13 -13
  130. package/lib/formatter/rerun_formatter.js +79 -79
  131. package/lib/formatter/snippets_formatter.d.ts +6 -6
  132. package/lib/formatter/snippets_formatter.js +60 -60
  133. package/lib/formatter/step_definition_snippet_builder/index.d.ts +20 -20
  134. package/lib/formatter/step_definition_snippet_builder/index.js +45 -45
  135. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.d.ts +7 -7
  136. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js +45 -45
  137. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.d.ts +16 -16
  138. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.js +10 -10
  139. package/lib/formatter/summary_formatter.d.ts +14 -14
  140. package/lib/formatter/summary_formatter.js +67 -67
  141. package/lib/formatter/usage_formatter.d.ts +6 -6
  142. package/lib/formatter/usage_formatter.js +97 -97
  143. package/lib/formatter/usage_json_formatter.d.ts +7 -7
  144. package/lib/formatter/usage_json_formatter.js +33 -33
  145. package/lib/index.d.ts +58 -58
  146. package/lib/index.js +108 -108
  147. package/lib/logger.d.ts +5 -5
  148. package/lib/logger.js +2 -2
  149. package/lib/models/data_table.d.ts +10 -10
  150. package/lib/models/data_table.js +45 -45
  151. package/lib/models/definition.d.ts +55 -55
  152. package/lib/models/definition.js +21 -21
  153. package/lib/models/gherkin_step_keyword.d.ts +1 -1
  154. package/lib/models/gherkin_step_keyword.js +2 -2
  155. package/lib/models/pickle_order.d.ts +1 -1
  156. package/lib/models/pickle_order.js +2 -2
  157. package/lib/models/step_definition.d.ts +11 -11
  158. package/lib/models/step_definition.js +36 -36
  159. package/lib/models/test_case_hook_definition.d.ts +10 -10
  160. package/lib/models/test_case_hook_definition.js +26 -26
  161. package/lib/models/test_run_hook_definition.d.ts +3 -3
  162. package/lib/models/test_run_hook_definition.js +9 -9
  163. package/lib/models/test_step_hook_definition.d.ts +9 -9
  164. package/lib/models/test_step_hook_definition.js +25 -25
  165. package/lib/pickle_filter.d.ts +42 -42
  166. package/lib/pickle_filter.js +98 -98
  167. package/lib/plugin/index.d.ts +2 -2
  168. package/lib/plugin/index.js +18 -18
  169. package/lib/plugin/plugin_manager.d.ts +13 -13
  170. package/lib/plugin/plugin_manager.js +35 -35
  171. package/lib/plugin/types.d.ts +14 -14
  172. package/lib/plugin/types.js +2 -2
  173. package/lib/publish/http_stream.d.ts +30 -30
  174. package/lib/publish/http_stream.js +111 -111
  175. package/lib/publish/index.d.ts +2 -2
  176. package/lib/publish/index.js +4 -4
  177. package/lib/publish/publish_plugin.d.ts +2 -2
  178. package/lib/publish/publish_plugin.js +47 -47
  179. package/lib/runtime/assemble_test_cases.d.ts +13 -13
  180. package/lib/runtime/assemble_test_cases.js +87 -87
  181. package/lib/runtime/attachment_manager/index.d.ts +33 -33
  182. package/lib/runtime/attachment_manager/index.js +118 -118
  183. package/lib/runtime/format_error.d.ts +2 -2
  184. package/lib/runtime/format_error.js +35 -35
  185. package/lib/runtime/helpers.d.ts +6 -6
  186. package/lib/runtime/helpers.js +100 -100
  187. package/lib/runtime/index.d.ts +40 -40
  188. package/lib/runtime/index.js +75 -75
  189. package/lib/runtime/parallel/command_types.d.ts +32 -32
  190. package/lib/runtime/parallel/command_types.js +2 -2
  191. package/lib/runtime/parallel/coordinator.d.ts +72 -72
  192. package/lib/runtime/parallel/coordinator.js +221 -221
  193. package/lib/runtime/parallel/run_worker.d.ts +1 -1
  194. package/lib/runtime/parallel/run_worker.js +28 -28
  195. package/lib/runtime/parallel/worker.d.ts +26 -26
  196. package/lib/runtime/parallel/worker.js +86 -86
  197. package/lib/runtime/run_test_run_hooks.d.ts +3 -3
  198. package/lib/runtime/run_test_run_hooks.js +27 -27
  199. package/lib/runtime/step_runner.d.ts +16 -16
  200. package/lib/runtime/step_runner.js +87 -87
  201. package/lib/runtime/stopwatch.d.ts +12 -12
  202. package/lib/runtime/stopwatch.js +33 -33
  203. package/lib/runtime/test_case_runner.d.ts +54 -54
  204. package/lib/runtime/test_case_runner.js +267 -267
  205. package/lib/step_arguments.d.ts +6 -6
  206. package/lib/step_arguments.js +18 -18
  207. package/lib/support_code_library_builder/build_parameter_type.d.ts +3 -3
  208. package/lib/support_code_library_builder/build_parameter_type.js +12 -12
  209. package/lib/support_code_library_builder/get_definition_line_and_uri.d.ts +3 -3
  210. package/lib/support_code_library_builder/get_definition_line_and_uri.js +28 -28
  211. package/lib/support_code_library_builder/index.d.ts +74 -74
  212. package/lib/support_code_library_builder/index.js +296 -296
  213. package/lib/support_code_library_builder/parallel_can_assign_helpers.d.ts +2 -2
  214. package/lib/support_code_library_builder/parallel_can_assign_helpers.js +15 -15
  215. package/lib/support_code_library_builder/sourced_parameter_type_registry.d.ts +7 -7
  216. package/lib/support_code_library_builder/sourced_parameter_type_registry.js +18 -18
  217. package/lib/support_code_library_builder/types.d.ts +88 -88
  218. package/lib/support_code_library_builder/types.js +2 -2
  219. package/lib/support_code_library_builder/validate_arguments.d.ts +12 -12
  220. package/lib/support_code_library_builder/validate_arguments.js +72 -72
  221. package/lib/support_code_library_builder/world.d.ts +18 -18
  222. package/lib/support_code_library_builder/world.js +10 -10
  223. package/lib/time.d.ts +18 -18
  224. package/lib/time.js +60 -60
  225. package/lib/try_require.d.ts +7 -7
  226. package/lib/try_require.js +22 -22
  227. package/lib/types/index.d.ts +4 -4
  228. package/lib/types/index.js +2 -2
  229. package/lib/uncaught_exception_manager.d.ts +7 -7
  230. package/lib/uncaught_exception_manager.js +11 -11
  231. package/lib/user_code_runner.d.ts +14 -14
  232. package/lib/user_code_runner.js +81 -81
  233. package/lib/value_checker.d.ts +3 -3
  234. package/lib/value_checker.js +18 -18
  235. package/lib/version.d.ts +1 -1
  236. package/lib/version.js +5 -5
  237. package/lib/version.js.map +1 -1
  238. package/package.json +2 -2
@@ -1,181 +1,181 @@
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
- const xmlbuilder_1 = __importDefault(require("xmlbuilder"));
7
- const _1 = __importDefault(require("./"));
8
- const messages_1 = require("@cucumber/messages");
9
- const value_checker_1 = require("../value_checker");
10
- const gherkin_document_parser_1 = require("./helpers/gherkin_document_parser");
11
- const pickle_parser_1 = require("./helpers/pickle_parser");
12
- const value_checker_2 = require("../value_checker");
13
- class JunitFormatter extends _1.default {
14
- constructor(options) {
15
- var _a;
16
- super(options);
17
- this.names = {};
18
- this.suiteName = (0, value_checker_2.valueOrDefault)((_a = options.parsedArgvOptions.junit) === null || _a === void 0 ? void 0 : _a.suiteName, 'cucumber-js');
19
- options.eventBroadcaster.on('envelope', (envelope) => {
20
- if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) {
21
- this.onTestRunFinished();
22
- }
23
- });
24
- }
25
- getTestCases() {
26
- return this.eventDataCollector
27
- .getTestCaseAttempts()
28
- .filter((attempt) => !attempt.willBeRetried);
29
- }
30
- getTestSteps(testCaseAttempt, gherkinStepMap, pickleStepMap) {
31
- return testCaseAttempt.testCase.testSteps.map((testStep) => {
32
- const isBeforeHook = !(0, value_checker_1.doesHaveValue)(testStep.pickleStepId);
33
- return this.getTestStep({
34
- isBeforeHook,
35
- gherkinStepMap,
36
- pickleStepMap,
37
- testStep,
38
- testStepAttachments: testCaseAttempt.stepAttachments[testStep.id],
39
- testStepResult: testCaseAttempt.stepResults[testStep.id],
40
- });
41
- });
42
- }
43
- getTestStep({ isBeforeHook, gherkinStepMap, pickleStepMap, testStep, testStepAttachments, testStepResult, }) {
44
- const data = {};
45
- if (testStep.pickleStepId) {
46
- const pickleStep = pickleStepMap[testStep.pickleStepId];
47
- data.keyword = (0, pickle_parser_1.getStepKeyword)({ pickleStep, gherkinStepMap });
48
- data.line = gherkinStepMap[pickleStep.astNodeIds[0]].location.line;
49
- data.name = pickleStep.text;
50
- }
51
- else {
52
- data.keyword = isBeforeHook ? 'Before' : 'After';
53
- data.hidden = true;
54
- }
55
- data.result = testStepResult;
56
- data.time = testStepResult.duration
57
- ? this.durationToSeconds(testStepResult.duration)
58
- : 0;
59
- data.attachments = testStepAttachments;
60
- return data;
61
- }
62
- getTestCaseResult(steps) {
63
- const { status, message, exception } = (0, messages_1.getWorstTestStepResult)(steps.map((step) => step.result));
64
- return {
65
- status,
66
- failure: message || exception
67
- ? {
68
- type: exception === null || exception === void 0 ? void 0 : exception.type,
69
- message: exception === null || exception === void 0 ? void 0 : exception.message,
70
- detail: message,
71
- }
72
- : undefined,
73
- };
74
- }
75
- durationToSeconds(duration) {
76
- const NANOS_IN_SECOND = 1000000000;
77
- return ((duration.seconds * NANOS_IN_SECOND + duration.nanos) / NANOS_IN_SECOND);
78
- }
79
- nameOrDefault(name, fallbackSuffix) {
80
- if (!name) {
81
- return `(unnamed ${fallbackSuffix})`;
82
- }
83
- return name;
84
- }
85
- getTestCaseName(feature, rule, pickle) {
86
- const featureName = this.nameOrDefault(feature.name, 'feature');
87
- const pickleName = this.nameOrDefault(pickle.name, 'scenario');
88
- const testCaseName = rule
89
- ? this.nameOrDefault(rule.name, 'rule') + ': ' + pickleName
90
- : pickleName;
91
- if (!this.names[featureName]) {
92
- this.names[featureName] = [];
93
- }
94
- let index = 0;
95
- while (this.names[featureName].includes(index > 0 ? `${testCaseName} [${index}]` : testCaseName)) {
96
- index++;
97
- }
98
- const name = index > 0 ? `${testCaseName} [${index}]` : testCaseName;
99
- this.names[featureName].push(name);
100
- return name;
101
- }
102
- formatTestSteps(steps) {
103
- return steps
104
- .filter((step) => !step.hidden)
105
- .map((step) => {
106
- const statusText = step.result.status.toLowerCase();
107
- const maxLength = 80 - statusText.length - 3;
108
- const stepText = `${step.keyword}${step.name}`
109
- .padEnd(maxLength, '.')
110
- .substring(0, maxLength);
111
- return `${stepText}...${statusText}`;
112
- })
113
- .join('\n');
114
- }
115
- onTestRunFinished() {
116
- const testCases = this.getTestCases();
117
- const tests = testCases.map((testCaseAttempt) => {
118
- const { gherkinDocument, pickle } = testCaseAttempt;
119
- const { feature } = gherkinDocument;
120
- const gherkinExampleRuleMap = (0, gherkin_document_parser_1.getGherkinExampleRuleMap)(gherkinDocument);
121
- const rule = gherkinExampleRuleMap[pickle.astNodeIds[0]];
122
- const gherkinStepMap = (0, gherkin_document_parser_1.getGherkinStepMap)(gherkinDocument);
123
- const pickleStepMap = (0, pickle_parser_1.getPickleStepMap)(pickle);
124
- const steps = this.getTestSteps(testCaseAttempt, gherkinStepMap, pickleStepMap);
125
- const stepDuration = steps.reduce((total, step) => total + (step.time || 0), 0);
126
- return {
127
- classname: this.nameOrDefault(feature.name, 'feature'),
128
- name: this.getTestCaseName(feature, rule, pickle),
129
- time: stepDuration,
130
- result: this.getTestCaseResult(steps),
131
- systemOutput: this.formatTestSteps(steps),
132
- steps,
133
- };
134
- });
135
- const passed = tests.filter((item) => item.result.status === messages_1.TestStepResultStatus.PASSED).length;
136
- const skipped = tests.filter((item) => item.result.status === messages_1.TestStepResultStatus.SKIPPED).length;
137
- const failures = tests.length - passed - skipped;
138
- const testSuite = {
139
- name: this.suiteName,
140
- tests,
141
- failures,
142
- skipped,
143
- time: tests.reduce((total, test) => total + test.time, 0),
144
- };
145
- this.log(this.buildXmlReport(testSuite));
146
- }
147
- buildXmlReport(testSuite) {
148
- const xmlReport = xmlbuilder_1.default
149
- .create('testsuite', { invalidCharReplacement: '' })
150
- .att('failures', testSuite.failures)
151
- .att('skipped', testSuite.skipped)
152
- .att('name', testSuite.name)
153
- .att('time', testSuite.time)
154
- .att('tests', testSuite.tests.length);
155
- testSuite.tests.forEach((test) => {
156
- var _a, _b, _c;
157
- const xmlTestCase = xmlReport.ele('testcase', {
158
- classname: test.classname,
159
- name: test.name,
160
- time: test.time,
161
- });
162
- if (test.result.status === messages_1.TestStepResultStatus.SKIPPED) {
163
- xmlTestCase.ele('skipped');
164
- }
165
- else if (test.result.status !== messages_1.TestStepResultStatus.PASSED) {
166
- const xmlFailure = xmlTestCase.ele('failure', {
167
- type: (_a = test.result.failure) === null || _a === void 0 ? void 0 : _a.type,
168
- message: (_b = test.result.failure) === null || _b === void 0 ? void 0 : _b.message,
169
- });
170
- if ((_c = test.result) === null || _c === void 0 ? void 0 : _c.failure) {
171
- xmlFailure.cdata(test.result.failure.detail);
172
- }
173
- }
174
- xmlTestCase.ele('system-out', {}).cdata(test.systemOutput);
175
- });
176
- return xmlReport.end({ pretty: true });
177
- }
178
- }
179
- exports.default = JunitFormatter;
180
- JunitFormatter.documentation = 'Outputs JUnit report';
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
+ const xmlbuilder_1 = __importDefault(require("xmlbuilder"));
7
+ const _1 = __importDefault(require("./"));
8
+ const messages_1 = require("@cucumber/messages");
9
+ const value_checker_1 = require("../value_checker");
10
+ const gherkin_document_parser_1 = require("./helpers/gherkin_document_parser");
11
+ const pickle_parser_1 = require("./helpers/pickle_parser");
12
+ const value_checker_2 = require("../value_checker");
13
+ class JunitFormatter extends _1.default {
14
+ constructor(options) {
15
+ var _a;
16
+ super(options);
17
+ this.names = {};
18
+ this.suiteName = (0, value_checker_2.valueOrDefault)((_a = options.parsedArgvOptions.junit) === null || _a === void 0 ? void 0 : _a.suiteName, 'cucumber-js');
19
+ options.eventBroadcaster.on('envelope', (envelope) => {
20
+ if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) {
21
+ this.onTestRunFinished();
22
+ }
23
+ });
24
+ }
25
+ getTestCases() {
26
+ return this.eventDataCollector
27
+ .getTestCaseAttempts()
28
+ .filter((attempt) => !attempt.willBeRetried);
29
+ }
30
+ getTestSteps(testCaseAttempt, gherkinStepMap, pickleStepMap) {
31
+ return testCaseAttempt.testCase.testSteps.map((testStep) => {
32
+ const isBeforeHook = !(0, value_checker_1.doesHaveValue)(testStep.pickleStepId);
33
+ return this.getTestStep({
34
+ isBeforeHook,
35
+ gherkinStepMap,
36
+ pickleStepMap,
37
+ testStep,
38
+ testStepAttachments: testCaseAttempt.stepAttachments[testStep.id],
39
+ testStepResult: testCaseAttempt.stepResults[testStep.id],
40
+ });
41
+ });
42
+ }
43
+ getTestStep({ isBeforeHook, gherkinStepMap, pickleStepMap, testStep, testStepAttachments, testStepResult, }) {
44
+ const data = {};
45
+ if (testStep.pickleStepId) {
46
+ const pickleStep = pickleStepMap[testStep.pickleStepId];
47
+ data.keyword = (0, pickle_parser_1.getStepKeyword)({ pickleStep, gherkinStepMap });
48
+ data.line = gherkinStepMap[pickleStep.astNodeIds[0]].location.line;
49
+ data.name = pickleStep.text;
50
+ }
51
+ else {
52
+ data.keyword = isBeforeHook ? 'Before' : 'After';
53
+ data.hidden = true;
54
+ }
55
+ data.result = testStepResult;
56
+ data.time = testStepResult.duration
57
+ ? this.durationToSeconds(testStepResult.duration)
58
+ : 0;
59
+ data.attachments = testStepAttachments;
60
+ return data;
61
+ }
62
+ getTestCaseResult(steps) {
63
+ const { status, message, exception } = (0, messages_1.getWorstTestStepResult)(steps.map((step) => step.result));
64
+ return {
65
+ status,
66
+ failure: message || exception
67
+ ? {
68
+ type: exception === null || exception === void 0 ? void 0 : exception.type,
69
+ message: exception === null || exception === void 0 ? void 0 : exception.message,
70
+ detail: message,
71
+ }
72
+ : undefined,
73
+ };
74
+ }
75
+ durationToSeconds(duration) {
76
+ const NANOS_IN_SECOND = 1000000000;
77
+ return ((duration.seconds * NANOS_IN_SECOND + duration.nanos) / NANOS_IN_SECOND);
78
+ }
79
+ nameOrDefault(name, fallbackSuffix) {
80
+ if (!name) {
81
+ return `(unnamed ${fallbackSuffix})`;
82
+ }
83
+ return name;
84
+ }
85
+ getTestCaseName(feature, rule, pickle) {
86
+ const featureName = this.nameOrDefault(feature.name, 'feature');
87
+ const pickleName = this.nameOrDefault(pickle.name, 'scenario');
88
+ const testCaseName = rule
89
+ ? this.nameOrDefault(rule.name, 'rule') + ': ' + pickleName
90
+ : pickleName;
91
+ if (!this.names[featureName]) {
92
+ this.names[featureName] = [];
93
+ }
94
+ let index = 0;
95
+ while (this.names[featureName].includes(index > 0 ? `${testCaseName} [${index}]` : testCaseName)) {
96
+ index++;
97
+ }
98
+ const name = index > 0 ? `${testCaseName} [${index}]` : testCaseName;
99
+ this.names[featureName].push(name);
100
+ return name;
101
+ }
102
+ formatTestSteps(steps) {
103
+ return steps
104
+ .filter((step) => !step.hidden)
105
+ .map((step) => {
106
+ const statusText = step.result.status.toLowerCase();
107
+ const maxLength = 80 - statusText.length - 3;
108
+ const stepText = `${step.keyword}${step.name}`
109
+ .padEnd(maxLength, '.')
110
+ .substring(0, maxLength);
111
+ return `${stepText}...${statusText}`;
112
+ })
113
+ .join('\n');
114
+ }
115
+ onTestRunFinished() {
116
+ const testCases = this.getTestCases();
117
+ const tests = testCases.map((testCaseAttempt) => {
118
+ const { gherkinDocument, pickle } = testCaseAttempt;
119
+ const { feature } = gherkinDocument;
120
+ const gherkinExampleRuleMap = (0, gherkin_document_parser_1.getGherkinExampleRuleMap)(gherkinDocument);
121
+ const rule = gherkinExampleRuleMap[pickle.astNodeIds[0]];
122
+ const gherkinStepMap = (0, gherkin_document_parser_1.getGherkinStepMap)(gherkinDocument);
123
+ const pickleStepMap = (0, pickle_parser_1.getPickleStepMap)(pickle);
124
+ const steps = this.getTestSteps(testCaseAttempt, gherkinStepMap, pickleStepMap);
125
+ const stepDuration = steps.reduce((total, step) => total + (step.time || 0), 0);
126
+ return {
127
+ classname: this.nameOrDefault(feature.name, 'feature'),
128
+ name: this.getTestCaseName(feature, rule, pickle),
129
+ time: stepDuration,
130
+ result: this.getTestCaseResult(steps),
131
+ systemOutput: this.formatTestSteps(steps),
132
+ steps,
133
+ };
134
+ });
135
+ const passed = tests.filter((item) => item.result.status === messages_1.TestStepResultStatus.PASSED).length;
136
+ const skipped = tests.filter((item) => item.result.status === messages_1.TestStepResultStatus.SKIPPED).length;
137
+ const failures = tests.length - passed - skipped;
138
+ const testSuite = {
139
+ name: this.suiteName,
140
+ tests,
141
+ failures,
142
+ skipped,
143
+ time: tests.reduce((total, test) => total + test.time, 0),
144
+ };
145
+ this.log(this.buildXmlReport(testSuite));
146
+ }
147
+ buildXmlReport(testSuite) {
148
+ const xmlReport = xmlbuilder_1.default
149
+ .create('testsuite', { invalidCharReplacement: '' })
150
+ .att('failures', testSuite.failures)
151
+ .att('skipped', testSuite.skipped)
152
+ .att('name', testSuite.name)
153
+ .att('time', testSuite.time)
154
+ .att('tests', testSuite.tests.length);
155
+ testSuite.tests.forEach((test) => {
156
+ var _a, _b, _c;
157
+ const xmlTestCase = xmlReport.ele('testcase', {
158
+ classname: test.classname,
159
+ name: test.name,
160
+ time: test.time,
161
+ });
162
+ if (test.result.status === messages_1.TestStepResultStatus.SKIPPED) {
163
+ xmlTestCase.ele('skipped');
164
+ }
165
+ else if (test.result.status !== messages_1.TestStepResultStatus.PASSED) {
166
+ const xmlFailure = xmlTestCase.ele('failure', {
167
+ type: (_a = test.result.failure) === null || _a === void 0 ? void 0 : _a.type,
168
+ message: (_b = test.result.failure) === null || _b === void 0 ? void 0 : _b.message,
169
+ });
170
+ if ((_c = test.result) === null || _c === void 0 ? void 0 : _c.failure) {
171
+ xmlFailure.cdata(test.result.failure.detail);
172
+ }
173
+ }
174
+ xmlTestCase.ele('system-out', {}).cdata(test.systemOutput);
175
+ });
176
+ return xmlReport.end({ pretty: true });
177
+ }
178
+ }
179
+ exports.default = JunitFormatter;
180
+ JunitFormatter.documentation = 'Outputs JUnit report';
181
181
  //# sourceMappingURL=junit_formatter.js.map
@@ -1,5 +1,5 @@
1
- import Formatter, { IFormatterOptions } from '.';
2
- export default class MessageFormatter extends Formatter {
3
- static readonly documentation: string;
4
- constructor(options: IFormatterOptions);
5
- }
1
+ import Formatter, { IFormatterOptions } from '.';
2
+ export default class MessageFormatter extends Formatter {
3
+ static readonly documentation: string;
4
+ constructor(options: IFormatterOptions);
5
+ }
@@ -1,15 +1,15 @@
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
- const _1 = __importDefault(require("."));
7
- class MessageFormatter extends _1.default {
8
- constructor(options) {
9
- super(options);
10
- options.eventBroadcaster.on('envelope', (envelope) => this.log(JSON.stringify(envelope) + '\n'));
11
- }
12
- }
13
- exports.default = MessageFormatter;
14
- MessageFormatter.documentation = 'Outputs protobuf messages';
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
+ const _1 = __importDefault(require("."));
7
+ class MessageFormatter extends _1.default {
8
+ constructor(options) {
9
+ super(options);
10
+ options.eventBroadcaster.on('envelope', (envelope) => this.log(JSON.stringify(envelope) + '\n'));
11
+ }
12
+ }
13
+ exports.default = MessageFormatter;
14
+ MessageFormatter.documentation = 'Outputs protobuf messages';
15
15
  //# sourceMappingURL=message_formatter.js.map
@@ -1,18 +1,18 @@
1
- import Formatter, { IFormatterOptions } from './';
2
- import ProgressBar from 'progress';
3
- import * as messages from '@cucumber/messages';
4
- export default class ProgressBarFormatter extends Formatter {
5
- private numberOfSteps;
6
- private testRunStarted;
7
- private issueCount;
8
- progressBar: ProgressBar;
9
- static readonly documentation: string;
10
- constructor(options: IFormatterOptions);
11
- incrementStepCount(pickleId: string): void;
12
- initializeProgressBar(): void;
13
- logProgress({ testStepId, testCaseStartedId, }: messages.TestStepFinished): void;
14
- logUndefinedParametertype(parameterType: messages.UndefinedParameterType): void;
15
- logErrorIfNeeded(testCaseFinished: messages.TestCaseFinished): void;
16
- logSummary(testRunFinished: messages.TestRunFinished): void;
17
- parseEnvelope(envelope: messages.Envelope): void;
18
- }
1
+ import Formatter, { IFormatterOptions } from './';
2
+ import ProgressBar from 'progress';
3
+ import * as messages from '@cucumber/messages';
4
+ export default class ProgressBarFormatter extends Formatter {
5
+ private numberOfSteps;
6
+ private testRunStarted;
7
+ private issueCount;
8
+ progressBar: ProgressBar;
9
+ static readonly documentation: string;
10
+ constructor(options: IFormatterOptions);
11
+ incrementStepCount(pickleId: string): void;
12
+ initializeProgressBar(): void;
13
+ logProgress({ testStepId, testCaseStartedId, }: messages.TestStepFinished): void;
14
+ logUndefinedParametertype(parameterType: messages.UndefinedParameterType): void;
15
+ logErrorIfNeeded(testCaseFinished: messages.TestCaseFinished): void;
16
+ logSummary(testRunFinished: messages.TestRunFinished): void;
17
+ parseEnvelope(envelope: messages.Envelope): void;
18
+ }
@@ -1,99 +1,99 @@
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
- const helpers_1 = require("./helpers");
7
- const _1 = __importDefault(require("./"));
8
- const progress_1 = __importDefault(require("progress"));
9
- const value_checker_1 = require("../value_checker");
10
- const issue_helpers_1 = require("./helpers/issue_helpers");
11
- const time_1 = require("../time");
12
- // Inspired by https://github.com/thekompanee/fuubar and https://github.com/martinciu/fuubar-cucumber
13
- class ProgressBarFormatter extends _1.default {
14
- constructor(options) {
15
- super(options);
16
- options.eventBroadcaster.on('envelope', this.parseEnvelope.bind(this));
17
- this.numberOfSteps = 0;
18
- this.issueCount = 0;
19
- }
20
- incrementStepCount(pickleId) {
21
- const pickle = this.eventDataCollector.getPickle(pickleId);
22
- this.numberOfSteps += pickle.steps.length;
23
- }
24
- initializeProgressBar() {
25
- if ((0, value_checker_1.doesHaveValue)(this.progressBar)) {
26
- return;
27
- }
28
- this.progressBar = new progress_1.default(':current/:total steps [:bar] ', {
29
- clear: true,
30
- incomplete: ' ',
31
- stream: this.stream,
32
- total: this.numberOfSteps,
33
- width: (0, value_checker_1.valueOrDefault)(this.stream.columns, 80),
34
- });
35
- }
36
- logProgress({ testStepId, testCaseStartedId, }) {
37
- const { testCase } = this.eventDataCollector.getTestCaseAttempt(testCaseStartedId);
38
- const testStep = testCase.testSteps.find((s) => s.id === testStepId);
39
- if ((0, value_checker_1.doesHaveValue)(testStep.pickleStepId)) {
40
- this.progressBar.tick();
41
- }
42
- }
43
- logUndefinedParametertype(parameterType) {
44
- this.log(`Undefined parameter type: ${(0, issue_helpers_1.formatUndefinedParameterType)(parameterType)}\n`);
45
- }
46
- logErrorIfNeeded(testCaseFinished) {
47
- const { worstTestStepResult } = this.eventDataCollector.getTestCaseAttempt(testCaseFinished.testCaseStartedId);
48
- if ((0, helpers_1.isIssue)(worstTestStepResult)) {
49
- this.issueCount += 1;
50
- const testCaseAttempt = this.eventDataCollector.getTestCaseAttempt(testCaseFinished.testCaseStartedId);
51
- this.progressBar.interrupt((0, helpers_1.formatIssue)({
52
- colorFns: this.colorFns,
53
- number: this.issueCount,
54
- snippetBuilder: this.snippetBuilder,
55
- supportCodeLibrary: this.supportCodeLibrary,
56
- testCaseAttempt,
57
- printAttachments: this.printAttachments,
58
- }));
59
- if (testCaseFinished.willBeRetried) {
60
- const stepsToRetry = testCaseAttempt.pickle.steps.length;
61
- this.progressBar.tick(-stepsToRetry);
62
- }
63
- }
64
- }
65
- logSummary(testRunFinished) {
66
- const testRunDuration = (0, time_1.durationBetweenTimestamps)(this.testRunStarted.timestamp, testRunFinished.timestamp);
67
- this.log((0, helpers_1.formatSummary)({
68
- colorFns: this.colorFns,
69
- testCaseAttempts: this.eventDataCollector.getTestCaseAttempts(),
70
- testRunDuration,
71
- }));
72
- }
73
- parseEnvelope(envelope) {
74
- if ((0, value_checker_1.doesHaveValue)(envelope.undefinedParameterType)) {
75
- this.logUndefinedParametertype(envelope.undefinedParameterType);
76
- }
77
- else if ((0, value_checker_1.doesHaveValue)(envelope.testCase)) {
78
- this.incrementStepCount(envelope.testCase.pickleId);
79
- }
80
- else if ((0, value_checker_1.doesHaveValue)(envelope.testStepStarted)) {
81
- this.initializeProgressBar();
82
- }
83
- else if ((0, value_checker_1.doesHaveValue)(envelope.testStepFinished)) {
84
- this.logProgress(envelope.testStepFinished);
85
- }
86
- else if ((0, value_checker_1.doesHaveValue)(envelope.testCaseFinished)) {
87
- this.logErrorIfNeeded(envelope.testCaseFinished);
88
- }
89
- else if ((0, value_checker_1.doesHaveValue)(envelope.testRunStarted)) {
90
- this.testRunStarted = envelope.testRunStarted;
91
- }
92
- else if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) {
93
- this.logSummary(envelope.testRunFinished);
94
- }
95
- }
96
- }
97
- exports.default = ProgressBarFormatter;
98
- ProgressBarFormatter.documentation = 'Similar to the Progress Formatter, but provides a real-time updating progress bar based on the total number of steps to be executed in the test run';
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
+ const helpers_1 = require("./helpers");
7
+ const _1 = __importDefault(require("./"));
8
+ const progress_1 = __importDefault(require("progress"));
9
+ const value_checker_1 = require("../value_checker");
10
+ const issue_helpers_1 = require("./helpers/issue_helpers");
11
+ const time_1 = require("../time");
12
+ // Inspired by https://github.com/thekompanee/fuubar and https://github.com/martinciu/fuubar-cucumber
13
+ class ProgressBarFormatter extends _1.default {
14
+ constructor(options) {
15
+ super(options);
16
+ options.eventBroadcaster.on('envelope', this.parseEnvelope.bind(this));
17
+ this.numberOfSteps = 0;
18
+ this.issueCount = 0;
19
+ }
20
+ incrementStepCount(pickleId) {
21
+ const pickle = this.eventDataCollector.getPickle(pickleId);
22
+ this.numberOfSteps += pickle.steps.length;
23
+ }
24
+ initializeProgressBar() {
25
+ if ((0, value_checker_1.doesHaveValue)(this.progressBar)) {
26
+ return;
27
+ }
28
+ this.progressBar = new progress_1.default(':current/:total steps [:bar] ', {
29
+ clear: true,
30
+ incomplete: ' ',
31
+ stream: this.stream,
32
+ total: this.numberOfSteps,
33
+ width: (0, value_checker_1.valueOrDefault)(this.stream.columns, 80),
34
+ });
35
+ }
36
+ logProgress({ testStepId, testCaseStartedId, }) {
37
+ const { testCase } = this.eventDataCollector.getTestCaseAttempt(testCaseStartedId);
38
+ const testStep = testCase.testSteps.find((s) => s.id === testStepId);
39
+ if ((0, value_checker_1.doesHaveValue)(testStep.pickleStepId)) {
40
+ this.progressBar.tick();
41
+ }
42
+ }
43
+ logUndefinedParametertype(parameterType) {
44
+ this.log(`Undefined parameter type: ${(0, issue_helpers_1.formatUndefinedParameterType)(parameterType)}\n`);
45
+ }
46
+ logErrorIfNeeded(testCaseFinished) {
47
+ const { worstTestStepResult } = this.eventDataCollector.getTestCaseAttempt(testCaseFinished.testCaseStartedId);
48
+ if ((0, helpers_1.isIssue)(worstTestStepResult)) {
49
+ this.issueCount += 1;
50
+ const testCaseAttempt = this.eventDataCollector.getTestCaseAttempt(testCaseFinished.testCaseStartedId);
51
+ this.progressBar.interrupt((0, helpers_1.formatIssue)({
52
+ colorFns: this.colorFns,
53
+ number: this.issueCount,
54
+ snippetBuilder: this.snippetBuilder,
55
+ supportCodeLibrary: this.supportCodeLibrary,
56
+ testCaseAttempt,
57
+ printAttachments: this.printAttachments,
58
+ }));
59
+ if (testCaseFinished.willBeRetried) {
60
+ const stepsToRetry = testCaseAttempt.pickle.steps.length;
61
+ this.progressBar.tick(-stepsToRetry);
62
+ }
63
+ }
64
+ }
65
+ logSummary(testRunFinished) {
66
+ const testRunDuration = (0, time_1.durationBetweenTimestamps)(this.testRunStarted.timestamp, testRunFinished.timestamp);
67
+ this.log((0, helpers_1.formatSummary)({
68
+ colorFns: this.colorFns,
69
+ testCaseAttempts: this.eventDataCollector.getTestCaseAttempts(),
70
+ testRunDuration,
71
+ }));
72
+ }
73
+ parseEnvelope(envelope) {
74
+ if ((0, value_checker_1.doesHaveValue)(envelope.undefinedParameterType)) {
75
+ this.logUndefinedParametertype(envelope.undefinedParameterType);
76
+ }
77
+ else if ((0, value_checker_1.doesHaveValue)(envelope.testCase)) {
78
+ this.incrementStepCount(envelope.testCase.pickleId);
79
+ }
80
+ else if ((0, value_checker_1.doesHaveValue)(envelope.testStepStarted)) {
81
+ this.initializeProgressBar();
82
+ }
83
+ else if ((0, value_checker_1.doesHaveValue)(envelope.testStepFinished)) {
84
+ this.logProgress(envelope.testStepFinished);
85
+ }
86
+ else if ((0, value_checker_1.doesHaveValue)(envelope.testCaseFinished)) {
87
+ this.logErrorIfNeeded(envelope.testCaseFinished);
88
+ }
89
+ else if ((0, value_checker_1.doesHaveValue)(envelope.testRunStarted)) {
90
+ this.testRunStarted = envelope.testRunStarted;
91
+ }
92
+ else if ((0, value_checker_1.doesHaveValue)(envelope.testRunFinished)) {
93
+ this.logSummary(envelope.testRunFinished);
94
+ }
95
+ }
96
+ }
97
+ exports.default = ProgressBarFormatter;
98
+ ProgressBarFormatter.documentation = 'Similar to the Progress Formatter, but provides a real-time updating progress bar based on the total number of steps to be executed in the test run';
99
99
  //# sourceMappingURL=progress_bar_formatter.js.map