@cucumber/cucumber 7.2.1 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/lib/cli/configuration_builder.js +3 -3
  3. package/lib/cli/configuration_builder.js.map +1 -1
  4. package/lib/cli/helpers.js +40 -18
  5. package/lib/cli/helpers.js.map +1 -1
  6. package/lib/cli/index.js +23 -15
  7. package/lib/cli/index.js.map +1 -1
  8. package/lib/cli/profile_loader.d.ts +1 -2
  9. package/lib/cli/profile_loader.js.map +1 -1
  10. package/lib/formatter/get_color_fns.d.ts +2 -2
  11. package/lib/formatter/get_color_fns.js +7 -8
  12. package/lib/formatter/get_color_fns.js.map +1 -1
  13. package/lib/formatter/helpers/event_data_collector.d.ts +14 -17
  14. package/lib/formatter/helpers/event_data_collector.js +14 -8
  15. package/lib/formatter/helpers/event_data_collector.js.map +1 -1
  16. package/lib/formatter/helpers/gherkin_document_parser.d.ts +5 -6
  17. package/lib/formatter/helpers/gherkin_document_parser.js +1 -4
  18. package/lib/formatter/helpers/gherkin_document_parser.js.map +1 -1
  19. package/lib/formatter/helpers/issue_helpers.d.ts +6 -6
  20. package/lib/formatter/helpers/issue_helpers.js +5 -6
  21. package/lib/formatter/helpers/issue_helpers.js.map +1 -1
  22. package/lib/formatter/helpers/pickle_parser.d.ts +9 -10
  23. package/lib/formatter/helpers/pickle_parser.js.map +1 -1
  24. package/lib/formatter/helpers/step_argument_formatter.d.ts +2 -2
  25. package/lib/formatter/helpers/step_argument_formatter.js.map +1 -1
  26. package/lib/formatter/helpers/summary_helpers.d.ts +2 -2
  27. package/lib/formatter/helpers/summary_helpers.js +32 -14
  28. package/lib/formatter/helpers/summary_helpers.js.map +1 -1
  29. package/lib/formatter/helpers/test_case_attempt_formatter.js +33 -14
  30. package/lib/formatter/helpers/test_case_attempt_formatter.js.map +1 -1
  31. package/lib/formatter/helpers/test_case_attempt_parser.d.ts +5 -5
  32. package/lib/formatter/helpers/test_case_attempt_parser.js +27 -9
  33. package/lib/formatter/helpers/test_case_attempt_parser.js.map +1 -1
  34. package/lib/formatter/helpers/usage_helpers/index.d.ts +3 -3
  35. package/lib/formatter/helpers/usage_helpers/index.js +30 -13
  36. package/lib/formatter/helpers/usage_helpers/index.js.map +1 -1
  37. package/lib/formatter/html_formatter.js +1 -1
  38. package/lib/formatter/html_formatter.js.map +1 -1
  39. package/lib/formatter/json_formatter.d.ts +21 -27
  40. package/lib/formatter/json_formatter.js +50 -23
  41. package/lib/formatter/json_formatter.js.map +1 -1
  42. package/lib/formatter/message_formatter.js +1 -1
  43. package/lib/formatter/message_formatter.js.map +1 -1
  44. package/lib/formatter/progress_bar_formatter.d.ts +6 -6
  45. package/lib/formatter/progress_bar_formatter.js +3 -3
  46. package/lib/formatter/progress_bar_formatter.js.map +1 -1
  47. package/lib/formatter/progress_formatter.d.ts +2 -2
  48. package/lib/formatter/progress_formatter.js +29 -10
  49. package/lib/formatter/progress_formatter.js.map +1 -1
  50. package/lib/formatter/rerun_formatter.js +22 -4
  51. package/lib/formatter/rerun_formatter.js.map +1 -1
  52. package/lib/formatter/snippets_formatter.js +21 -2
  53. package/lib/formatter/snippets_formatter.js.map +1 -1
  54. package/lib/formatter/step_definition_snippet_builder/index.d.ts +3 -3
  55. package/lib/formatter/step_definition_snippet_builder/index.js.map +1 -1
  56. package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js.map +1 -1
  57. package/lib/formatter/summary_formatter.d.ts +2 -2
  58. package/lib/formatter/summary_formatter.js.map +1 -1
  59. package/lib/formatter/usage_formatter.js +22 -3
  60. package/lib/formatter/usage_formatter.js.map +1 -1
  61. package/lib/formatter/usage_json_formatter.js.map +1 -1
  62. package/lib/index.d.ts +14 -12
  63. package/lib/index.js +3 -3
  64. package/lib/index.js.map +1 -1
  65. package/lib/models/data_table.d.ts +3 -4
  66. package/lib/models/data_table.js.map +1 -1
  67. package/lib/models/definition.d.ts +2 -2
  68. package/lib/models/definition.js.map +1 -1
  69. package/lib/models/test_case_hook_definition.d.ts +2 -2
  70. package/lib/models/test_case_hook_definition.js.map +1 -1
  71. package/lib/models/test_step_hook_definition.d.ts +2 -2
  72. package/lib/models/test_step_hook_definition.js.map +1 -1
  73. package/lib/pickle_filter.d.ts +9 -11
  74. package/lib/pickle_filter.js +4 -4
  75. package/lib/pickle_filter.js.map +1 -1
  76. package/lib/runtime/assemble_test_cases.d.ts +13 -0
  77. package/lib/runtime/assemble_test_cases.js +88 -0
  78. package/lib/runtime/assemble_test_cases.js.map +1 -0
  79. package/lib/runtime/attachment_manager/index.d.ts +2 -2
  80. package/lib/runtime/attachment_manager/index.js +23 -4
  81. package/lib/runtime/attachment_manager/index.js.map +1 -1
  82. package/lib/runtime/helpers.d.ts +2 -2
  83. package/lib/runtime/helpers.js.map +1 -1
  84. package/lib/runtime/index.d.ts +4 -3
  85. package/lib/runtime/index.js +31 -13
  86. package/lib/runtime/index.js.map +1 -1
  87. package/lib/runtime/parallel/command_types.d.ts +10 -9
  88. package/lib/runtime/parallel/command_types.js.map +1 -1
  89. package/lib/runtime/parallel/coordinator.d.ts +10 -9
  90. package/lib/runtime/parallel/coordinator.js +54 -43
  91. package/lib/runtime/parallel/coordinator.js.map +1 -1
  92. package/lib/runtime/parallel/worker.d.ts +2 -2
  93. package/lib/runtime/parallel/worker.js +8 -14
  94. package/lib/runtime/parallel/worker.js.map +1 -1
  95. package/lib/runtime/step_runner.d.ts +3 -3
  96. package/lib/runtime/step_runner.js +16 -12
  97. package/lib/runtime/step_runner.js.map +1 -1
  98. package/lib/runtime/stopwatch.d.ts +4 -4
  99. package/lib/runtime/stopwatch.js +21 -2
  100. package/lib/runtime/stopwatch.js.map +1 -1
  101. package/lib/runtime/{pickle_runner.d.ts → test_case_runner.d.ts} +16 -32
  102. package/lib/runtime/{pickle_runner.js → test_case_runner.js} +104 -147
  103. package/lib/runtime/test_case_runner.js.map +1 -0
  104. package/lib/step_arguments.d.ts +4 -4
  105. package/lib/step_arguments.js.map +1 -1
  106. package/lib/support_code_library_builder/index.d.ts +9 -7
  107. package/lib/support_code_library_builder/index.js +10 -10
  108. package/lib/support_code_library_builder/index.js.map +1 -1
  109. package/lib/support_code_library_builder/types.d.ts +20 -22
  110. package/lib/support_code_library_builder/types.js.map +1 -1
  111. package/lib/support_code_library_builder/validate_arguments.js.map +1 -1
  112. package/lib/support_code_library_builder/world.d.ts +7 -1
  113. package/lib/support_code_library_builder/world.js.map +1 -1
  114. package/lib/time.d.ts +2 -10
  115. package/lib/time.js +24 -48
  116. package/lib/time.js.map +1 -1
  117. package/package.json +33 -33
  118. package/lib/runtime/pickle_runner.js.map +0 -1
  119. package/lib/status.d.ts +0 -3
  120. package/lib/status.js +0 -5
  121. package/lib/status.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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","sourcesContent":["import _, { clone } from 'lodash'\nimport { EventDataCollector, formatLocation } from '../formatter/helpers'\nimport bluebird from 'bluebird'\nimport StackTraceFilter from '../stack_trace_filter'\nimport Status from '../status'\nimport UserCodeRunner from '../user_code_runner'\nimport VError from 'verror'\nimport { retriesForPickle } from './helpers'\nimport { IdGenerator, messages } from '@cucumber/messages'\nimport PickleRunner from './pickle_runner'\nimport { EventEmitter } from 'events'\nimport { ISupportCodeLibrary } from '../support_code_library_builder/types'\nimport TestRunHookDefinition from '../models/test_run_hook_definition'\nimport { doesHaveValue, valueOrDefault } from '../value_checker'\nimport {\n ITestRunStopwatch,\n PredictableTestRunStopwatch,\n RealTestRunStopwatch,\n} from './stopwatch'\n\nexport interface INewRuntimeOptions {\n eventBroadcaster: EventEmitter\n eventDataCollector: EventDataCollector\n newId: IdGenerator.NewId\n options: IRuntimeOptions\n pickleIds: string[]\n supportCodeLibrary: ISupportCodeLibrary\n}\n\nexport interface IRuntimeOptions {\n dryRun: boolean\n predictableIds: boolean\n failFast: boolean\n filterStacktraces: boolean\n retry: number\n retryTagFilter: string\n strict: boolean\n worldParameters: any\n}\n\nexport default class Runtime {\n private readonly eventBroadcaster: EventEmitter\n private readonly eventDataCollector: EventDataCollector\n private readonly stopwatch: ITestRunStopwatch\n private readonly newId: IdGenerator.NewId\n private readonly options: IRuntimeOptions\n private readonly pickleIds: string[]\n private readonly stackTraceFilter: StackTraceFilter\n private readonly supportCodeLibrary: ISupportCodeLibrary\n private success: boolean\n\n constructor({\n eventBroadcaster,\n eventDataCollector,\n newId,\n options,\n pickleIds,\n supportCodeLibrary,\n }: INewRuntimeOptions) {\n this.eventBroadcaster = eventBroadcaster\n this.eventDataCollector = eventDataCollector\n this.stopwatch = options.predictableIds\n ? new PredictableTestRunStopwatch()\n : new RealTestRunStopwatch()\n this.newId = newId\n this.options = options\n this.pickleIds = pickleIds\n this.stackTraceFilter = new StackTraceFilter()\n this.supportCodeLibrary = supportCodeLibrary\n this.success = true\n }\n\n async runTestRunHooks(\n definitions: TestRunHookDefinition[],\n name: string\n ): Promise<void> {\n if (this.options.dryRun) {\n return\n }\n await bluebird.each(\n definitions,\n async (hookDefinition: TestRunHookDefinition) => {\n const { error } = await UserCodeRunner.run({\n argsArray: [],\n fn: hookDefinition.code,\n thisArg: null,\n timeoutInMilliseconds: valueOrDefault(\n hookDefinition.options.timeout,\n this.supportCodeLibrary.defaultTimeout\n ),\n })\n if (doesHaveValue(error)) {\n const location = formatLocation(hookDefinition)\n throw new VError(\n error,\n `${name} hook errored, process exiting: ${location}`\n )\n }\n }\n )\n }\n\n async runPickle(pickleId: string): Promise<void> {\n const pickle = this.eventDataCollector.getPickle(pickleId)\n const retries = retriesForPickle(pickle, this.options)\n const skip = this.options.dryRun || (this.options.failFast && !this.success)\n const pickleRunner = new PickleRunner({\n eventBroadcaster: this.eventBroadcaster,\n stopwatch: this.stopwatch,\n gherkinDocument: this.eventDataCollector.getGherkinDocument(pickle.uri),\n newId: this.newId,\n pickle,\n retries,\n skip,\n supportCodeLibrary: this.supportCodeLibrary,\n worldParameters: this.options.worldParameters,\n })\n const status = await pickleRunner.run()\n if (this.shouldCauseFailure(status)) {\n this.success = false\n }\n }\n\n async start(): Promise<boolean> {\n if (this.options.filterStacktraces) {\n this.stackTraceFilter.filter()\n }\n this.eventBroadcaster.emit(\n 'envelope',\n new messages.Envelope({\n testRunStarted: {\n timestamp: this.stopwatch.timestamp(),\n },\n })\n )\n this.stopwatch.start()\n await this.runTestRunHooks(\n this.supportCodeLibrary.beforeTestRunHookDefinitions,\n 'a BeforeAll'\n )\n await bluebird.each(this.pickleIds, this.runPickle.bind(this))\n await this.runTestRunHooks(\n clone(this.supportCodeLibrary.afterTestRunHookDefinitions).reverse(),\n 'an AfterAll'\n )\n this.stopwatch.stop()\n this.eventBroadcaster.emit(\n 'envelope',\n messages.Envelope.fromObject({\n testRunFinished: {\n timestamp: this.stopwatch.timestamp(),\n },\n })\n )\n if (this.options.filterStacktraces) {\n this.stackTraceFilter.unfilter()\n }\n return this.success\n }\n\n shouldCauseFailure(\n status: messages.TestStepFinished.TestStepResult.Status\n ): boolean {\n return (\n _.includes([Status.AMBIGUOUS, Status.FAILED, Status.UNDEFINED], status) ||\n (status === Status.PENDING && this.options.strict)\n )\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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","sourcesContent":["import _, { clone } from 'lodash'\nimport { EventDataCollector, formatLocation } from '../formatter/helpers'\nimport bluebird from 'bluebird'\nimport StackTraceFilter from '../stack_trace_filter'\nimport UserCodeRunner from '../user_code_runner'\nimport VError from 'verror'\nimport { retriesForPickle } from './helpers'\nimport { IdGenerator } from '@cucumber/messages'\nimport * as messages from '@cucumber/messages'\nimport TestCaseRunner from './test_case_runner'\nimport { EventEmitter } from 'events'\nimport { ISupportCodeLibrary } from '../support_code_library_builder/types'\nimport TestRunHookDefinition from '../models/test_run_hook_definition'\nimport { doesHaveValue, valueOrDefault } from '../value_checker'\nimport {\n ITestRunStopwatch,\n PredictableTestRunStopwatch,\n RealTestRunStopwatch,\n} from './stopwatch'\nimport { assembleTestCases } from './assemble_test_cases'\n\nexport interface INewRuntimeOptions {\n eventBroadcaster: EventEmitter\n eventDataCollector: EventDataCollector\n newId: IdGenerator.NewId\n options: IRuntimeOptions\n pickleIds: string[]\n supportCodeLibrary: ISupportCodeLibrary\n}\n\nexport interface IRuntimeOptions {\n dryRun: boolean\n predictableIds: boolean\n failFast: boolean\n filterStacktraces: boolean\n retry: number\n retryTagFilter: string\n strict: boolean\n worldParameters: any\n}\n\nexport default class Runtime {\n private readonly eventBroadcaster: EventEmitter\n private readonly eventDataCollector: EventDataCollector\n private readonly stopwatch: ITestRunStopwatch\n private readonly newId: IdGenerator.NewId\n private readonly options: IRuntimeOptions\n private readonly pickleIds: string[]\n private readonly stackTraceFilter: StackTraceFilter\n private readonly supportCodeLibrary: ISupportCodeLibrary\n private success: boolean\n\n constructor({\n eventBroadcaster,\n eventDataCollector,\n newId,\n options,\n pickleIds,\n supportCodeLibrary,\n }: INewRuntimeOptions) {\n this.eventBroadcaster = eventBroadcaster\n this.eventDataCollector = eventDataCollector\n this.stopwatch = options.predictableIds\n ? new PredictableTestRunStopwatch()\n : new RealTestRunStopwatch()\n this.newId = newId\n this.options = options\n this.pickleIds = pickleIds\n this.stackTraceFilter = new StackTraceFilter()\n this.supportCodeLibrary = supportCodeLibrary\n this.success = true\n }\n\n async runTestRunHooks(\n definitions: TestRunHookDefinition[],\n name: string\n ): Promise<void> {\n if (this.options.dryRun) {\n return\n }\n await bluebird.each(\n definitions,\n async (hookDefinition: TestRunHookDefinition) => {\n const { error } = await UserCodeRunner.run({\n argsArray: [],\n fn: hookDefinition.code,\n thisArg: null,\n timeoutInMilliseconds: valueOrDefault(\n hookDefinition.options.timeout,\n this.supportCodeLibrary.defaultTimeout\n ),\n })\n if (doesHaveValue(error)) {\n const location = formatLocation(hookDefinition)\n throw new VError(\n error,\n `${name} hook errored, process exiting: ${location}`\n )\n }\n }\n )\n }\n\n async runTestCase(\n pickleId: string,\n testCase: messages.TestCase\n ): Promise<void> {\n const pickle = this.eventDataCollector.getPickle(pickleId)\n const retries = retriesForPickle(pickle, this.options)\n const skip = this.options.dryRun || (this.options.failFast && !this.success)\n const testCaseRunner = new TestCaseRunner({\n eventBroadcaster: this.eventBroadcaster,\n stopwatch: this.stopwatch,\n gherkinDocument: this.eventDataCollector.getGherkinDocument(pickle.uri),\n newId: this.newId,\n pickle,\n testCase,\n retries,\n skip,\n supportCodeLibrary: this.supportCodeLibrary,\n worldParameters: this.options.worldParameters,\n })\n const status = await testCaseRunner.run()\n if (this.shouldCauseFailure(status)) {\n this.success = false\n }\n }\n\n async start(): Promise<boolean> {\n if (this.options.filterStacktraces) {\n this.stackTraceFilter.filter()\n }\n const testRunStarted: messages.Envelope = {\n testRunStarted: {\n timestamp: this.stopwatch.timestamp(),\n },\n }\n this.eventBroadcaster.emit('envelope', testRunStarted)\n this.stopwatch.start()\n await this.runTestRunHooks(\n this.supportCodeLibrary.beforeTestRunHookDefinitions,\n 'a BeforeAll'\n )\n const assembledTestCases = await assembleTestCases({\n eventBroadcaster: this.eventBroadcaster,\n newId: this.newId,\n pickles: this.pickleIds.map((pickleId) =>\n this.eventDataCollector.getPickle(pickleId)\n ),\n supportCodeLibrary: this.supportCodeLibrary,\n })\n await bluebird.each(this.pickleIds, async (pickleId) => {\n await this.runTestCase(pickleId, assembledTestCases[pickleId])\n })\n await this.runTestRunHooks(\n clone(this.supportCodeLibrary.afterTestRunHookDefinitions).reverse(),\n 'an AfterAll'\n )\n this.stopwatch.stop()\n const testRunFinished: messages.Envelope = {\n testRunFinished: {\n timestamp: this.stopwatch.timestamp(),\n success: this.success,\n },\n }\n this.eventBroadcaster.emit('envelope', testRunFinished)\n if (this.options.filterStacktraces) {\n this.stackTraceFilter.unfilter()\n }\n return this.success\n }\n\n shouldCauseFailure(status: messages.TestStepResultStatus): boolean {\n const failureStatuses: messages.TestStepResultStatus[] = [\n messages.TestStepResultStatus.AMBIGUOUS,\n messages.TestStepResultStatus.FAILED,\n messages.TestStepResultStatus.UNDEFINED,\n ]\n if (this.options.strict)\n failureStatuses.push(messages.TestStepResultStatus.PENDING)\n return _.includes(failureStatuses, status)\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { messages } from '@cucumber/messages';
1
+ import * as messages from '@cucumber/messages';
2
2
  import { IRuntimeOptions } from '../index';
3
3
  export interface IWorkerCommand {
4
4
  initialize?: IWorkerCommandInitialize;
@@ -9,22 +9,23 @@ export interface IWorkerCommandInitialize {
9
9
  filterStacktraces: boolean;
10
10
  supportCodePaths: string[];
11
11
  supportCodeRequiredModules: string[];
12
+ supportCodeIds?: ICanonicalSupportCodeIds;
12
13
  options: IRuntimeOptions;
13
14
  }
15
+ export interface ICanonicalSupportCodeIds {
16
+ stepDefinitionIds: string[];
17
+ beforeTestCaseHookDefinitionIds: string[];
18
+ afterTestCaseHookDefinitionIds: string[];
19
+ }
14
20
  export interface IWorkerCommandRun {
15
21
  retries: number;
16
22
  skip: boolean;
17
23
  elapsed: number;
18
- pickle: messages.IPickle;
19
- gherkinDocument: messages.IGherkinDocument;
24
+ pickle: messages.Pickle;
25
+ testCase: messages.TestCase;
26
+ gherkinDocument: messages.GherkinDocument;
20
27
  }
21
28
  export interface ICoordinatorReport {
22
29
  jsonEnvelope?: string;
23
30
  ready?: boolean;
24
- supportCodeIds?: ICoordinatorReportSupportCodeIds;
25
- }
26
- export interface ICoordinatorReportSupportCodeIds {
27
- stepDefinitionIds: string[];
28
- beforeTestCaseHookDefinitionIds: string[];
29
- afterTestCaseHookDefinitionIds: string[];
30
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"command_types.js","sourceRoot":"","sources":["../../../src/runtime/parallel/command_types.ts"],"names":[],"mappings":"","sourcesContent":["import { messages } from '@cucumber/messages'\nimport { IRuntimeOptions } from '../index'\n\n// Messages from Coordinator to Worker\n\nexport interface IWorkerCommand {\n initialize?: IWorkerCommandInitialize\n run?: IWorkerCommandRun\n finalize?: boolean\n}\n\nexport interface IWorkerCommandInitialize {\n filterStacktraces: boolean\n supportCodePaths: string[]\n supportCodeRequiredModules: string[]\n options: IRuntimeOptions\n}\n\nexport interface IWorkerCommandRun {\n retries: number\n skip: boolean\n elapsed: number\n pickle: messages.IPickle\n gherkinDocument: messages.IGherkinDocument\n}\n\n// Messages from Worker to Coordinator\n\nexport interface ICoordinatorReport {\n jsonEnvelope?: string\n ready?: boolean\n supportCodeIds?: ICoordinatorReportSupportCodeIds\n}\n\nexport interface ICoordinatorReportSupportCodeIds {\n stepDefinitionIds: string[]\n beforeTestCaseHookDefinitionIds: string[]\n afterTestCaseHookDefinitionIds: string[]\n}\n"]}
1
+ {"version":3,"file":"command_types.js","sourceRoot":"","sources":["../../../src/runtime/parallel/command_types.ts"],"names":[],"mappings":"","sourcesContent":["import * as messages from '@cucumber/messages'\nimport { IRuntimeOptions } from '../index'\n\n// Messages from Coordinator to Worker\n\nexport interface IWorkerCommand {\n initialize?: IWorkerCommandInitialize\n run?: IWorkerCommandRun\n finalize?: boolean\n}\n\nexport interface IWorkerCommandInitialize {\n filterStacktraces: boolean\n supportCodePaths: string[]\n supportCodeRequiredModules: string[]\n supportCodeIds?: ICanonicalSupportCodeIds\n options: IRuntimeOptions\n}\n\nexport interface ICanonicalSupportCodeIds {\n stepDefinitionIds: string[]\n beforeTestCaseHookDefinitionIds: string[]\n afterTestCaseHookDefinitionIds: string[]\n}\n\nexport interface IWorkerCommandRun {\n retries: number\n skip: boolean\n elapsed: number\n pickle: messages.Pickle\n testCase: messages.TestCase\n gherkinDocument: messages.GherkinDocument\n}\n\n// Messages from Worker to Coordinator\n\nexport interface ICoordinatorReport {\n jsonEnvelope?: string\n ready?: boolean\n}\n"]}
@@ -1,16 +1,18 @@
1
1
  /// <reference types="node" />
2
2
  import { ChildProcess } from 'child_process';
3
- import { messages } from '@cucumber/messages';
3
+ import * as messages from '@cucumber/messages';
4
4
  import { EventEmitter } from 'events';
5
5
  import { EventDataCollector } from '../../formatter/helpers';
6
6
  import { IRuntimeOptions } from '..';
7
7
  import { ISupportCodeLibrary } from '../../support_code_library_builder/types';
8
- import { ICoordinatorReport, ICoordinatorReportSupportCodeIds } from './command_types';
8
+ import { ICoordinatorReport } from './command_types';
9
+ import { IdGenerator } from '@cucumber/messages';
9
10
  export interface INewCoordinatorOptions {
10
11
  cwd: string;
11
12
  eventBroadcaster: EventEmitter;
12
13
  eventDataCollector: EventDataCollector;
13
14
  options: IRuntimeOptions;
15
+ newId: IdGenerator.NewId;
14
16
  pickleIds: string[];
15
17
  supportCodeLibrary: ISupportCodeLibrary;
16
18
  supportCodePaths: string[];
@@ -28,22 +30,21 @@ export default class Coordinator {
28
30
  private onFinish;
29
31
  private nextPickleIdIndex;
30
32
  private readonly options;
33
+ private readonly newId;
31
34
  private readonly pickleIds;
35
+ private assembledTestCases;
32
36
  private workers;
33
- private supportCodeIdMap;
34
37
  private readonly supportCodeLibrary;
35
38
  private readonly supportCodePaths;
36
39
  private readonly supportCodeRequiredModules;
37
40
  private success;
38
- constructor({ cwd, eventBroadcaster, eventDataCollector, pickleIds, options, supportCodeLibrary, supportCodePaths, supportCodeRequiredModules, }: INewCoordinatorOptions);
41
+ constructor({ cwd, eventBroadcaster, eventDataCollector, pickleIds, options, newId, supportCodeLibrary, supportCodePaths, supportCodeRequiredModules, }: INewCoordinatorOptions);
39
42
  parseWorkerMessage(worker: IWorker, message: ICoordinatorReport): void;
40
- saveDefinitionIdMapping(message: ICoordinatorReportSupportCodeIds): void;
41
- remapDefinitionIds(testCase: messages.ITestCase): void;
42
43
  startWorker(id: string, total: number): void;
43
44
  onWorkerProcessClose(exitCode: number): void;
44
- parseTestCaseResult(testCaseFinished: messages.ITestCaseFinished): void;
45
- run(numberOfWorkers: number, done: (success: boolean) => void): void;
45
+ parseTestCaseResult(testCaseFinished: messages.TestCaseFinished): void;
46
+ run(numberOfWorkers: number): Promise<boolean>;
46
47
  giveWork(worker: IWorker): void;
47
- shouldCauseFailure(status: messages.TestStepFinished.TestStepResult.Status): boolean;
48
+ shouldCauseFailure(status: messages.TestStepResultStatus): boolean;
48
49
  }
49
50
  export {};
@@ -1,4 +1,23 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
2
21
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
22
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
23
  };
@@ -6,14 +25,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
25
  const lodash_1 = __importDefault(require("lodash"));
7
26
  const child_process_1 = require("child_process");
8
27
  const path_1 = __importDefault(require("path"));
9
- const status_1 = __importDefault(require("../../status"));
10
28
  const helpers_1 = require("../helpers");
11
- const messages_1 = require("@cucumber/messages");
29
+ const messages = __importStar(require("@cucumber/messages"));
12
30
  const value_checker_1 = require("../../value_checker");
13
31
  const stopwatch_1 = require("../stopwatch");
32
+ const assemble_test_cases_1 = require("../assemble_test_cases");
14
33
  const runWorkerPath = path_1.default.resolve(__dirname, 'run_worker.js');
15
34
  class Coordinator {
16
- constructor({ cwd, eventBroadcaster, eventDataCollector, pickleIds, options, supportCodeLibrary, supportCodePaths, supportCodeRequiredModules, }) {
35
+ constructor({ cwd, eventBroadcaster, eventDataCollector, pickleIds, options, newId, supportCodeLibrary, supportCodePaths, supportCodeRequiredModules, }) {
17
36
  this.cwd = cwd;
18
37
  this.eventBroadcaster = eventBroadcaster;
19
38
  this.eventDataCollector = eventDataCollector;
@@ -21,6 +40,7 @@ class Coordinator {
21
40
  ? new stopwatch_1.PredictableTestRunStopwatch()
22
41
  : new stopwatch_1.RealTestRunStopwatch();
23
42
  this.options = options;
43
+ this.newId = newId;
24
44
  this.supportCodeLibrary = supportCodeLibrary;
25
45
  this.supportCodePaths = supportCodePaths;
26
46
  this.supportCodeRequiredModules = supportCodeRequiredModules;
@@ -28,21 +48,14 @@ class Coordinator {
28
48
  this.nextPickleIdIndex = 0;
29
49
  this.success = true;
30
50
  this.workers = {};
31
- this.supportCodeIdMap = {};
32
51
  }
33
52
  parseWorkerMessage(worker, message) {
34
- if (value_checker_1.doesHaveValue(message.supportCodeIds)) {
35
- this.saveDefinitionIdMapping(message.supportCodeIds);
36
- }
37
- else if (message.ready) {
53
+ if (message.ready) {
38
54
  this.giveWork(worker);
39
55
  }
40
56
  else if (value_checker_1.doesHaveValue(message.jsonEnvelope)) {
41
- const envelope = messages_1.messages.Envelope.fromObject(JSON.parse(message.jsonEnvelope));
57
+ const envelope = messages.parseEnvelope(message.jsonEnvelope);
42
58
  this.eventBroadcaster.emit('envelope', envelope);
43
- if (value_checker_1.doesHaveValue(envelope.testCase)) {
44
- this.remapDefinitionIds(envelope.testCase);
45
- }
46
59
  if (value_checker_1.doesHaveValue(envelope.testCaseFinished)) {
47
60
  this.parseTestCaseResult(envelope.testCaseFinished);
48
61
  }
@@ -51,27 +64,6 @@ class Coordinator {
51
64
  throw new Error(`Unexpected message from worker: ${JSON.stringify(message)}`);
52
65
  }
53
66
  }
54
- saveDefinitionIdMapping(message) {
55
- lodash_1.default.each(message.stepDefinitionIds, (id, index) => {
56
- this.supportCodeIdMap[id] = this.supportCodeLibrary.stepDefinitions[index].id;
57
- });
58
- lodash_1.default.each(message.beforeTestCaseHookDefinitionIds, (id, index) => {
59
- this.supportCodeIdMap[id] = this.supportCodeLibrary.beforeTestCaseHookDefinitions[index].id;
60
- });
61
- lodash_1.default.each(message.afterTestCaseHookDefinitionIds, (id, index) => {
62
- this.supportCodeIdMap[id] = this.supportCodeLibrary.afterTestCaseHookDefinitions[index].id;
63
- });
64
- }
65
- remapDefinitionIds(testCase) {
66
- for (const testStep of testCase.testSteps) {
67
- if (testStep.hookId !== '') {
68
- testStep.hookId = this.supportCodeIdMap[testStep.hookId];
69
- }
70
- if (value_checker_1.doesHaveValue(testStep.stepDefinitionIds)) {
71
- testStep.stepDefinitionIds = testStep.stepDefinitionIds.map((id) => this.supportCodeIdMap[id]);
72
- }
73
- }
74
- }
75
67
  startWorker(id, total) {
76
68
  const workerProcess = child_process_1.fork(runWorkerPath, [], {
77
69
  cwd: this.cwd,
@@ -96,21 +88,29 @@ class Coordinator {
96
88
  filterStacktraces: this.options.filterStacktraces,
97
89
  supportCodePaths: this.supportCodePaths,
98
90
  supportCodeRequiredModules: this.supportCodeRequiredModules,
91
+ supportCodeIds: {
92
+ stepDefinitionIds: this.supportCodeLibrary.stepDefinitions.map((s) => s.id),
93
+ beforeTestCaseHookDefinitionIds: this.supportCodeLibrary.beforeTestCaseHookDefinitions.map((h) => h.id),
94
+ afterTestCaseHookDefinitionIds: this.supportCodeLibrary.afterTestCaseHookDefinitions.map((h) => h.id),
95
+ },
99
96
  options: this.options,
100
97
  },
101
98
  };
102
99
  worker.process.send(initializeCommand);
103
100
  }
104
101
  onWorkerProcessClose(exitCode) {
105
- if (exitCode !== 0) {
102
+ const success = exitCode === 0;
103
+ if (!success) {
106
104
  this.success = false;
107
105
  }
108
106
  if (lodash_1.default.every(this.workers, 'closed')) {
109
- this.eventBroadcaster.emit('envelope', messages_1.messages.Envelope.fromObject({
107
+ const envelope = {
110
108
  testRunFinished: {
111
109
  timestamp: this.stopwatch.timestamp(),
110
+ success,
112
111
  },
113
- }));
112
+ };
113
+ this.eventBroadcaster.emit('envelope', envelope);
114
114
  this.onFinish(this.success);
115
115
  }
116
116
  }
@@ -121,15 +121,24 @@ class Coordinator {
121
121
  this.success = false;
122
122
  }
123
123
  }
124
- run(numberOfWorkers, done) {
125
- this.eventBroadcaster.emit('envelope', new messages_1.messages.Envelope({
124
+ async run(numberOfWorkers) {
125
+ const envelope = {
126
126
  testRunStarted: {
127
127
  timestamp: this.stopwatch.timestamp(),
128
128
  },
129
- }));
129
+ };
130
+ this.eventBroadcaster.emit('envelope', envelope);
130
131
  this.stopwatch.start();
131
- lodash_1.default.times(numberOfWorkers, (id) => this.startWorker(id.toString(), numberOfWorkers));
132
- this.onFinish = done;
132
+ this.assembledTestCases = await assemble_test_cases_1.assembleTestCases({
133
+ eventBroadcaster: this.eventBroadcaster,
134
+ newId: this.newId,
135
+ pickles: this.pickleIds.map((pickleId) => this.eventDataCollector.getPickle(pickleId)),
136
+ supportCodeLibrary: this.supportCodeLibrary,
137
+ });
138
+ return await new Promise((resolve) => {
139
+ lodash_1.default.times(numberOfWorkers, (id) => this.startWorker(id.toString(), numberOfWorkers));
140
+ this.onFinish = resolve;
141
+ });
133
142
  }
134
143
  giveWork(worker) {
135
144
  if (this.nextPickleIdIndex === this.pickleIds.length) {
@@ -140,6 +149,7 @@ class Coordinator {
140
149
  const pickleId = this.pickleIds[this.nextPickleIdIndex];
141
150
  this.nextPickleIdIndex += 1;
142
151
  const pickle = this.eventDataCollector.getPickle(pickleId);
152
+ const testCase = this.assembledTestCases[pickleId];
143
153
  const gherkinDocument = this.eventDataCollector.getGherkinDocument(pickle.uri);
144
154
  const retries = helpers_1.retriesForPickle(pickle, this.options);
145
155
  const skip = this.options.dryRun || (this.options.failFast && !this.success);
@@ -149,14 +159,15 @@ class Coordinator {
149
159
  skip,
150
160
  elapsed: this.stopwatch.duration().nanos(),
151
161
  pickle,
162
+ testCase,
152
163
  gherkinDocument,
153
164
  },
154
165
  };
155
166
  worker.process.send(runCommand);
156
167
  }
157
168
  shouldCauseFailure(status) {
158
- return (lodash_1.default.includes([status_1.default.AMBIGUOUS, status_1.default.FAILED, status_1.default.UNDEFINED], status) ||
159
- (status === status_1.default.PENDING && this.options.strict));
169
+ return (lodash_1.default.includes(['AMBIGUOUS', 'FAILED', 'UNDEFINED'], status) ||
170
+ (status === 'PENDING' && this.options.strict));
160
171
  }
161
172
  }
162
173
  exports.default = Coordinator;
@@ -1 +1 @@
1
- {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../../src/runtime/parallel/coordinator.ts"],"names":[],"mappings":"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","sourcesContent":["import _, { Dictionary } from 'lodash'\nimport { ChildProcess, fork } from 'child_process'\nimport path from 'path'\nimport Status from '../../status'\nimport { retriesForPickle } from '../helpers'\nimport { messages } from '@cucumber/messages'\nimport { EventEmitter } from 'events'\nimport { EventDataCollector } from '../../formatter/helpers'\nimport { IRuntimeOptions } from '..'\nimport { ISupportCodeLibrary } from '../../support_code_library_builder/types'\nimport {\n ICoordinatorReport,\n ICoordinatorReportSupportCodeIds,\n IWorkerCommand,\n} from './command_types'\nimport { doesHaveValue } from '../../value_checker'\nimport {\n ITestRunStopwatch,\n PredictableTestRunStopwatch,\n RealTestRunStopwatch,\n} from '../stopwatch'\n\nconst runWorkerPath = path.resolve(__dirname, 'run_worker.js')\n\nexport interface INewCoordinatorOptions {\n cwd: string\n eventBroadcaster: EventEmitter\n eventDataCollector: EventDataCollector\n options: IRuntimeOptions\n pickleIds: string[]\n supportCodeLibrary: ISupportCodeLibrary\n supportCodePaths: string[]\n supportCodeRequiredModules: string[]\n}\n\ninterface IWorker {\n closed: boolean\n process: ChildProcess\n}\n\nexport default class Coordinator {\n private readonly cwd: string\n private readonly eventBroadcaster: EventEmitter\n private readonly eventDataCollector: EventDataCollector\n private readonly stopwatch: ITestRunStopwatch\n private onFinish: (success: boolean) => void\n private nextPickleIdIndex: number\n private readonly options: IRuntimeOptions\n private readonly pickleIds: string[]\n private workers: Dictionary<IWorker>\n private supportCodeIdMap: Dictionary<string>\n private readonly supportCodeLibrary: ISupportCodeLibrary\n private readonly supportCodePaths: string[]\n private readonly supportCodeRequiredModules: string[]\n private success: boolean\n\n constructor({\n cwd,\n eventBroadcaster,\n eventDataCollector,\n pickleIds,\n options,\n supportCodeLibrary,\n supportCodePaths,\n supportCodeRequiredModules,\n }: INewCoordinatorOptions) {\n this.cwd = cwd\n this.eventBroadcaster = eventBroadcaster\n this.eventDataCollector = eventDataCollector\n this.stopwatch = options.predictableIds\n ? new PredictableTestRunStopwatch()\n : new RealTestRunStopwatch()\n this.options = options\n this.supportCodeLibrary = supportCodeLibrary\n this.supportCodePaths = supportCodePaths\n this.supportCodeRequiredModules = supportCodeRequiredModules\n this.pickleIds = pickleIds\n this.nextPickleIdIndex = 0\n this.success = true\n this.workers = {}\n this.supportCodeIdMap = {}\n }\n\n parseWorkerMessage(worker: IWorker, message: ICoordinatorReport): void {\n if (doesHaveValue(message.supportCodeIds)) {\n this.saveDefinitionIdMapping(message.supportCodeIds)\n } else if (message.ready) {\n this.giveWork(worker)\n } else if (doesHaveValue(message.jsonEnvelope)) {\n const envelope = messages.Envelope.fromObject(\n JSON.parse(message.jsonEnvelope)\n )\n this.eventBroadcaster.emit('envelope', envelope)\n if (doesHaveValue(envelope.testCase)) {\n this.remapDefinitionIds(envelope.testCase)\n }\n if (doesHaveValue(envelope.testCaseFinished)) {\n this.parseTestCaseResult(envelope.testCaseFinished)\n }\n } else {\n throw new Error(\n `Unexpected message from worker: ${JSON.stringify(message)}`\n )\n }\n }\n\n saveDefinitionIdMapping(message: ICoordinatorReportSupportCodeIds): void {\n _.each(message.stepDefinitionIds, (id: string, index: number) => {\n this.supportCodeIdMap[id] = this.supportCodeLibrary.stepDefinitions[\n index\n ].id\n })\n _.each(\n message.beforeTestCaseHookDefinitionIds,\n (id: string, index: number) => {\n this.supportCodeIdMap[\n id\n ] = this.supportCodeLibrary.beforeTestCaseHookDefinitions[index].id\n }\n )\n _.each(\n message.afterTestCaseHookDefinitionIds,\n (id: string, index: number) => {\n this.supportCodeIdMap[\n id\n ] = this.supportCodeLibrary.afterTestCaseHookDefinitions[index].id\n }\n )\n }\n\n remapDefinitionIds(testCase: messages.ITestCase): void {\n for (const testStep of testCase.testSteps) {\n if (testStep.hookId !== '') {\n testStep.hookId = this.supportCodeIdMap[testStep.hookId]\n }\n if (doesHaveValue(testStep.stepDefinitionIds)) {\n testStep.stepDefinitionIds = testStep.stepDefinitionIds.map(\n (id) => this.supportCodeIdMap[id]\n )\n }\n }\n }\n\n startWorker(id: string, total: number): void {\n const workerProcess = fork(runWorkerPath, [], {\n cwd: this.cwd,\n env: _.assign({}, process.env, {\n CUCUMBER_PARALLEL: 'true',\n CUCUMBER_TOTAL_WORKERS: total,\n CUCUMBER_WORKER_ID: id,\n }),\n stdio: ['inherit', 'inherit', 'inherit', 'ipc'],\n })\n const worker = { closed: false, process: workerProcess }\n this.workers[id] = worker\n worker.process.on('message', (message: ICoordinatorReport) => {\n this.parseWorkerMessage(worker, message)\n })\n worker.process.on('close', (exitCode) => {\n worker.closed = true\n this.onWorkerProcessClose(exitCode)\n })\n const initializeCommand: IWorkerCommand = {\n initialize: {\n filterStacktraces: this.options.filterStacktraces,\n supportCodePaths: this.supportCodePaths,\n supportCodeRequiredModules: this.supportCodeRequiredModules,\n options: this.options,\n },\n }\n worker.process.send(initializeCommand)\n }\n\n onWorkerProcessClose(exitCode: number): void {\n if (exitCode !== 0) {\n this.success = false\n }\n if (_.every(this.workers, 'closed')) {\n this.eventBroadcaster.emit(\n 'envelope',\n messages.Envelope.fromObject({\n testRunFinished: {\n timestamp: this.stopwatch.timestamp(),\n },\n })\n )\n this.onFinish(this.success)\n }\n }\n\n parseTestCaseResult(testCaseFinished: messages.ITestCaseFinished): void {\n const { worstTestStepResult } = this.eventDataCollector.getTestCaseAttempt(\n testCaseFinished.testCaseStartedId\n )\n if (\n !worstTestStepResult.willBeRetried &&\n this.shouldCauseFailure(worstTestStepResult.status)\n ) {\n this.success = false\n }\n }\n\n run(numberOfWorkers: number, done: (success: boolean) => void): void {\n this.eventBroadcaster.emit(\n 'envelope',\n new messages.Envelope({\n testRunStarted: {\n timestamp: this.stopwatch.timestamp(),\n },\n })\n )\n this.stopwatch.start()\n _.times(numberOfWorkers, (id) =>\n this.startWorker(id.toString(), numberOfWorkers)\n )\n this.onFinish = done\n }\n\n giveWork(worker: IWorker): void {\n if (this.nextPickleIdIndex === this.pickleIds.length) {\n const finalizeCommand: IWorkerCommand = { finalize: true }\n worker.process.send(finalizeCommand)\n return\n }\n const pickleId = this.pickleIds[this.nextPickleIdIndex]\n this.nextPickleIdIndex += 1\n const pickle = this.eventDataCollector.getPickle(pickleId)\n const gherkinDocument = this.eventDataCollector.getGherkinDocument(\n pickle.uri\n )\n const retries = retriesForPickle(pickle, this.options)\n const skip = this.options.dryRun || (this.options.failFast && !this.success)\n const runCommand: IWorkerCommand = {\n run: {\n retries,\n skip,\n elapsed: this.stopwatch.duration().nanos(),\n pickle,\n gherkinDocument,\n },\n }\n worker.process.send(runCommand)\n }\n\n shouldCauseFailure(\n status: messages.TestStepFinished.TestStepResult.Status\n ): boolean {\n return (\n _.includes([Status.AMBIGUOUS, Status.FAILED, Status.UNDEFINED], status) ||\n (status === Status.PENDING && this.options.strict)\n )\n }\n}\n"]}
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../../src/runtime/parallel/coordinator.ts"],"names":[],"mappings":"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","sourcesContent":["import _ from 'lodash'\nimport { ChildProcess, fork } from 'child_process'\nimport path from 'path'\nimport { retriesForPickle } from '../helpers'\nimport * as messages from '@cucumber/messages'\nimport { EventEmitter } from 'events'\nimport { EventDataCollector } from '../../formatter/helpers'\nimport { IRuntimeOptions } from '..'\nimport { ISupportCodeLibrary } from '../../support_code_library_builder/types'\nimport { ICoordinatorReport, IWorkerCommand } from './command_types'\nimport { doesHaveValue } from '../../value_checker'\nimport {\n ITestRunStopwatch,\n PredictableTestRunStopwatch,\n RealTestRunStopwatch,\n} from '../stopwatch'\nimport { assembleTestCases, IAssembledTestCases } from '../assemble_test_cases'\nimport { IdGenerator } from '@cucumber/messages'\n\nconst runWorkerPath = path.resolve(__dirname, 'run_worker.js')\n\nexport interface INewCoordinatorOptions {\n cwd: string\n eventBroadcaster: EventEmitter\n eventDataCollector: EventDataCollector\n options: IRuntimeOptions\n newId: IdGenerator.NewId\n pickleIds: string[]\n supportCodeLibrary: ISupportCodeLibrary\n supportCodePaths: string[]\n supportCodeRequiredModules: string[]\n}\n\ninterface IWorker {\n closed: boolean\n process: ChildProcess\n}\n\nexport default class Coordinator {\n private readonly cwd: string\n private readonly eventBroadcaster: EventEmitter\n private readonly eventDataCollector: EventDataCollector\n private readonly stopwatch: ITestRunStopwatch\n private onFinish: (success: boolean) => void\n private nextPickleIdIndex: number\n private readonly options: IRuntimeOptions\n private readonly newId: IdGenerator.NewId\n private readonly pickleIds: string[]\n private assembledTestCases: IAssembledTestCases\n private workers: Record<string, IWorker>\n private readonly supportCodeLibrary: ISupportCodeLibrary\n private readonly supportCodePaths: string[]\n private readonly supportCodeRequiredModules: string[]\n private success: boolean\n\n constructor({\n cwd,\n eventBroadcaster,\n eventDataCollector,\n pickleIds,\n options,\n newId,\n supportCodeLibrary,\n supportCodePaths,\n supportCodeRequiredModules,\n }: INewCoordinatorOptions) {\n this.cwd = cwd\n this.eventBroadcaster = eventBroadcaster\n this.eventDataCollector = eventDataCollector\n this.stopwatch = options.predictableIds\n ? new PredictableTestRunStopwatch()\n : new RealTestRunStopwatch()\n this.options = options\n this.newId = newId\n this.supportCodeLibrary = supportCodeLibrary\n this.supportCodePaths = supportCodePaths\n this.supportCodeRequiredModules = supportCodeRequiredModules\n this.pickleIds = pickleIds\n this.nextPickleIdIndex = 0\n this.success = true\n this.workers = {}\n }\n\n parseWorkerMessage(worker: IWorker, message: ICoordinatorReport): void {\n if (message.ready) {\n this.giveWork(worker)\n } else if (doesHaveValue(message.jsonEnvelope)) {\n const envelope = messages.parseEnvelope(message.jsonEnvelope)\n this.eventBroadcaster.emit('envelope', envelope)\n if (doesHaveValue(envelope.testCaseFinished)) {\n this.parseTestCaseResult(envelope.testCaseFinished)\n }\n } else {\n throw new Error(\n `Unexpected message from worker: ${JSON.stringify(message)}`\n )\n }\n }\n\n startWorker(id: string, total: number): void {\n const workerProcess = fork(runWorkerPath, [], {\n cwd: this.cwd,\n env: _.assign({}, process.env, {\n CUCUMBER_PARALLEL: 'true',\n CUCUMBER_TOTAL_WORKERS: total,\n CUCUMBER_WORKER_ID: id,\n }),\n stdio: ['inherit', 'inherit', 'inherit', 'ipc'],\n })\n const worker = { closed: false, process: workerProcess }\n this.workers[id] = worker\n worker.process.on('message', (message: ICoordinatorReport) => {\n this.parseWorkerMessage(worker, message)\n })\n worker.process.on('close', (exitCode) => {\n worker.closed = true\n this.onWorkerProcessClose(exitCode)\n })\n const initializeCommand: IWorkerCommand = {\n initialize: {\n filterStacktraces: this.options.filterStacktraces,\n supportCodePaths: this.supportCodePaths,\n supportCodeRequiredModules: this.supportCodeRequiredModules,\n supportCodeIds: {\n stepDefinitionIds: this.supportCodeLibrary.stepDefinitions.map(\n (s) => s.id\n ),\n beforeTestCaseHookDefinitionIds:\n this.supportCodeLibrary.beforeTestCaseHookDefinitions.map(\n (h) => h.id\n ),\n afterTestCaseHookDefinitionIds:\n this.supportCodeLibrary.afterTestCaseHookDefinitions.map(\n (h) => h.id\n ),\n },\n options: this.options,\n },\n }\n worker.process.send(initializeCommand)\n }\n\n onWorkerProcessClose(exitCode: number): void {\n const success = exitCode === 0\n if (!success) {\n this.success = false\n }\n if (_.every(this.workers, 'closed')) {\n const envelope: messages.Envelope = {\n testRunFinished: {\n timestamp: this.stopwatch.timestamp(),\n success,\n },\n }\n this.eventBroadcaster.emit('envelope', envelope)\n this.onFinish(this.success)\n }\n }\n\n parseTestCaseResult(testCaseFinished: messages.TestCaseFinished): void {\n const { worstTestStepResult } = this.eventDataCollector.getTestCaseAttempt(\n testCaseFinished.testCaseStartedId\n )\n if (\n !worstTestStepResult.willBeRetried &&\n this.shouldCauseFailure(worstTestStepResult.status)\n ) {\n this.success = false\n }\n }\n\n async run(numberOfWorkers: number): Promise<boolean> {\n const envelope: messages.Envelope = {\n testRunStarted: {\n timestamp: this.stopwatch.timestamp(),\n },\n }\n this.eventBroadcaster.emit('envelope', envelope)\n this.stopwatch.start()\n this.assembledTestCases = await assembleTestCases({\n eventBroadcaster: this.eventBroadcaster,\n newId: this.newId,\n pickles: this.pickleIds.map((pickleId) =>\n this.eventDataCollector.getPickle(pickleId)\n ),\n supportCodeLibrary: this.supportCodeLibrary,\n })\n return await new Promise<boolean>((resolve) => {\n _.times(numberOfWorkers, (id) =>\n this.startWorker(id.toString(), numberOfWorkers)\n )\n this.onFinish = resolve\n })\n }\n\n giveWork(worker: IWorker): void {\n if (this.nextPickleIdIndex === this.pickleIds.length) {\n const finalizeCommand: IWorkerCommand = { finalize: true }\n worker.process.send(finalizeCommand)\n return\n }\n const pickleId = this.pickleIds[this.nextPickleIdIndex]\n this.nextPickleIdIndex += 1\n const pickle = this.eventDataCollector.getPickle(pickleId)\n const testCase = this.assembledTestCases[pickleId]\n const gherkinDocument = this.eventDataCollector.getGherkinDocument(\n pickle.uri\n )\n const retries = retriesForPickle(pickle, this.options)\n const skip = this.options.dryRun || (this.options.failFast && !this.success)\n const runCommand: IWorkerCommand = {\n run: {\n retries,\n skip,\n elapsed: this.stopwatch.duration().nanos(),\n pickle,\n testCase,\n gherkinDocument,\n },\n }\n worker.process.send(runCommand)\n }\n\n shouldCauseFailure(status: messages.TestStepResultStatus): boolean {\n return (\n _.includes(['AMBIGUOUS', 'FAILED', 'UNDEFINED'], status) ||\n (status === 'PENDING' && this.options.strict)\n )\n }\n}\n"]}
@@ -20,10 +20,10 @@ export default class Worker {
20
20
  id: string;
21
21
  sendMessage: IMessageSender;
22
22
  });
23
- initialize({ filterStacktraces, supportCodeRequiredModules, supportCodePaths, options, }: IWorkerCommandInitialize): Promise<void>;
23
+ initialize({ filterStacktraces, supportCodeRequiredModules, supportCodePaths, supportCodeIds, options, }: IWorkerCommandInitialize): Promise<void>;
24
24
  finalize(): Promise<void>;
25
25
  receiveMessage(message: IWorkerCommand): Promise<void>;
26
- runTestCase({ gherkinDocument, pickle, elapsed, retries, skip, }: IWorkerCommandRun): Promise<void>;
26
+ runTestCase({ gherkinDocument, pickle, testCase, elapsed, retries, skip, }: IWorkerCommandRun): Promise<void>;
27
27
  runTestRunHooks(testRunHookDefinitions: TestRunHookDefinition[], name: string): Promise<void>;
28
28
  }
29
29
  export {};
@@ -8,7 +8,7 @@ const events_1 = require("events");
8
8
  const bluebird_1 = __importDefault(require("bluebird"));
9
9
  const stack_trace_filter_1 = __importDefault(require("../../stack_trace_filter"));
10
10
  const support_code_library_builder_1 = __importDefault(require("../../support_code_library_builder"));
11
- const pickle_runner_1 = __importDefault(require("../pickle_runner"));
11
+ const test_case_runner_1 = __importDefault(require("../test_case_runner"));
12
12
  const user_code_runner_1 = __importDefault(require("../../user_code_runner"));
13
13
  const messages_1 = require("@cucumber/messages");
14
14
  const value_checker_1 = require("../../value_checker");
@@ -26,22 +26,15 @@ class Worker {
26
26
  this.stackTraceFilter = new stack_trace_filter_1.default();
27
27
  this.eventBroadcaster.on('envelope', (envelope) => {
28
28
  this.sendMessage({
29
- jsonEnvelope: JSON.stringify(envelope.toJSON()),
29
+ jsonEnvelope: JSON.stringify(envelope),
30
30
  });
31
31
  });
32
32
  }
33
- async initialize({ filterStacktraces, supportCodeRequiredModules, supportCodePaths, options, }) {
33
+ async initialize({ filterStacktraces, supportCodeRequiredModules, supportCodePaths, supportCodeIds, options, }) {
34
34
  supportCodeRequiredModules.map((module) => require(module));
35
35
  support_code_library_builder_1.default.reset(this.cwd, this.newId);
36
36
  supportCodePaths.forEach((codePath) => require(codePath));
37
- this.supportCodeLibrary = support_code_library_builder_1.default.finalize();
38
- this.sendMessage({
39
- supportCodeIds: {
40
- stepDefinitionIds: this.supportCodeLibrary.stepDefinitions.map((s) => s.id),
41
- beforeTestCaseHookDefinitionIds: this.supportCodeLibrary.beforeTestCaseHookDefinitions.map((h) => h.id),
42
- afterTestCaseHookDefinitionIds: this.supportCodeLibrary.afterTestCaseHookDefinitions.map((h) => h.id),
43
- },
44
- });
37
+ this.supportCodeLibrary = support_code_library_builder_1.default.finalize(supportCodeIds);
45
38
  this.worldParameters = options.worldParameters;
46
39
  this.options = options;
47
40
  this.filterStacktraces = filterStacktraces;
@@ -69,23 +62,24 @@ class Worker {
69
62
  await this.runTestCase(message.run);
70
63
  }
71
64
  }
72
- async runTestCase({ gherkinDocument, pickle, elapsed, retries, skip, }) {
65
+ async runTestCase({ gherkinDocument, pickle, testCase, elapsed, retries, skip, }) {
73
66
  const stopwatch = this.options.predictableIds
74
67
  ? new stopwatch_1.PredictableTestRunStopwatch()
75
68
  : new stopwatch_1.RealTestRunStopwatch();
76
69
  stopwatch.from(durations_1.duration(elapsed));
77
- const pickleRunner = new pickle_runner_1.default({
70
+ const testCaseRunner = new test_case_runner_1.default({
78
71
  eventBroadcaster: this.eventBroadcaster,
79
72
  stopwatch,
80
73
  gherkinDocument,
81
74
  newId: this.newId,
82
75
  pickle,
76
+ testCase,
83
77
  retries,
84
78
  skip,
85
79
  supportCodeLibrary: this.supportCodeLibrary,
86
80
  worldParameters: this.worldParameters,
87
81
  });
88
- await pickleRunner.run();
82
+ await testCaseRunner.run();
89
83
  this.sendMessage({ ready: true });
90
84
  }
91
85
  async runTestRunHooks(testRunHookDefinitions, name) {
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/runtime/parallel/worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatLocation } from '../../formatter/helpers'\nimport {\n ICoordinatorReport,\n IWorkerCommand,\n IWorkerCommandInitialize,\n IWorkerCommandRun,\n} from './command_types'\nimport { EventEmitter } from 'events'\nimport bluebird from 'bluebird'\nimport StackTraceFilter from '../../stack_trace_filter'\nimport supportCodeLibraryBuilder from '../../support_code_library_builder'\nimport PickleRunner from '../pickle_runner'\nimport UserCodeRunner from '../../user_code_runner'\nimport { IdGenerator, messages } from '@cucumber/messages'\nimport TestRunHookDefinition from '../../models/test_run_hook_definition'\nimport { ISupportCodeLibrary } from '../../support_code_library_builder/types'\nimport { doesHaveValue, valueOrDefault } from '../../value_checker'\nimport { IRuntimeOptions } from '../index'\nimport { PredictableTestRunStopwatch, RealTestRunStopwatch } from '../stopwatch'\nimport { duration } from 'durations'\n\nconst { uuid } = IdGenerator\n\ntype IExitFunction = (exitCode: number, error?: Error, message?: string) => void\ntype IMessageSender = (command: ICoordinatorReport) => void\n\nexport default class Worker {\n private readonly cwd: string\n private readonly exit: IExitFunction\n\n private readonly id: string\n private readonly eventBroadcaster: EventEmitter\n private filterStacktraces: boolean\n private readonly newId: IdGenerator.NewId\n private readonly sendMessage: IMessageSender\n private readonly stackTraceFilter: StackTraceFilter\n private supportCodeLibrary: ISupportCodeLibrary\n private worldParameters: any\n private options: IRuntimeOptions\n\n constructor({\n cwd,\n exit,\n id,\n sendMessage,\n }: {\n cwd: string\n exit: IExitFunction\n id: string\n sendMessage: IMessageSender\n }) {\n this.id = id\n this.newId = uuid()\n this.cwd = cwd\n this.exit = exit\n this.sendMessage = sendMessage\n this.eventBroadcaster = new EventEmitter()\n this.stackTraceFilter = new StackTraceFilter()\n this.eventBroadcaster.on('envelope', (envelope: messages.Envelope) => {\n this.sendMessage({\n jsonEnvelope: JSON.stringify(envelope.toJSON()),\n })\n })\n }\n\n async initialize({\n filterStacktraces,\n supportCodeRequiredModules,\n supportCodePaths,\n options,\n }: IWorkerCommandInitialize): Promise<void> {\n supportCodeRequiredModules.map((module) => require(module))\n supportCodeLibraryBuilder.reset(this.cwd, this.newId)\n supportCodePaths.forEach((codePath) => require(codePath))\n this.supportCodeLibrary = supportCodeLibraryBuilder.finalize()\n this.sendMessage({\n supportCodeIds: {\n stepDefinitionIds: this.supportCodeLibrary.stepDefinitions.map(\n (s) => s.id\n ),\n beforeTestCaseHookDefinitionIds: this.supportCodeLibrary.beforeTestCaseHookDefinitions.map(\n (h) => h.id\n ),\n afterTestCaseHookDefinitionIds: this.supportCodeLibrary.afterTestCaseHookDefinitions.map(\n (h) => h.id\n ),\n },\n })\n this.worldParameters = options.worldParameters\n this.options = options\n this.filterStacktraces = filterStacktraces\n if (this.filterStacktraces) {\n this.stackTraceFilter.filter()\n }\n await this.runTestRunHooks(\n this.supportCodeLibrary.beforeTestRunHookDefinitions,\n 'a BeforeAll'\n )\n this.sendMessage({ ready: true })\n }\n\n async finalize(): Promise<void> {\n await this.runTestRunHooks(\n this.supportCodeLibrary.afterTestRunHookDefinitions,\n 'an AfterAll'\n )\n if (this.filterStacktraces) {\n this.stackTraceFilter.unfilter()\n }\n this.exit(0)\n }\n\n async receiveMessage(message: IWorkerCommand): Promise<void> {\n if (doesHaveValue(message.initialize)) {\n await this.initialize(message.initialize)\n } else if (message.finalize) {\n await this.finalize()\n } else if (doesHaveValue(message.run)) {\n await this.runTestCase(message.run)\n }\n }\n\n async runTestCase({\n gherkinDocument,\n pickle,\n elapsed,\n retries,\n skip,\n }: IWorkerCommandRun): Promise<void> {\n const stopwatch = this.options.predictableIds\n ? new PredictableTestRunStopwatch()\n : new RealTestRunStopwatch()\n stopwatch.from(duration(elapsed))\n const pickleRunner = new PickleRunner({\n eventBroadcaster: this.eventBroadcaster,\n stopwatch,\n gherkinDocument,\n newId: this.newId,\n pickle,\n retries,\n skip,\n supportCodeLibrary: this.supportCodeLibrary,\n worldParameters: this.worldParameters,\n })\n await pickleRunner.run()\n this.sendMessage({ ready: true })\n }\n\n async runTestRunHooks(\n testRunHookDefinitions: TestRunHookDefinition[],\n name: string\n ): Promise<void> {\n if (this.options.dryRun) {\n return\n }\n await bluebird.each(testRunHookDefinitions, async (hookDefinition) => {\n const { error } = await UserCodeRunner.run({\n argsArray: [],\n fn: hookDefinition.code,\n thisArg: null,\n timeoutInMilliseconds: valueOrDefault(\n hookDefinition.options.timeout,\n this.supportCodeLibrary.defaultTimeout\n ),\n })\n if (doesHaveValue(error)) {\n const location = formatLocation(hookDefinition)\n this.exit(\n 1,\n error,\n `${name} hook errored on worker ${this.id}, process exiting: ${location}`\n )\n }\n })\n }\n}\n"]}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/runtime/parallel/worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatLocation } from '../../formatter/helpers'\nimport {\n ICoordinatorReport,\n IWorkerCommand,\n IWorkerCommandInitialize,\n IWorkerCommandRun,\n} from './command_types'\nimport { EventEmitter } from 'events'\nimport bluebird from 'bluebird'\nimport StackTraceFilter from '../../stack_trace_filter'\nimport supportCodeLibraryBuilder from '../../support_code_library_builder'\nimport TestCaseRunner from '../test_case_runner'\nimport UserCodeRunner from '../../user_code_runner'\nimport { IdGenerator } from '@cucumber/messages'\nimport * as messages from '@cucumber/messages'\nimport TestRunHookDefinition from '../../models/test_run_hook_definition'\nimport { ISupportCodeLibrary } from '../../support_code_library_builder/types'\nimport { doesHaveValue, valueOrDefault } from '../../value_checker'\nimport { IRuntimeOptions } from '../index'\nimport { PredictableTestRunStopwatch, RealTestRunStopwatch } from '../stopwatch'\nimport { duration } from 'durations'\n\nconst { uuid } = IdGenerator\n\ntype IExitFunction = (exitCode: number, error?: Error, message?: string) => void\ntype IMessageSender = (command: ICoordinatorReport) => void\n\nexport default class Worker {\n private readonly cwd: string\n private readonly exit: IExitFunction\n\n private readonly id: string\n private readonly eventBroadcaster: EventEmitter\n private filterStacktraces: boolean\n private readonly newId: IdGenerator.NewId\n private readonly sendMessage: IMessageSender\n private readonly stackTraceFilter: StackTraceFilter\n private supportCodeLibrary: ISupportCodeLibrary\n private worldParameters: any\n private options: IRuntimeOptions\n\n constructor({\n cwd,\n exit,\n id,\n sendMessage,\n }: {\n cwd: string\n exit: IExitFunction\n id: string\n sendMessage: IMessageSender\n }) {\n this.id = id\n this.newId = uuid()\n this.cwd = cwd\n this.exit = exit\n this.sendMessage = sendMessage\n this.eventBroadcaster = new EventEmitter()\n this.stackTraceFilter = new StackTraceFilter()\n this.eventBroadcaster.on('envelope', (envelope: messages.Envelope) => {\n this.sendMessage({\n jsonEnvelope: JSON.stringify(envelope),\n })\n })\n }\n\n async initialize({\n filterStacktraces,\n supportCodeRequiredModules,\n supportCodePaths,\n supportCodeIds,\n options,\n }: IWorkerCommandInitialize): Promise<void> {\n supportCodeRequiredModules.map((module) => require(module))\n supportCodeLibraryBuilder.reset(this.cwd, this.newId)\n supportCodePaths.forEach((codePath) => require(codePath))\n this.supportCodeLibrary = supportCodeLibraryBuilder.finalize(supportCodeIds)\n\n this.worldParameters = options.worldParameters\n this.options = options\n this.filterStacktraces = filterStacktraces\n if (this.filterStacktraces) {\n this.stackTraceFilter.filter()\n }\n await this.runTestRunHooks(\n this.supportCodeLibrary.beforeTestRunHookDefinitions,\n 'a BeforeAll'\n )\n this.sendMessage({ ready: true })\n }\n\n async finalize(): Promise<void> {\n await this.runTestRunHooks(\n this.supportCodeLibrary.afterTestRunHookDefinitions,\n 'an AfterAll'\n )\n if (this.filterStacktraces) {\n this.stackTraceFilter.unfilter()\n }\n this.exit(0)\n }\n\n async receiveMessage(message: IWorkerCommand): Promise<void> {\n if (doesHaveValue(message.initialize)) {\n await this.initialize(message.initialize)\n } else if (message.finalize) {\n await this.finalize()\n } else if (doesHaveValue(message.run)) {\n await this.runTestCase(message.run)\n }\n }\n\n async runTestCase({\n gherkinDocument,\n pickle,\n testCase,\n elapsed,\n retries,\n skip,\n }: IWorkerCommandRun): Promise<void> {\n const stopwatch = this.options.predictableIds\n ? new PredictableTestRunStopwatch()\n : new RealTestRunStopwatch()\n stopwatch.from(duration(elapsed))\n const testCaseRunner = new TestCaseRunner({\n eventBroadcaster: this.eventBroadcaster,\n stopwatch,\n gherkinDocument,\n newId: this.newId,\n pickle,\n testCase,\n retries,\n skip,\n supportCodeLibrary: this.supportCodeLibrary,\n worldParameters: this.worldParameters,\n })\n await testCaseRunner.run()\n this.sendMessage({ ready: true })\n }\n\n async runTestRunHooks(\n testRunHookDefinitions: TestRunHookDefinition[],\n name: string\n ): Promise<void> {\n if (this.options.dryRun) {\n return\n }\n await bluebird.each(testRunHookDefinitions, async (hookDefinition) => {\n const { error } = await UserCodeRunner.run({\n argsArray: [],\n fn: hookDefinition.code,\n thisArg: null,\n timeoutInMilliseconds: valueOrDefault(\n hookDefinition.options.timeout,\n this.supportCodeLibrary.defaultTimeout\n ),\n })\n if (doesHaveValue(error)) {\n const location = formatLocation(hookDefinition)\n this.exit(\n 1,\n error,\n `${name} hook errored on worker ${this.id}, process exiting: ${location}`\n )\n }\n })\n }\n}\n"]}
@@ -1,14 +1,14 @@
1
- import { messages } from '@cucumber/messages';
1
+ import * as messages from '@cucumber/messages';
2
2
  import { ITestCaseHookParameter } from '../support_code_library_builder/types';
3
3
  import { IDefinition } from '../models/definition';
4
4
  export interface IRunOptions {
5
5
  defaultTimeout: number;
6
6
  hookParameter: ITestCaseHookParameter;
7
- step: messages.Pickle.IPickleStep;
7
+ step: messages.PickleStep;
8
8
  stepDefinition: IDefinition;
9
9
  world: any;
10
10
  }
11
- export declare function run({ defaultTimeout, hookParameter, step, stepDefinition, world, }: IRunOptions): Promise<messages.TestStepFinished.ITestStepResult>;
11
+ export declare function run({ defaultTimeout, hookParameter, step, stepDefinition, world, }: IRunOptions): Promise<messages.TestStepResult>;
12
12
  declare const _default: {
13
13
  run: typeof run;
14
14
  };
@@ -24,10 +24,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
25
  exports.run = void 0;
26
26
  const lodash_1 = __importDefault(require("lodash"));
27
- const status_1 = __importDefault(require("../status"));
28
- const time_1 = __importStar(require("../time"));
27
+ const time_1 = __importDefault(require("../time"));
29
28
  const user_code_runner_1 = __importDefault(require("../user_code_runner"));
30
- const messages_1 = require("@cucumber/messages");
29
+ const messages = __importStar(require("@cucumber/messages"));
31
30
  const assertion_error_formatter_1 = require("assertion-error-formatter");
32
31
  const value_checker_1 = require("../value_checker");
33
32
  const { beginTiming, endTiming } = time_1.default;
@@ -60,23 +59,28 @@ async function run({ defaultTimeout, hookParameter, step, stepDefinition, world,
60
59
  error = invocationData.getInvalidCodeLengthMessage();
61
60
  }
62
61
  }
63
- const testStepResult = messages_1.messages.TestStepFinished.TestStepResult.fromObject({
64
- duration: time_1.millisecondsToDuration(endTiming()),
65
- });
62
+ const duration = messages.TimeConversion.millisecondsToDuration(endTiming());
63
+ let status;
64
+ let message;
66
65
  if (result === 'skipped') {
67
- testStepResult.status = status_1.default.SKIPPED;
66
+ status = messages.TestStepResultStatus.SKIPPED;
68
67
  }
69
68
  else if (result === 'pending') {
70
- testStepResult.status = status_1.default.PENDING;
69
+ status = messages.TestStepResultStatus.PENDING;
71
70
  }
72
71
  else if (value_checker_1.doesHaveValue(error)) {
73
- testStepResult.message = assertion_error_formatter_1.format(error);
74
- testStepResult.status = status_1.default.FAILED;
72
+ message = assertion_error_formatter_1.format(error);
73
+ status = messages.TestStepResultStatus.FAILED;
75
74
  }
76
75
  else {
77
- testStepResult.status = status_1.default.PASSED;
76
+ status = messages.TestStepResultStatus.PASSED;
78
77
  }
79
- return testStepResult;
78
+ return {
79
+ duration,
80
+ status,
81
+ message,
82
+ willBeRetried: false,
83
+ };
80
84
  }
81
85
  exports.run = run;
82
86
  exports.default = { run };
@@ -1 +1 @@
1
- {"version":3,"file":"step_runner.js","sourceRoot":"","sources":["../../src/runtime/step_runner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAAsB;AACtB,uDAA8B;AAC9B,gDAAsD;AACtD,2EAAgD;AAChD,iDAA6C;AAC7C,yEAAkD;AAGlD,oDAIyB;AAEzB,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,cAAI,CAAA;AAUhC,KAAK,UAAU,GAAG,CAAC,EACxB,cAAc,EACd,aAAa,EACb,IAAI,EACJ,cAAc,EACd,KAAK,GACO;IACZ,WAAW,EAAE,CAAA;IACb,IAAI,KAAU,EACZ,MAAiD,EACjD,cAA0C,CAAA;IAE5C,IAAI;QACF,cAAc,GAAG,MAAM,cAAc,CAAC,uBAAuB,CAAC;YAC5D,aAAa;YACb,IAAI;YACJ,KAAK;SACN,CAAC,CAAA;KACH;IAAC,OAAO,GAAG,EAAE;QACZ,KAAK,GAAG,GAAG,CAAA;KACZ;IAED,IAAI,gCAAgB,CAAC,KAAK,CAAC,EAAE;QAC3B,MAAM,qBAAqB,GAAG,8BAAc,CAC1C,cAAc,CAAC,OAAO,CAAC,OAAO,EAC9B,cAAc,CACf,CAAA;QAED,IACE,gBAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,EAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EACvE;YACA,MAAM,IAAI,GAAG,MAAM,0BAAc,CAAC,GAAG,CAAC;gBACpC,SAAS,EAAE,cAAc,CAAC,UAAU;gBACpC,EAAE,EAAE,cAAc,CAAC,IAAI;gBACvB,OAAO,EAAE,KAAK;gBACd,qBAAqB;aACtB,CAAC,CAAA;YACF,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;YAClB,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;SACrB;aAAM;YACL,KAAK,GAAG,cAAc,CAAC,2BAA2B,EAAE,CAAA;SACrD;KACF;IAED,MAAM,cAAc,GAAG,mBAAQ,CAAC,gBAAgB,CAAC,cAAc,CAAC,UAAU,CAAC;QACzE,QAAQ,EAAE,6BAAsB,CAAC,SAAS,EAAE,CAAC;KAC9C,CAAC,CAAA;IAEF,IAAI,MAAM,KAAK,SAAS,EAAE;QACxB,cAAc,CAAC,MAAM,GAAG,gBAAM,CAAC,OAAO,CAAA;KACvC;SAAM,IAAI,MAAM,KAAK,SAAS,EAAE;QAC/B,cAAc,CAAC,MAAM,GAAG,gBAAM,CAAC,OAAO,CAAA;KACvC;SAAM,IAAI,6BAAa,CAAC,KAAK,CAAC,EAAE;QAC/B,cAAc,CAAC,OAAO,GAAG,kCAAM,CAAC,KAAK,CAAC,CAAA;QACtC,cAAc,CAAC,MAAM,GAAG,gBAAM,CAAC,MAAM,CAAA;KACtC;SAAM;QACL,cAAc,CAAC,MAAM,GAAG,gBAAM,CAAC,MAAM,CAAA;KACtC;IAED,OAAO,cAAc,CAAA;AACvB,CAAC;AA5DD,kBA4DC;AAED,kBAAe,EAAE,GAAG,EAAE,CAAA","sourcesContent":["import _ from 'lodash'\nimport Status from '../status'\nimport Time, { millisecondsToDuration } from '../time'\nimport UserCodeRunner from '../user_code_runner'\nimport { messages } from '@cucumber/messages'\nimport { format } from 'assertion-error-formatter'\nimport { ITestCaseHookParameter } from '../support_code_library_builder/types'\nimport { IDefinition, IGetInvocationDataResponse } from '../models/definition'\nimport {\n doesHaveValue,\n doesNotHaveValue,\n valueOrDefault,\n} from '../value_checker'\n\nconst { beginTiming, endTiming } = Time\n\nexport interface IRunOptions {\n defaultTimeout: number\n hookParameter: ITestCaseHookParameter\n step: messages.Pickle.IPickleStep\n stepDefinition: IDefinition\n world: any\n}\n\nexport async function run({\n defaultTimeout,\n hookParameter,\n step,\n stepDefinition,\n world,\n}: IRunOptions): Promise<messages.TestStepFinished.ITestStepResult> {\n beginTiming()\n let error: any,\n result: messages.TestStepFinished.ITestStepResult,\n invocationData: IGetInvocationDataResponse\n\n try {\n invocationData = await stepDefinition.getInvocationParameters({\n hookParameter,\n step,\n world,\n })\n } catch (err) {\n error = err\n }\n\n if (doesNotHaveValue(error)) {\n const timeoutInMilliseconds = valueOrDefault(\n stepDefinition.options.timeout,\n defaultTimeout\n )\n\n if (\n _.includes(invocationData.validCodeLengths, stepDefinition.code.length)\n ) {\n const data = await UserCodeRunner.run({\n argsArray: invocationData.parameters,\n fn: stepDefinition.code,\n thisArg: world,\n timeoutInMilliseconds,\n })\n error = data.error\n result = data.result\n } else {\n error = invocationData.getInvalidCodeLengthMessage()\n }\n }\n\n const testStepResult = messages.TestStepFinished.TestStepResult.fromObject({\n duration: millisecondsToDuration(endTiming()),\n })\n\n if (result === 'skipped') {\n testStepResult.status = Status.SKIPPED\n } else if (result === 'pending') {\n testStepResult.status = Status.PENDING\n } else if (doesHaveValue(error)) {\n testStepResult.message = format(error)\n testStepResult.status = Status.FAILED\n } else {\n testStepResult.status = Status.PASSED\n }\n\n return testStepResult\n}\n\nexport default { run }\n"]}
1
+ {"version":3,"file":"step_runner.js","sourceRoot":"","sources":["../../src/runtime/step_runner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAAsB;AACtB,mDAA0B;AAC1B,2EAAgD;AAChD,6DAA8C;AAC9C,yEAAkD;AAGlD,oDAIyB;AAEzB,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,cAAI,CAAA;AAUhC,KAAK,UAAU,GAAG,CAAC,EACxB,cAAc,EACd,aAAa,EACb,IAAI,EACJ,cAAc,EACd,KAAK,GACO;IACZ,WAAW,EAAE,CAAA;IACb,IAAI,KAAU,EAAE,MAAW,EAAE,cAA0C,CAAA;IAEvE,IAAI;QACF,cAAc,GAAG,MAAM,cAAc,CAAC,uBAAuB,CAAC;YAC5D,aAAa;YACb,IAAI;YACJ,KAAK;SACN,CAAC,CAAA;KACH;IAAC,OAAO,GAAG,EAAE;QACZ,KAAK,GAAG,GAAG,CAAA;KACZ;IAED,IAAI,gCAAgB,CAAC,KAAK,CAAC,EAAE;QAC3B,MAAM,qBAAqB,GAAG,8BAAc,CAC1C,cAAc,CAAC,OAAO,CAAC,OAAO,EAC9B,cAAc,CACf,CAAA;QAED,IACE,gBAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,EAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EACvE;YACA,MAAM,IAAI,GAAG,MAAM,0BAAc,CAAC,GAAG,CAAC;gBACpC,SAAS,EAAE,cAAc,CAAC,UAAU;gBACpC,EAAE,EAAE,cAAc,CAAC,IAAI;gBACvB,OAAO,EAAE,KAAK;gBACd,qBAAqB;aACtB,CAAC,CAAA;YACF,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;YAClB,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;SACrB;aAAM;YACL,KAAK,GAAG,cAAc,CAAC,2BAA2B,EAAE,CAAA;SACrD;KACF;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,sBAAsB,CAAC,SAAS,EAAE,CAAC,CAAA;IAC5E,IAAI,MAAqC,CAAA;IACzC,IAAI,OAAe,CAAA;IACnB,IAAI,MAAM,KAAK,SAAS,EAAE;QACxB,MAAM,GAAG,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAA;KAC/C;SAAM,IAAI,MAAM,KAAK,SAAS,EAAE;QAC/B,MAAM,GAAG,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAA;KAC/C;SAAM,IAAI,6BAAa,CAAC,KAAK,CAAC,EAAE;QAC/B,OAAO,GAAG,kCAAM,CAAC,KAAK,CAAC,CAAA;QACvB,MAAM,GAAG,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAA;KAC9C;SAAM;QACL,MAAM,GAAG,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAA;KAC9C;IAED,OAAO;QACL,QAAQ;QACR,MAAM;QACN,OAAO;QACP,aAAa,EAAE,KAAK;KACrB,CAAA;AACH,CAAC;AA9DD,kBA8DC;AAED,kBAAe,EAAE,GAAG,EAAE,CAAA","sourcesContent":["import _ from 'lodash'\nimport Time from '../time'\nimport UserCodeRunner from '../user_code_runner'\nimport * as messages from '@cucumber/messages'\nimport { format } from 'assertion-error-formatter'\nimport { ITestCaseHookParameter } from '../support_code_library_builder/types'\nimport { IDefinition, IGetInvocationDataResponse } from '../models/definition'\nimport {\n doesHaveValue,\n doesNotHaveValue,\n valueOrDefault,\n} from '../value_checker'\n\nconst { beginTiming, endTiming } = Time\n\nexport interface IRunOptions {\n defaultTimeout: number\n hookParameter: ITestCaseHookParameter\n step: messages.PickleStep\n stepDefinition: IDefinition\n world: any\n}\n\nexport async function run({\n defaultTimeout,\n hookParameter,\n step,\n stepDefinition,\n world,\n}: IRunOptions): Promise<messages.TestStepResult> {\n beginTiming()\n let error: any, result: any, invocationData: IGetInvocationDataResponse\n\n try {\n invocationData = await stepDefinition.getInvocationParameters({\n hookParameter,\n step,\n world,\n })\n } catch (err) {\n error = err\n }\n\n if (doesNotHaveValue(error)) {\n const timeoutInMilliseconds = valueOrDefault(\n stepDefinition.options.timeout,\n defaultTimeout\n )\n\n if (\n _.includes(invocationData.validCodeLengths, stepDefinition.code.length)\n ) {\n const data = await UserCodeRunner.run({\n argsArray: invocationData.parameters,\n fn: stepDefinition.code,\n thisArg: world,\n timeoutInMilliseconds,\n })\n error = data.error\n result = data.result\n } else {\n error = invocationData.getInvalidCodeLengthMessage()\n }\n }\n\n const duration = messages.TimeConversion.millisecondsToDuration(endTiming())\n let status: messages.TestStepResultStatus\n let message: string\n if (result === 'skipped') {\n status = messages.TestStepResultStatus.SKIPPED\n } else if (result === 'pending') {\n status = messages.TestStepResultStatus.PENDING\n } else if (doesHaveValue(error)) {\n message = format(error)\n status = messages.TestStepResultStatus.FAILED\n } else {\n status = messages.TestStepResultStatus.PASSED\n }\n\n return {\n duration,\n status,\n message,\n willBeRetried: false,\n }\n}\n\nexport default { run }\n"]}