@dev-blinq/cucumber-js 1.0.10 → 1.0.12-stage

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