@dev-blinq/cucumber-js 1.0.11 → 1.0.14

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 (246) 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_analysis_formatter.d.ts +18 -0
  74. package/lib/formatter/bvt_analysis_formatter.js +207 -0
  75. package/lib/formatter/bvt_analysis_formatter.js.map +1 -0
  76. package/lib/formatter/bvt_formatter.d.ts +6 -9
  77. package/lib/formatter/bvt_formatter.js +24 -62
  78. package/lib/formatter/bvt_formatter.js.map +1 -1
  79. package/lib/formatter/feature_data_format.d.ts +14 -14
  80. package/lib/formatter/feature_data_format.js +80 -80
  81. package/lib/formatter/fixtures/typescript.d.ts +2 -2
  82. package/lib/formatter/fixtures/typescript.js +5 -5
  83. package/lib/formatter/get_color_fns.d.ts +15 -15
  84. package/lib/formatter/get_color_fns.js +55 -55
  85. package/lib/formatter/helpers/duration_helpers.d.ts +2 -2
  86. package/lib/formatter/helpers/duration_helpers.js +8 -8
  87. package/lib/formatter/helpers/event_data_collector.d.ts +30 -30
  88. package/lib/formatter/helpers/event_data_collector.js +125 -125
  89. package/lib/formatter/helpers/formatters.d.ts +6 -6
  90. package/lib/formatter/helpers/formatters.js +46 -44
  91. package/lib/formatter/helpers/formatters.js.map +1 -1
  92. package/lib/formatter/helpers/gherkin_document_parser.d.ts +5 -5
  93. package/lib/formatter/helpers/gherkin_document_parser.js +65 -65
  94. package/lib/formatter/helpers/index.d.ts +10 -10
  95. package/lib/formatter/helpers/index.js +51 -51
  96. package/lib/formatter/helpers/issue_helpers.d.ts +19 -19
  97. package/lib/formatter/helpers/issue_helpers.js +58 -58
  98. package/lib/formatter/helpers/keyword_type.d.ts +11 -11
  99. package/lib/formatter/helpers/keyword_type.js +31 -31
  100. package/lib/formatter/helpers/location_helpers.d.ts +2 -2
  101. package/lib/formatter/helpers/location_helpers.js +16 -16
  102. package/lib/formatter/helpers/pickle_parser.d.ts +17 -17
  103. package/lib/formatter/helpers/pickle_parser.js +27 -27
  104. package/lib/formatter/helpers/report_generator.d.ts +96 -91
  105. package/lib/formatter/helpers/report_generator.js +247 -247
  106. package/lib/formatter/helpers/report_generator.js.map +1 -1
  107. package/lib/formatter/helpers/step_argument_formatter.d.ts +2 -2
  108. package/lib/formatter/helpers/step_argument_formatter.js +47 -47
  109. package/lib/formatter/helpers/summary_helpers.d.ts +9 -9
  110. package/lib/formatter/helpers/summary_helpers.js +95 -95
  111. package/lib/formatter/helpers/test_case_attempt_formatter.d.ts +12 -12
  112. package/lib/formatter/helpers/test_case_attempt_formatter.js +113 -113
  113. package/lib/formatter/helpers/test_case_attempt_parser.d.ts +32 -32
  114. package/lib/formatter/helpers/test_case_attempt_parser.js +134 -134
  115. package/lib/formatter/helpers/upload_serivce.d.ts +9 -9
  116. package/lib/formatter/helpers/upload_serivce.js +46 -46
  117. package/lib/formatter/helpers/upload_serivce.js.map +1 -1
  118. package/lib/formatter/helpers/uploader.d.ts +8 -0
  119. package/lib/formatter/helpers/uploader.js +51 -0
  120. package/lib/formatter/helpers/uploader.js.map +1 -0
  121. package/lib/formatter/helpers/usage_helpers/index.d.ts +23 -23
  122. package/lib/formatter/helpers/usage_helpers/index.js +110 -110
  123. package/lib/formatter/html_formatter.d.ts +7 -7
  124. package/lib/formatter/html_formatter.js +29 -29
  125. package/lib/formatter/index.d.ts +53 -53
  126. package/lib/formatter/index.js +20 -20
  127. package/lib/formatter/json_formatter.d.ts +78 -78
  128. package/lib/formatter/json_formatter.js +229 -229
  129. package/lib/formatter/junit_formatter.d.ts +17 -17
  130. package/lib/formatter/junit_formatter.js +180 -180
  131. package/lib/formatter/message_formatter.d.ts +5 -5
  132. package/lib/formatter/message_formatter.js +14 -14
  133. package/lib/formatter/progress_bar_formatter.d.ts +18 -18
  134. package/lib/formatter/progress_bar_formatter.js +98 -98
  135. package/lib/formatter/progress_formatter.d.ts +9 -9
  136. package/lib/formatter/progress_formatter.js +58 -58
  137. package/lib/formatter/rerun_formatter.d.ts +13 -13
  138. package/lib/formatter/rerun_formatter.js +79 -79
  139. package/lib/formatter/snippets_formatter.d.ts +6 -6
  140. package/lib/formatter/snippets_formatter.js +60 -60
  141. package/lib/formatter/step_definition_snippet_builder/index.d.ts +20 -20
  142. package/lib/formatter/step_definition_snippet_builder/index.js +45 -45
  143. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.d.ts +7 -7
  144. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js +45 -45
  145. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.d.ts +16 -16
  146. package/lib/formatter/step_definition_snippet_builder/snippet_syntax.js +10 -10
  147. package/lib/formatter/summary_formatter.d.ts +14 -14
  148. package/lib/formatter/summary_formatter.js +67 -67
  149. package/lib/formatter/usage_formatter.d.ts +6 -6
  150. package/lib/formatter/usage_formatter.js +97 -97
  151. package/lib/formatter/usage_json_formatter.d.ts +7 -7
  152. package/lib/formatter/usage_json_formatter.js +33 -33
  153. package/lib/index.d.ts +58 -58
  154. package/lib/index.js +108 -108
  155. package/lib/logger.d.ts +5 -5
  156. package/lib/logger.js +2 -2
  157. package/lib/models/data_table.d.ts +10 -10
  158. package/lib/models/data_table.js +45 -45
  159. package/lib/models/definition.d.ts +55 -55
  160. package/lib/models/definition.js +21 -21
  161. package/lib/models/gherkin_step_keyword.d.ts +1 -1
  162. package/lib/models/gherkin_step_keyword.js +2 -2
  163. package/lib/models/pickle_order.d.ts +1 -1
  164. package/lib/models/pickle_order.js +2 -2
  165. package/lib/models/step_definition.d.ts +11 -11
  166. package/lib/models/step_definition.js +36 -36
  167. package/lib/models/test_case_hook_definition.d.ts +10 -10
  168. package/lib/models/test_case_hook_definition.js +26 -26
  169. package/lib/models/test_run_hook_definition.d.ts +3 -3
  170. package/lib/models/test_run_hook_definition.js +9 -9
  171. package/lib/models/test_step_hook_definition.d.ts +9 -9
  172. package/lib/models/test_step_hook_definition.js +25 -25
  173. package/lib/pickle_filter.d.ts +42 -42
  174. package/lib/pickle_filter.js +98 -98
  175. package/lib/plugin/index.d.ts +2 -2
  176. package/lib/plugin/index.js +18 -18
  177. package/lib/plugin/plugin_manager.d.ts +13 -13
  178. package/lib/plugin/plugin_manager.js +35 -35
  179. package/lib/plugin/types.d.ts +14 -14
  180. package/lib/plugin/types.js +2 -2
  181. package/lib/publish/http_stream.d.ts +30 -30
  182. package/lib/publish/http_stream.js +111 -111
  183. package/lib/publish/index.d.ts +2 -2
  184. package/lib/publish/index.js +4 -4
  185. package/lib/publish/publish_plugin.d.ts +2 -2
  186. package/lib/publish/publish_plugin.js +47 -47
  187. package/lib/runtime/assemble_test_cases.d.ts +13 -13
  188. package/lib/runtime/assemble_test_cases.js +87 -87
  189. package/lib/runtime/attachment_manager/index.d.ts +33 -33
  190. package/lib/runtime/attachment_manager/index.js +118 -118
  191. package/lib/runtime/format_error.d.ts +2 -2
  192. package/lib/runtime/format_error.js +35 -35
  193. package/lib/runtime/helpers.d.ts +6 -6
  194. package/lib/runtime/helpers.js +100 -100
  195. package/lib/runtime/index.d.ts +40 -40
  196. package/lib/runtime/index.js +75 -75
  197. package/lib/runtime/parallel/command_types.d.ts +32 -32
  198. package/lib/runtime/parallel/command_types.js +2 -2
  199. package/lib/runtime/parallel/coordinator.d.ts +72 -72
  200. package/lib/runtime/parallel/coordinator.js +221 -221
  201. package/lib/runtime/parallel/run_worker.d.ts +1 -1
  202. package/lib/runtime/parallel/run_worker.js +28 -28
  203. package/lib/runtime/parallel/worker.d.ts +26 -26
  204. package/lib/runtime/parallel/worker.js +86 -86
  205. package/lib/runtime/run_test_run_hooks.d.ts +3 -3
  206. package/lib/runtime/run_test_run_hooks.js +27 -27
  207. package/lib/runtime/step_runner.d.ts +16 -16
  208. package/lib/runtime/step_runner.js +87 -87
  209. package/lib/runtime/stopwatch.d.ts +12 -12
  210. package/lib/runtime/stopwatch.js +33 -33
  211. package/lib/runtime/test_case_runner.d.ts +54 -54
  212. package/lib/runtime/test_case_runner.js +267 -267
  213. package/lib/step_arguments.d.ts +6 -6
  214. package/lib/step_arguments.js +18 -18
  215. package/lib/support_code_library_builder/build_parameter_type.d.ts +3 -3
  216. package/lib/support_code_library_builder/build_parameter_type.js +12 -12
  217. package/lib/support_code_library_builder/get_definition_line_and_uri.d.ts +3 -3
  218. package/lib/support_code_library_builder/get_definition_line_and_uri.js +28 -28
  219. package/lib/support_code_library_builder/index.d.ts +74 -74
  220. package/lib/support_code_library_builder/index.js +296 -296
  221. package/lib/support_code_library_builder/parallel_can_assign_helpers.d.ts +2 -2
  222. package/lib/support_code_library_builder/parallel_can_assign_helpers.js +15 -15
  223. package/lib/support_code_library_builder/sourced_parameter_type_registry.d.ts +7 -7
  224. package/lib/support_code_library_builder/sourced_parameter_type_registry.js +18 -18
  225. package/lib/support_code_library_builder/types.d.ts +88 -88
  226. package/lib/support_code_library_builder/types.js +2 -2
  227. package/lib/support_code_library_builder/validate_arguments.d.ts +12 -12
  228. package/lib/support_code_library_builder/validate_arguments.js +72 -72
  229. package/lib/support_code_library_builder/world.d.ts +18 -18
  230. package/lib/support_code_library_builder/world.js +10 -10
  231. package/lib/time.d.ts +18 -18
  232. package/lib/time.js +60 -60
  233. package/lib/try_require.d.ts +7 -7
  234. package/lib/try_require.js +22 -22
  235. package/lib/types/index.d.ts +4 -4
  236. package/lib/types/index.js +2 -2
  237. package/lib/uncaught_exception_manager.d.ts +7 -7
  238. package/lib/uncaught_exception_manager.js +11 -11
  239. package/lib/user_code_runner.d.ts +14 -14
  240. package/lib/user_code_runner.js +81 -81
  241. package/lib/value_checker.d.ts +3 -3
  242. package/lib/value_checker.js +18 -18
  243. package/lib/version.d.ts +1 -1
  244. package/lib/version.js +5 -5
  245. package/lib/version.js.map +1 -1
  246. package/package.json +3 -1
@@ -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