@cucumber/cucumber 7.2.1 → 8.0.0-rc.1
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.
- package/README.md +11 -4
- package/lib/cli/argv_parser.d.ts +1 -2
- package/lib/cli/argv_parser.js +8 -12
- package/lib/cli/argv_parser.js.map +1 -1
- package/lib/cli/configuration_builder.d.ts +0 -1
- package/lib/cli/configuration_builder.js +20 -21
- package/lib/cli/configuration_builder.js.map +1 -1
- package/lib/cli/helpers.d.ts +1 -0
- package/lib/cli/helpers.js +49 -22
- package/lib/cli/helpers.js.map +1 -1
- package/lib/cli/i18n.js +6 -6
- package/lib/cli/i18n.js.map +1 -1
- package/lib/cli/index.d.ts +1 -1
- package/lib/cli/index.js +35 -29
- package/lib/cli/index.js.map +1 -1
- package/lib/cli/profile_loader.d.ts +3 -3
- package/lib/cli/profile_loader.js +17 -10
- package/lib/cli/profile_loader.js.map +1 -1
- package/lib/cli/publish_banner.js +1 -1
- package/lib/cli/publish_banner.js.map +1 -1
- package/lib/formatter/builder.d.ts +5 -4
- package/lib/formatter/builder.js +38 -52
- package/lib/formatter/builder.js.map +1 -1
- package/lib/formatter/get_color_fns.d.ts +6 -2
- package/lib/formatter/get_color_fns.js +18 -12
- package/lib/formatter/get_color_fns.js.map +1 -1
- package/lib/formatter/helpers/event_data_collector.d.ts +15 -17
- package/lib/formatter/helpers/event_data_collector.js +19 -12
- package/lib/formatter/helpers/event_data_collector.js.map +1 -1
- package/lib/formatter/helpers/formatters.d.ts +6 -0
- package/lib/formatter/helpers/formatters.js +41 -0
- package/lib/formatter/helpers/formatters.js.map +1 -0
- package/lib/formatter/helpers/gherkin_document_parser.d.ts +5 -6
- package/lib/formatter/helpers/gherkin_document_parser.js +24 -40
- package/lib/formatter/helpers/gherkin_document_parser.js.map +1 -1
- package/lib/formatter/helpers/issue_helpers.d.ts +6 -6
- package/lib/formatter/helpers/issue_helpers.js +6 -8
- package/lib/formatter/helpers/issue_helpers.js.map +1 -1
- package/lib/formatter/helpers/keyword_type.js +1 -5
- package/lib/formatter/helpers/keyword_type.js.map +1 -1
- package/lib/formatter/helpers/pickle_parser.d.ts +9 -10
- package/lib/formatter/helpers/pickle_parser.js +8 -17
- package/lib/formatter/helpers/pickle_parser.js.map +1 -1
- package/lib/formatter/helpers/step_argument_formatter.d.ts +2 -2
- package/lib/formatter/helpers/step_argument_formatter.js.map +1 -1
- package/lib/formatter/helpers/summary_helpers.d.ts +2 -2
- package/lib/formatter/helpers/summary_helpers.js +39 -20
- package/lib/formatter/helpers/summary_helpers.js.map +1 -1
- package/lib/formatter/helpers/test_case_attempt_formatter.js +34 -15
- package/lib/formatter/helpers/test_case_attempt_formatter.js.map +1 -1
- package/lib/formatter/helpers/test_case_attempt_parser.d.ts +5 -5
- package/lib/formatter/helpers/test_case_attempt_parser.js +30 -15
- package/lib/formatter/helpers/test_case_attempt_parser.js.map +1 -1
- package/lib/formatter/helpers/usage_helpers/index.d.ts +3 -3
- package/lib/formatter/helpers/usage_helpers/index.js +48 -45
- package/lib/formatter/helpers/usage_helpers/index.js.map +1 -1
- package/lib/formatter/html_formatter.d.ts +1 -0
- package/lib/formatter/html_formatter.js +2 -1
- package/lib/formatter/html_formatter.js.map +1 -1
- package/lib/formatter/http_stream.js +1 -1
- package/lib/formatter/http_stream.js.map +1 -1
- package/lib/formatter/index.d.ts +1 -0
- package/lib/formatter/index.js.map +1 -1
- package/lib/formatter/json_formatter.d.ts +22 -27
- package/lib/formatter/json_formatter.js +62 -30
- package/lib/formatter/json_formatter.js.map +1 -1
- package/lib/formatter/message_formatter.d.ts +1 -0
- package/lib/formatter/message_formatter.js +2 -1
- package/lib/formatter/message_formatter.js.map +1 -1
- package/lib/formatter/progress_bar_formatter.d.ts +7 -6
- package/lib/formatter/progress_bar_formatter.js +5 -4
- package/lib/formatter/progress_bar_formatter.js.map +1 -1
- package/lib/formatter/progress_formatter.d.ts +3 -2
- package/lib/formatter/progress_formatter.js +30 -10
- package/lib/formatter/progress_formatter.js.map +1 -1
- package/lib/formatter/rerun_formatter.d.ts +1 -0
- package/lib/formatter/rerun_formatter.js +33 -11
- package/lib/formatter/rerun_formatter.js.map +1 -1
- package/lib/formatter/snippets_formatter.d.ts +1 -0
- package/lib/formatter/snippets_formatter.js +22 -2
- package/lib/formatter/snippets_formatter.js.map +1 -1
- package/lib/formatter/step_definition_snippet_builder/index.d.ts +3 -3
- package/lib/formatter/step_definition_snippet_builder/index.js.map +1 -1
- package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js +3 -0
- package/lib/formatter/step_definition_snippet_builder/javascript_snippet_syntax.js.map +1 -1
- package/lib/formatter/step_definition_snippet_builder/snippet_syntax.d.ts +1 -1
- package/lib/formatter/step_definition_snippet_builder/snippet_syntax.js.map +1 -1
- package/lib/formatter/summary_formatter.d.ts +3 -2
- package/lib/formatter/summary_formatter.js +4 -4
- package/lib/formatter/summary_formatter.js.map +1 -1
- package/lib/formatter/usage_formatter.d.ts +1 -0
- package/lib/formatter/usage_formatter.js +24 -5
- package/lib/formatter/usage_formatter.js.map +1 -1
- package/lib/formatter/usage_json_formatter.d.ts +1 -0
- package/lib/formatter/usage_json_formatter.js +1 -0
- package/lib/formatter/usage_json_formatter.js.map +1 -1
- package/lib/importer.js +13 -0
- package/lib/index.d.ts +15 -12
- package/lib/index.js +6 -3
- package/lib/index.js.map +1 -1
- package/lib/models/data_table.d.ts +3 -4
- package/lib/models/data_table.js +9 -7
- package/lib/models/data_table.js.map +1 -1
- package/lib/models/definition.d.ts +2 -2
- package/lib/models/definition.js.map +1 -1
- package/lib/models/step_definition.js +1 -2
- package/lib/models/step_definition.js.map +1 -1
- package/lib/models/test_case_hook_definition.d.ts +2 -2
- package/lib/models/test_case_hook_definition.js.map +1 -1
- package/lib/models/test_step_hook_definition.d.ts +2 -2
- package/lib/models/test_step_hook_definition.js.map +1 -1
- package/lib/pickle_filter.d.ts +9 -11
- package/lib/pickle_filter.js +9 -9
- package/lib/pickle_filter.js.map +1 -1
- package/lib/runtime/assemble_test_cases.d.ts +13 -0
- package/lib/runtime/assemble_test_cases.js +88 -0
- package/lib/runtime/assemble_test_cases.js.map +1 -0
- package/lib/runtime/attachment_manager/index.d.ts +2 -2
- package/lib/runtime/attachment_manager/index.js +23 -4
- package/lib/runtime/attachment_manager/index.js.map +1 -1
- package/lib/runtime/helpers.d.ts +3 -2
- package/lib/runtime/helpers.js +36 -1
- package/lib/runtime/helpers.js.map +1 -1
- package/lib/runtime/index.d.ts +3 -4
- package/lib/runtime/index.js +27 -43
- package/lib/runtime/index.js.map +1 -1
- package/lib/runtime/parallel/command_types.d.ts +10 -9
- package/lib/runtime/parallel/command_types.js.map +1 -1
- package/lib/runtime/parallel/coordinator.d.ts +9 -9
- package/lib/runtime/parallel/coordinator.js +62 -55
- package/lib/runtime/parallel/coordinator.js.map +1 -1
- package/lib/runtime/parallel/worker.d.ts +2 -2
- package/lib/runtime/parallel/worker.js +23 -21
- package/lib/runtime/parallel/worker.js.map +1 -1
- package/lib/runtime/step_runner.d.ts +3 -3
- package/lib/runtime/step_runner.js +16 -14
- package/lib/runtime/step_runner.js.map +1 -1
- package/lib/runtime/stopwatch.d.ts +4 -4
- package/lib/runtime/stopwatch.js +21 -2
- package/lib/runtime/stopwatch.js.map +1 -1
- package/lib/runtime/test_case_runner.d.ts +51 -0
- package/lib/runtime/test_case_runner.js +253 -0
- package/lib/runtime/test_case_runner.js.map +1 -0
- package/lib/stack_trace_filter.js +4 -5
- package/lib/stack_trace_filter.js.map +1 -1
- package/lib/step_arguments.d.ts +4 -4
- package/lib/step_arguments.js.map +1 -1
- package/lib/support_code_library_builder/build_helpers.js +14 -10
- package/lib/support_code_library_builder/build_helpers.js.map +1 -1
- package/lib/support_code_library_builder/index.d.ts +9 -7
- package/lib/support_code_library_builder/index.js +10 -24
- package/lib/support_code_library_builder/index.js.map +1 -1
- package/lib/support_code_library_builder/types.d.ts +22 -23
- package/lib/support_code_library_builder/types.js.map +1 -1
- package/lib/support_code_library_builder/validate_arguments.js +14 -19
- package/lib/support_code_library_builder/validate_arguments.js.map +1 -1
- package/lib/support_code_library_builder/world.d.ts +7 -1
- package/lib/support_code_library_builder/world.js.map +1 -1
- package/lib/time.d.ts +3 -10
- package/lib/time.js +39 -48
- package/lib/time.js.map +1 -1
- package/lib/user_code_runner.js +7 -14
- package/lib/user_code_runner.js.map +1 -1
- package/lib/value_checker.d.ts +2 -2
- package/lib/value_checker.js.map +1 -1
- package/lib/wrapper.mjs +38 -0
- package/package.json +73 -64
- package/CHANGELOG.md +0 -1881
- package/lib/runtime/pickle_runner.d.ts +0 -67
- package/lib/runtime/pickle_runner.js +0 -305
- package/lib/runtime/pickle_runner.js.map +0 -1
- package/lib/status.d.ts +0 -3
- package/lib/status.js +0 -5
- package/lib/status.js.map +0 -1
- package/lib/support_code_library_builder/finalize_helpers.d.ts +0 -10
- package/lib/support_code_library_builder/finalize_helpers.js +0 -26
- package/lib/support_code_library_builder/finalize_helpers.js.map +0 -1
package/lib/pickle_filter.js
CHANGED
|
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.PickleTagFilter = exports.PickleNameFilter = exports.PickleLineFilter = void 0;
|
|
7
|
-
const lodash_1 = __importDefault(require("lodash"));
|
|
8
7
|
const path_1 = __importDefault(require("path"));
|
|
9
8
|
const tag_expressions_1 = __importDefault(require("@cucumber/tag-expressions"));
|
|
10
9
|
const gherkin_document_parser_1 = require("./formatter/helpers/gherkin_document_parser");
|
|
@@ -26,16 +25,15 @@ exports.default = PickleFilter;
|
|
|
26
25
|
class PickleLineFilter {
|
|
27
26
|
constructor(cwd, featurePaths = []) {
|
|
28
27
|
this.featureUriToLinesMapping = this.getFeatureUriToLinesMapping({
|
|
29
|
-
cwd,
|
|
30
28
|
featurePaths,
|
|
31
29
|
});
|
|
32
30
|
}
|
|
33
|
-
getFeatureUriToLinesMapping({
|
|
31
|
+
getFeatureUriToLinesMapping({ featurePaths, }) {
|
|
34
32
|
const mapping = {};
|
|
35
33
|
featurePaths.forEach((featurePath) => {
|
|
36
34
|
const match = FEATURE_LINENUM_REGEXP.exec(featurePath);
|
|
37
35
|
if (value_checker_1.doesHaveValue(match)) {
|
|
38
|
-
const uri = path_1.default.
|
|
36
|
+
const uri = path_1.default.normalize(match[1]);
|
|
39
37
|
const linesExpression = match[2];
|
|
40
38
|
if (value_checker_1.doesHaveValue(linesExpression)) {
|
|
41
39
|
if (value_checker_1.doesNotHaveValue(mapping[uri])) {
|
|
@@ -53,11 +51,13 @@ class PickleLineFilter {
|
|
|
53
51
|
return mapping;
|
|
54
52
|
}
|
|
55
53
|
matchesAnyLine({ gherkinDocument, pickle }) {
|
|
56
|
-
const
|
|
54
|
+
const uri = path_1.default.normalize(pickle.uri);
|
|
55
|
+
const linesToMatch = this.featureUriToLinesMapping[uri];
|
|
57
56
|
if (value_checker_1.doesHaveValue(linesToMatch)) {
|
|
58
57
|
const gherkinScenarioLocationMap = gherkin_document_parser_1.getGherkinScenarioLocationMap(gherkinDocument);
|
|
59
|
-
const pickleLines = pickle.astNodeIds.map((sourceId) => gherkinScenarioLocationMap[sourceId].line);
|
|
60
|
-
|
|
58
|
+
const pickleLines = new Set(pickle.astNodeIds.map((sourceId) => gherkinScenarioLocationMap[sourceId].line));
|
|
59
|
+
const linesIntersection = linesToMatch.filter((x) => pickleLines.has(x));
|
|
60
|
+
return linesIntersection.length > 0;
|
|
61
61
|
}
|
|
62
62
|
return true;
|
|
63
63
|
}
|
|
@@ -71,7 +71,7 @@ class PickleNameFilter {
|
|
|
71
71
|
if (this.names.length === 0) {
|
|
72
72
|
return true;
|
|
73
73
|
}
|
|
74
|
-
return
|
|
74
|
+
return this.names.some((name) => pickle.name.match(name));
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
exports.PickleNameFilter = PickleNameFilter;
|
|
@@ -85,7 +85,7 @@ class PickleTagFilter {
|
|
|
85
85
|
if (value_checker_1.doesNotHaveValue(this.tagExpressionNode)) {
|
|
86
86
|
return true;
|
|
87
87
|
}
|
|
88
|
-
return this.tagExpressionNode.evaluate(
|
|
88
|
+
return this.tagExpressionNode.evaluate(pickle.tags.map((x) => x.name));
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
exports.PickleTagFilter = PickleTagFilter;
|
package/lib/pickle_filter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pickle_filter.js","sourceRoot":"","sources":["../src/pickle_filter.ts"],"names":[],"mappings":";;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"pickle_filter.js","sourceRoot":"","sources":["../src/pickle_filter.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path'\nimport parse from '@cucumber/tag-expressions'\nimport { getGherkinScenarioLocationMap } from './formatter/helpers/gherkin_document_parser'\nimport { doesHaveValue, doesNotHaveValue } from './value_checker'\nimport * as messages from '@cucumber/messages'\nimport IGherkinDocument = messages.GherkinDocument\nimport IPickle = messages.Pickle\n\nconst FEATURE_LINENUM_REGEXP = /^(.*?)((?::[\\d]+)+)?$/\n\nexport interface IPickleFilterOptions {\n cwd: string\n featurePaths?: string[]\n names?: string[]\n tagExpression?: string\n}\n\nexport interface IMatchesAnyLineRequest {\n gherkinDocument: messages.GherkinDocument\n pickle: messages.Pickle\n}\n\nexport default class PickleFilter {\n private readonly lineFilter: PickleLineFilter\n private readonly nameFilter: PickleNameFilter\n private readonly tagFilter: PickleTagFilter\n\n constructor({\n cwd,\n featurePaths,\n names,\n tagExpression,\n }: IPickleFilterOptions) {\n this.lineFilter = new PickleLineFilter(cwd, featurePaths)\n this.nameFilter = new PickleNameFilter(names)\n this.tagFilter = new PickleTagFilter(tagExpression)\n }\n\n matches({\n gherkinDocument,\n pickle,\n }: {\n gherkinDocument: IGherkinDocument\n pickle: IPickle\n }): boolean {\n return (\n this.lineFilter.matchesAnyLine({ gherkinDocument, pickle }) &&\n this.nameFilter.matchesAnyName(pickle) &&\n this.tagFilter.matchesAllTagExpressions(pickle)\n )\n }\n}\n\nexport class PickleLineFilter {\n private readonly featureUriToLinesMapping: Record<string, number[]>\n\n constructor(cwd: string, featurePaths: string[] = []) {\n this.featureUriToLinesMapping = this.getFeatureUriToLinesMapping({\n featurePaths,\n })\n }\n\n getFeatureUriToLinesMapping({\n featurePaths,\n }: {\n featurePaths: string[]\n }): Record<string, number[]> {\n const mapping: Record<string, number[]> = {}\n featurePaths.forEach((featurePath) => {\n const match = FEATURE_LINENUM_REGEXP.exec(featurePath)\n if (doesHaveValue(match)) {\n const uri = path.normalize(match[1])\n const linesExpression = match[2]\n if (doesHaveValue(linesExpression)) {\n if (doesNotHaveValue(mapping[uri])) {\n mapping[uri] = []\n }\n linesExpression\n .slice(1)\n .split(':')\n .forEach((line) => {\n mapping[uri].push(parseInt(line))\n })\n }\n }\n })\n return mapping\n }\n\n matchesAnyLine({ gherkinDocument, pickle }: IMatchesAnyLineRequest): boolean {\n const uri = path.normalize(pickle.uri)\n const linesToMatch = this.featureUriToLinesMapping[uri]\n if (doesHaveValue(linesToMatch)) {\n const gherkinScenarioLocationMap =\n getGherkinScenarioLocationMap(gherkinDocument)\n const pickleLines = new Set(\n pickle.astNodeIds.map(\n (sourceId) => gherkinScenarioLocationMap[sourceId].line\n )\n )\n const linesIntersection = linesToMatch.filter((x) => pickleLines.has(x))\n return linesIntersection.length > 0\n }\n return true\n }\n}\n\nexport class PickleNameFilter {\n private readonly names: string[]\n\n constructor(names: string[] = []) {\n this.names = names\n }\n\n matchesAnyName(pickle: messages.Pickle): boolean {\n if (this.names.length === 0) {\n return true\n }\n return this.names.some((name) => pickle.name.match(name))\n }\n}\n\nexport class PickleTagFilter {\n private readonly tagExpressionNode: any // cucumber-tag-expressions does not export interface\n\n constructor(tagExpression: string) {\n if (doesHaveValue(tagExpression) && tagExpression !== '') {\n this.tagExpressionNode = parse(tagExpression)\n }\n }\n\n matchesAllTagExpressions(pickle: messages.Pickle): boolean {\n if (doesNotHaveValue(this.tagExpressionNode)) {\n return true\n }\n return this.tagExpressionNode.evaluate(pickle.tags.map((x) => x.name))\n }\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
3
|
+
import * as messages from '@cucumber/messages';
|
|
4
|
+
import { IdGenerator } from '@cucumber/messages';
|
|
5
|
+
import { ISupportCodeLibrary } from '../support_code_library_builder/types';
|
|
6
|
+
export declare type IAssembledTestCases = Record<string, messages.TestCase>;
|
|
7
|
+
export interface IAssembleTestCasesOptions {
|
|
8
|
+
eventBroadcaster: EventEmitter;
|
|
9
|
+
newId: IdGenerator.NewId;
|
|
10
|
+
pickles: messages.Pickle[];
|
|
11
|
+
supportCodeLibrary: ISupportCodeLibrary;
|
|
12
|
+
}
|
|
13
|
+
export declare function assembleTestCases({ eventBroadcaster, newId, pickles, supportCodeLibrary, }: IAssembleTestCasesOptions): Promise<IAssembledTestCases>;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.assembleTestCases = void 0;
|
|
4
|
+
const value_checker_1 = require("../value_checker");
|
|
5
|
+
async function assembleTestCases({ eventBroadcaster, newId, pickles, supportCodeLibrary, }) {
|
|
6
|
+
const result = {};
|
|
7
|
+
for (const pickle of pickles) {
|
|
8
|
+
const { id: pickleId } = pickle;
|
|
9
|
+
const testCaseId = newId();
|
|
10
|
+
const fromBeforeHooks = makeBeforeHookSteps({
|
|
11
|
+
supportCodeLibrary,
|
|
12
|
+
pickle,
|
|
13
|
+
newId,
|
|
14
|
+
});
|
|
15
|
+
const fromStepDefinitions = makeSteps({
|
|
16
|
+
pickle,
|
|
17
|
+
supportCodeLibrary,
|
|
18
|
+
newId,
|
|
19
|
+
});
|
|
20
|
+
const fromAfterHooks = makeAfterHookSteps({
|
|
21
|
+
supportCodeLibrary,
|
|
22
|
+
pickle,
|
|
23
|
+
newId,
|
|
24
|
+
});
|
|
25
|
+
const testCase = {
|
|
26
|
+
pickleId,
|
|
27
|
+
id: testCaseId,
|
|
28
|
+
testSteps: [
|
|
29
|
+
...fromBeforeHooks,
|
|
30
|
+
...fromStepDefinitions,
|
|
31
|
+
...fromAfterHooks,
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
eventBroadcaster.emit('envelope', { testCase });
|
|
35
|
+
result[pickleId] = testCase;
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
exports.assembleTestCases = assembleTestCases;
|
|
40
|
+
function makeAfterHookSteps({ supportCodeLibrary, pickle, newId, }) {
|
|
41
|
+
return supportCodeLibrary.afterTestCaseHookDefinitions
|
|
42
|
+
.slice(0)
|
|
43
|
+
.reverse()
|
|
44
|
+
.filter((hookDefinition) => hookDefinition.appliesToTestCase(pickle))
|
|
45
|
+
.map((hookDefinition) => ({
|
|
46
|
+
id: newId(),
|
|
47
|
+
hookId: hookDefinition.id,
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
50
|
+
function makeBeforeHookSteps({ supportCodeLibrary, pickle, newId, }) {
|
|
51
|
+
return supportCodeLibrary.beforeTestCaseHookDefinitions
|
|
52
|
+
.filter((hookDefinition) => hookDefinition.appliesToTestCase(pickle))
|
|
53
|
+
.map((hookDefinition) => ({
|
|
54
|
+
id: newId(),
|
|
55
|
+
hookId: hookDefinition.id,
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
function makeSteps({ pickle, supportCodeLibrary, newId, }) {
|
|
59
|
+
return pickle.steps.map((pickleStep) => {
|
|
60
|
+
const stepDefinitions = supportCodeLibrary.stepDefinitions.filter((stepDefinition) => stepDefinition.matchesStepName(pickleStep.text));
|
|
61
|
+
return {
|
|
62
|
+
id: newId(),
|
|
63
|
+
pickleStepId: pickleStep.id,
|
|
64
|
+
stepDefinitionIds: stepDefinitions.map((stepDefinition) => stepDefinition.id),
|
|
65
|
+
stepMatchArgumentsLists: stepDefinitions.map((stepDefinition) => {
|
|
66
|
+
const result = stepDefinition.expression.match(pickleStep.text);
|
|
67
|
+
return {
|
|
68
|
+
stepMatchArguments: result.map((arg) => {
|
|
69
|
+
return {
|
|
70
|
+
group: mapArgumentGroup(arg.group),
|
|
71
|
+
parameterTypeName: arg.parameterType.name,
|
|
72
|
+
};
|
|
73
|
+
}),
|
|
74
|
+
};
|
|
75
|
+
}),
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
function mapArgumentGroup(group) {
|
|
80
|
+
return {
|
|
81
|
+
start: group.start,
|
|
82
|
+
value: group.value,
|
|
83
|
+
children: value_checker_1.doesHaveValue(group.children)
|
|
84
|
+
? group.children.map((child) => mapArgumentGroup(child))
|
|
85
|
+
: undefined,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=assemble_test_cases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assemble_test_cases.js","sourceRoot":"","sources":["../../src/runtime/assemble_test_cases.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from 'events'\nimport * as messages from '@cucumber/messages'\nimport { IdGenerator } from '@cucumber/messages'\nimport { ISupportCodeLibrary } from '../support_code_library_builder/types'\nimport { Group } from '@cucumber/cucumber-expressions'\nimport { doesHaveValue } from '../value_checker'\n\nexport declare type IAssembledTestCases = Record<string, messages.TestCase>\n\nexport interface IAssembleTestCasesOptions {\n eventBroadcaster: EventEmitter\n newId: IdGenerator.NewId\n pickles: messages.Pickle[]\n supportCodeLibrary: ISupportCodeLibrary\n}\n\nexport async function assembleTestCases({\n eventBroadcaster,\n newId,\n pickles,\n supportCodeLibrary,\n}: IAssembleTestCasesOptions): Promise<IAssembledTestCases> {\n const result: IAssembledTestCases = {}\n for (const pickle of pickles) {\n const { id: pickleId } = pickle\n const testCaseId = newId()\n const fromBeforeHooks: messages.TestStep[] = makeBeforeHookSteps({\n supportCodeLibrary,\n pickle,\n newId,\n })\n const fromStepDefinitions: messages.TestStep[] = makeSteps({\n pickle,\n supportCodeLibrary,\n newId,\n })\n const fromAfterHooks: messages.TestStep[] = makeAfterHookSteps({\n supportCodeLibrary,\n pickle,\n newId,\n })\n const testCase: messages.TestCase = {\n pickleId,\n id: testCaseId,\n testSteps: [\n ...fromBeforeHooks,\n ...fromStepDefinitions,\n ...fromAfterHooks,\n ],\n }\n eventBroadcaster.emit('envelope', { testCase })\n result[pickleId] = testCase\n }\n return result\n}\n\nfunction makeAfterHookSteps({\n supportCodeLibrary,\n pickle,\n newId,\n}: {\n supportCodeLibrary: ISupportCodeLibrary\n pickle: messages.Pickle\n newId: IdGenerator.NewId\n}): messages.TestStep[] {\n return supportCodeLibrary.afterTestCaseHookDefinitions\n .slice(0)\n .reverse()\n .filter((hookDefinition) => hookDefinition.appliesToTestCase(pickle))\n .map((hookDefinition) => ({\n id: newId(),\n hookId: hookDefinition.id,\n }))\n}\n\nfunction makeBeforeHookSteps({\n supportCodeLibrary,\n pickle,\n newId,\n}: {\n supportCodeLibrary: ISupportCodeLibrary\n pickle: messages.Pickle\n newId: IdGenerator.NewId\n}): messages.TestStep[] {\n return supportCodeLibrary.beforeTestCaseHookDefinitions\n .filter((hookDefinition) => hookDefinition.appliesToTestCase(pickle))\n .map((hookDefinition) => ({\n id: newId(),\n hookId: hookDefinition.id,\n }))\n}\n\nfunction makeSteps({\n pickle,\n supportCodeLibrary,\n newId,\n}: {\n pickle: messages.Pickle\n supportCodeLibrary: ISupportCodeLibrary\n newId: () => string\n}): messages.TestStep[] {\n return pickle.steps.map((pickleStep) => {\n const stepDefinitions = supportCodeLibrary.stepDefinitions.filter(\n (stepDefinition) => stepDefinition.matchesStepName(pickleStep.text)\n )\n return {\n id: newId(),\n pickleStepId: pickleStep.id,\n stepDefinitionIds: stepDefinitions.map(\n (stepDefinition) => stepDefinition.id\n ),\n stepMatchArgumentsLists: stepDefinitions.map((stepDefinition) => {\n const result = stepDefinition.expression.match(pickleStep.text)\n return {\n stepMatchArguments: result.map((arg) => {\n return {\n group: mapArgumentGroup(arg.group),\n parameterTypeName: arg.parameterType.name,\n }\n }),\n }\n }),\n }\n })\n}\n\nfunction mapArgumentGroup(group: Group): messages.Group {\n return {\n start: group.start,\n value: group.value,\n children: doesHaveValue(group.children)\n ? group.children.map((child) => mapArgumentGroup(child))\n : undefined,\n }\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { Readable } from 'stream';
|
|
3
|
-
import
|
|
3
|
+
import * as messages from '@cucumber/messages';
|
|
4
4
|
export interface IAttachmentMedia {
|
|
5
|
-
encoding: messages.
|
|
5
|
+
encoding: messages.AttachmentContentEncoding;
|
|
6
6
|
contentType: string;
|
|
7
7
|
}
|
|
8
8
|
export interface IAttachment {
|
|
@@ -1,10 +1,29 @@
|
|
|
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
|
};
|
|
5
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
25
|
const is_stream_1 = __importDefault(require("is-stream"));
|
|
7
|
-
const
|
|
26
|
+
const messages = __importStar(require("@cucumber/messages"));
|
|
8
27
|
const value_checker_1 = require("../../value_checker");
|
|
9
28
|
class AttachmentManager {
|
|
10
29
|
constructor(onAttachment) {
|
|
@@ -32,13 +51,13 @@ class AttachmentManager {
|
|
|
32
51
|
}
|
|
33
52
|
if (mediaType.startsWith('base64:')) {
|
|
34
53
|
this.createStringAttachment(data, {
|
|
35
|
-
encoding:
|
|
54
|
+
encoding: messages.AttachmentContentEncoding.BASE64,
|
|
36
55
|
contentType: mediaType.replace('base64:', ''),
|
|
37
56
|
});
|
|
38
57
|
}
|
|
39
58
|
else {
|
|
40
59
|
this.createStringAttachment(data, {
|
|
41
|
-
encoding:
|
|
60
|
+
encoding: messages.AttachmentContentEncoding.IDENTITY,
|
|
42
61
|
contentType: mediaType,
|
|
43
62
|
});
|
|
44
63
|
}
|
|
@@ -49,7 +68,7 @@ class AttachmentManager {
|
|
|
49
68
|
}
|
|
50
69
|
createBufferAttachment(data, mediaType) {
|
|
51
70
|
this.createStringAttachment(data.toString('base64'), {
|
|
52
|
-
encoding:
|
|
71
|
+
encoding: messages.AttachmentContentEncoding.BASE64,
|
|
53
72
|
contentType: mediaType,
|
|
54
73
|
});
|
|
55
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/attachment_manager/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/attachment_manager/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,0DAAgC;AAEhC,6DAA8C;AAC9C,uDAAqE;AAoBrE,MAAqB,iBAAiB;IAGpC,YAAY,YAA6B;QACvC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;IAClC,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAA;IACvD,CAAC;IAED,MAAM,CACJ,IAAgC,EAChC,SAAkB,EAClB,QAAqB;QAErB,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACzB,IAAI,gCAAgB,CAAC,SAAS,CAAC,EAAE;gBAC/B,MAAM,KAAK,CAAC,8CAA8C,CAAC,CAAA;aAC5D;YACD,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;SAC7C;aAAM,IAAI,mBAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YAClC,IAAI,gCAAgB,CAAC,SAAS,CAAC,EAAE;gBAC/B,MAAM,KAAK,CAAC,8CAA8C,CAAC,CAAA;aAC5D;YACD,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;SAC9D;aAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YACnC,IAAI,gCAAgB,CAAC,SAAS,CAAC,EAAE;gBAC/B,SAAS,GAAG,YAAY,CAAA;aACzB;YACD,IAAI,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;gBACnC,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE;oBAChC,QAAQ,EAAE,QAAQ,CAAC,yBAAyB,CAAC,MAAM;oBACnD,WAAW,EAAE,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;iBAC9C,CAAC,CAAA;aACH;iBAAM;gBACL,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE;oBAChC,QAAQ,EAAE,QAAQ,CAAC,yBAAyB,CAAC,QAAQ;oBACrD,WAAW,EAAE,SAAS;iBACvB,CAAC,CAAA;aACH;SACF;aAAM;YACL,MAAM,KAAK,CACT,uEAAuE,CACxE,CAAA;SACF;IACH,CAAC;IAED,sBAAsB,CAAC,IAAY,EAAE,SAAiB;QACpD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YACnD,QAAQ,EAAE,QAAQ,CAAC,yBAAyB,CAAC,MAAM;YACnD,WAAW,EAAE,SAAS;SACvB,CAAC,CAAA;IACJ,CAAC;IAED,sBAAsB,CACpB,IAAc,EACd,SAAiB,EACjB,QAAoB;QAEpB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpD,MAAM,OAAO,GAAiB,EAAE,CAAA;YAChC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBACxB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC,CAAC,CAAA;YACF,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBAClB,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAA;gBAC9D,OAAO,EAAE,CAAA;YACX,CAAC,CAAC,CAAA;YACF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC1B,CAAC,CAAC,CAAA;QACF,IAAI,6BAAa,CAAC,QAAQ,CAAC,EAAE;YAC3B,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;SACjC;aAAM;YACL,OAAO,OAAO,CAAA;SACf;IACH,CAAC;IAED,sBAAsB,CAAC,IAAY,EAAE,KAAuB;QAC1D,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACpC,CAAC;CACF;AAjFD,oCAiFC","sourcesContent":["import isStream from 'is-stream'\nimport { Readable } from 'stream'\nimport * as messages from '@cucumber/messages'\nimport { doesHaveValue, doesNotHaveValue } from '../../value_checker'\n\nexport interface IAttachmentMedia {\n encoding: messages.AttachmentContentEncoding\n contentType: string\n}\n\nexport interface IAttachment {\n data: string\n media: IAttachmentMedia\n}\n\nexport type IAttachFunction = (attachment: IAttachment) => void\nexport type ICreateAttachment = (\n data: Buffer | Readable | string,\n mediaType?: string,\n callback?: () => void\n) => void | Promise<void>\nexport type ICreateLog = (text: string) => void | Promise<void>\n\nexport default class AttachmentManager {\n private readonly onAttachment: IAttachFunction\n\n constructor(onAttachment: IAttachFunction) {\n this.onAttachment = onAttachment\n }\n\n log(text: string): void | Promise<void> {\n return this.create(text, 'text/x.cucumber.log+plain')\n }\n\n create(\n data: Buffer | Readable | string,\n mediaType?: string,\n callback?: () => void\n ): void | Promise<void> {\n if (Buffer.isBuffer(data)) {\n if (doesNotHaveValue(mediaType)) {\n throw Error('Buffer attachments must specify a media type')\n }\n this.createBufferAttachment(data, mediaType)\n } else if (isStream.readable(data)) {\n if (doesNotHaveValue(mediaType)) {\n throw Error('Stream attachments must specify a media type')\n }\n return this.createStreamAttachment(data, mediaType, callback)\n } else if (typeof data === 'string') {\n if (doesNotHaveValue(mediaType)) {\n mediaType = 'text/plain'\n }\n if (mediaType.startsWith('base64:')) {\n this.createStringAttachment(data, {\n encoding: messages.AttachmentContentEncoding.BASE64,\n contentType: mediaType.replace('base64:', ''),\n })\n } else {\n this.createStringAttachment(data, {\n encoding: messages.AttachmentContentEncoding.IDENTITY,\n contentType: mediaType,\n })\n }\n } else {\n throw Error(\n 'Invalid attachment data: must be a buffer, readable stream, or string'\n )\n }\n }\n\n createBufferAttachment(data: Buffer, mediaType: string): void {\n this.createStringAttachment(data.toString('base64'), {\n encoding: messages.AttachmentContentEncoding.BASE64,\n contentType: mediaType,\n })\n }\n\n createStreamAttachment(\n data: Readable,\n mediaType: string,\n callback: () => void\n ): void | Promise<void> {\n const promise = new Promise<void>((resolve, reject) => {\n const buffers: Uint8Array[] = []\n data.on('data', (chunk) => {\n buffers.push(chunk)\n })\n data.on('end', () => {\n this.createBufferAttachment(Buffer.concat(buffers), mediaType)\n resolve()\n })\n data.on('error', reject)\n })\n if (doesHaveValue(callback)) {\n promise.then(callback, callback)\n } else {\n return promise\n }\n }\n\n createStringAttachment(data: string, media: IAttachmentMedia): void {\n this.onAttachment({ data, media })\n }\n}\n"]}
|
package/lib/runtime/helpers.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import StepDefinition from '../models/step_definition';
|
|
2
|
-
import
|
|
2
|
+
import * as messages from '@cucumber/messages';
|
|
3
3
|
import { IRuntimeOptions } from '.';
|
|
4
4
|
export declare function getAmbiguousStepException(stepDefinitions: StepDefinition[]): string;
|
|
5
|
-
export declare function retriesForPickle(pickle: messages.
|
|
5
|
+
export declare function retriesForPickle(pickle: messages.Pickle, options: IRuntimeOptions): number;
|
|
6
|
+
export declare function shouldCauseFailure(status: messages.TestStepResultStatus, options: IRuntimeOptions): boolean;
|
package/lib/runtime/helpers.js
CHANGED
|
@@ -1,13 +1,33 @@
|
|
|
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
|
};
|
|
5
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.retriesForPickle = exports.getAmbiguousStepException = void 0;
|
|
25
|
+
exports.shouldCauseFailure = exports.retriesForPickle = exports.getAmbiguousStepException = void 0;
|
|
7
26
|
const location_helpers_1 = require("../formatter/helpers/location_helpers");
|
|
8
27
|
const cli_table3_1 = __importDefault(require("cli-table3"));
|
|
9
28
|
const indent_string_1 = __importDefault(require("indent-string"));
|
|
10
29
|
const pickle_filter_1 = require("../pickle_filter");
|
|
30
|
+
const messages = __importStar(require("@cucumber/messages"));
|
|
11
31
|
function getAmbiguousStepException(stepDefinitions) {
|
|
12
32
|
const table = new cli_table3_1.default({
|
|
13
33
|
chars: {
|
|
@@ -56,4 +76,19 @@ function retriesForPickle(pickle, options) {
|
|
|
56
76
|
return 0;
|
|
57
77
|
}
|
|
58
78
|
exports.retriesForPickle = retriesForPickle;
|
|
79
|
+
function shouldCauseFailure(status, options) {
|
|
80
|
+
if (options.dryRun) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
const failureStatuses = [
|
|
84
|
+
messages.TestStepResultStatus.AMBIGUOUS,
|
|
85
|
+
messages.TestStepResultStatus.FAILED,
|
|
86
|
+
messages.TestStepResultStatus.UNDEFINED,
|
|
87
|
+
];
|
|
88
|
+
if (options.strict) {
|
|
89
|
+
failureStatuses.push(messages.TestStepResultStatus.PENDING);
|
|
90
|
+
}
|
|
91
|
+
return failureStatuses.includes(status);
|
|
92
|
+
}
|
|
93
|
+
exports.shouldCauseFailure = shouldCauseFailure;
|
|
59
94
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/runtime/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/runtime/helpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4EAAsE;AACtE,4DAA8B;AAC9B,kEAAwC;AACxC,oDAAkD;AAElD,6DAA8C;AAG9C,SAAgB,yBAAyB,CACvC,eAAiC;IAEjC,MAAM,KAAK,GAAG,IAAI,oBAAK,CAAC;QACtB,KAAK,EAAE;YACL,MAAM,EAAE,EAAE;YACV,aAAa,EAAE,EAAE;YACjB,YAAY,EAAE,EAAE;YAChB,cAAc,EAAE,EAAE;YAClB,IAAI,EAAE,EAAE;YACR,UAAU,EAAE,EAAE;YACd,GAAG,EAAE,EAAE;YACP,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,EAAE;YACT,WAAW,EAAE,EAAE;YACf,GAAG,EAAE,EAAE;YACP,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,EAAE;YACb,WAAW,EAAE,EAAE;SAChB;QACD,KAAK,EAAE;YACL,MAAM,EAAE,EAAE;YACV,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;SACnB;KACF,CAAC,CAAA;IACF,KAAK,CAAC,IAAI,CACR,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAA;QACjD,OAAO,CAAC,OAAO,EAAE,iCAAc,CAAC,cAAc,CAAC,CAAC,CAAA;IAClD,CAAC,CAAC,CACH,CAAA;IACD,OAAO,GAAG,kCAAkC,GAAG,IAAI,GAAG,uBAAY,CAChE,KAAK,CAAC,QAAQ,EAAE,EAChB,CAAC,CACF,EAAE,CAAA;AACL,CAAC;AArCD,8DAqCC;AAED,SAAgB,gBAAgB,CAC9B,MAAuB,EACvB,OAAwB;IAExB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAA;IAC7B,IAAI,OAAO,KAAK,CAAC,EAAE;QACjB,OAAO,CAAC,CAAA;KACT;IACD,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAA;IAC7C,IAAI,cAAc,KAAK,EAAE,EAAE;QACzB,OAAO,OAAO,CAAA;KACf;IACD,MAAM,eAAe,GAAG,IAAI,+BAAe,CAAC,cAAc,CAAC,CAAA;IAC3D,IAAI,eAAe,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE;QACpD,OAAO,OAAO,CAAA;KACf;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAjBD,4CAiBC;AAED,SAAgB,kBAAkB,CAChC,MAAqC,EACrC,OAAwB;IAExB,IAAI,OAAO,CAAC,MAAM,EAAE;QAClB,OAAO,KAAK,CAAA;KACb;IACD,MAAM,eAAe,GAAoC;QACvD,QAAQ,CAAC,oBAAoB,CAAC,SAAS;QACvC,QAAQ,CAAC,oBAAoB,CAAC,MAAM;QACpC,QAAQ,CAAC,oBAAoB,CAAC,SAAS;KACxC,CAAA;IACD,IAAI,OAAO,CAAC,MAAM,EAAE;QAClB,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAA;KAC5D;IACD,OAAO,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;AACzC,CAAC;AAhBD,gDAgBC","sourcesContent":["import { formatLocation } from '../formatter/helpers/location_helpers'\nimport Table from 'cli-table3'\nimport indentString from 'indent-string'\nimport { PickleTagFilter } from '../pickle_filter'\nimport StepDefinition from '../models/step_definition'\nimport * as messages from '@cucumber/messages'\nimport { IRuntimeOptions } from '.'\n\nexport function getAmbiguousStepException(\n stepDefinitions: StepDefinition[]\n): string {\n const table = new Table({\n chars: {\n bottom: '',\n 'bottom-left': '',\n 'bottom-mid': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n middle: ' - ',\n right: '',\n 'right-mid': '',\n top: '',\n 'top-left': '',\n 'top-mid': '',\n 'top-right': '',\n },\n style: {\n border: [],\n 'padding-left': 0,\n 'padding-right': 0,\n },\n })\n table.push(\n ...stepDefinitions.map((stepDefinition) => {\n const pattern = stepDefinition.pattern.toString()\n return [pattern, formatLocation(stepDefinition)]\n })\n )\n return `${'Multiple step definitions match:' + '\\n'}${indentString(\n table.toString(),\n 2\n )}`\n}\n\nexport function retriesForPickle(\n pickle: messages.Pickle,\n options: IRuntimeOptions\n): number {\n const retries = options.retry\n if (retries === 0) {\n return 0\n }\n const retryTagFilter = options.retryTagFilter\n if (retryTagFilter === '') {\n return retries\n }\n const pickleTagFilter = new PickleTagFilter(retryTagFilter)\n if (pickleTagFilter.matchesAllTagExpressions(pickle)) {\n return retries\n }\n return 0\n}\n\nexport function shouldCauseFailure(\n status: messages.TestStepResultStatus,\n options: IRuntimeOptions\n): boolean {\n if (options.dryRun) {\n return false\n }\n const failureStatuses: messages.TestStepResultStatus[] = [\n messages.TestStepResultStatus.AMBIGUOUS,\n messages.TestStepResultStatus.FAILED,\n messages.TestStepResultStatus.UNDEFINED,\n ]\n if (options.strict) {\n failureStatuses.push(messages.TestStepResultStatus.PENDING)\n }\n return failureStatuses.includes(status)\n}\n"]}
|
package/lib/runtime/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { EventDataCollector } from '../formatter/helpers';
|
|
3
|
-
import { IdGenerator
|
|
3
|
+
import { IdGenerator } from '@cucumber/messages';
|
|
4
|
+
import * as messages from '@cucumber/messages';
|
|
4
5
|
import { EventEmitter } from 'events';
|
|
5
6
|
import { ISupportCodeLibrary } from '../support_code_library_builder/types';
|
|
6
7
|
import TestRunHookDefinition from '../models/test_run_hook_definition';
|
|
@@ -14,7 +15,6 @@ export interface INewRuntimeOptions {
|
|
|
14
15
|
}
|
|
15
16
|
export interface IRuntimeOptions {
|
|
16
17
|
dryRun: boolean;
|
|
17
|
-
predictableIds: boolean;
|
|
18
18
|
failFast: boolean;
|
|
19
19
|
filterStacktraces: boolean;
|
|
20
20
|
retry: number;
|
|
@@ -34,7 +34,6 @@ export default class Runtime {
|
|
|
34
34
|
private success;
|
|
35
35
|
constructor({ eventBroadcaster, eventDataCollector, newId, options, pickleIds, supportCodeLibrary, }: INewRuntimeOptions);
|
|
36
36
|
runTestRunHooks(definitions: TestRunHookDefinition[], name: string): Promise<void>;
|
|
37
|
-
|
|
37
|
+
runTestCase(pickleId: string, testCase: messages.TestCase): Promise<void>;
|
|
38
38
|
start(): Promise<boolean>;
|
|
39
|
-
shouldCauseFailure(status: messages.TestStepFinished.TestStepResult.Status): boolean;
|
|
40
39
|
}
|
package/lib/runtime/index.js
CHANGED
|
@@ -1,46 +1,22 @@
|
|
|
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
|
-
};
|
|
21
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
4
|
};
|
|
24
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
const lodash_1 = __importStar(require("lodash"));
|
|
26
6
|
const helpers_1 = require("../formatter/helpers");
|
|
27
|
-
const bluebird_1 = __importDefault(require("bluebird"));
|
|
28
7
|
const stack_trace_filter_1 = __importDefault(require("../stack_trace_filter"));
|
|
29
|
-
const status_1 = __importDefault(require("../status"));
|
|
30
8
|
const user_code_runner_1 = __importDefault(require("../user_code_runner"));
|
|
31
9
|
const verror_1 = __importDefault(require("verror"));
|
|
32
10
|
const helpers_2 = require("./helpers");
|
|
33
|
-
const
|
|
34
|
-
const pickle_runner_1 = __importDefault(require("./pickle_runner"));
|
|
11
|
+
const test_case_runner_1 = __importDefault(require("./test_case_runner"));
|
|
35
12
|
const value_checker_1 = require("../value_checker");
|
|
36
13
|
const stopwatch_1 = require("./stopwatch");
|
|
14
|
+
const assemble_test_cases_1 = require("./assemble_test_cases");
|
|
37
15
|
class Runtime {
|
|
38
16
|
constructor({ eventBroadcaster, eventDataCollector, newId, options, pickleIds, supportCodeLibrary, }) {
|
|
39
17
|
this.eventBroadcaster = eventBroadcaster;
|
|
40
18
|
this.eventDataCollector = eventDataCollector;
|
|
41
|
-
this.stopwatch =
|
|
42
|
-
? new stopwatch_1.PredictableTestRunStopwatch()
|
|
43
|
-
: new stopwatch_1.RealTestRunStopwatch();
|
|
19
|
+
this.stopwatch = new stopwatch_1.RealTestRunStopwatch();
|
|
44
20
|
this.newId = newId;
|
|
45
21
|
this.options = options;
|
|
46
22
|
this.pickleIds = pickleIds;
|
|
@@ -52,7 +28,7 @@ class Runtime {
|
|
|
52
28
|
if (this.options.dryRun) {
|
|
53
29
|
return;
|
|
54
30
|
}
|
|
55
|
-
|
|
31
|
+
for (const hookDefinition of definitions) {
|
|
56
32
|
const { error } = await user_code_runner_1.default.run({
|
|
57
33
|
argsArray: [],
|
|
58
34
|
fn: hookDefinition.code,
|
|
@@ -63,25 +39,26 @@ class Runtime {
|
|
|
63
39
|
const location = helpers_1.formatLocation(hookDefinition);
|
|
64
40
|
throw new verror_1.default(error, `${name} hook errored, process exiting: ${location}`);
|
|
65
41
|
}
|
|
66
|
-
}
|
|
42
|
+
}
|
|
67
43
|
}
|
|
68
|
-
async
|
|
44
|
+
async runTestCase(pickleId, testCase) {
|
|
69
45
|
const pickle = this.eventDataCollector.getPickle(pickleId);
|
|
70
46
|
const retries = helpers_2.retriesForPickle(pickle, this.options);
|
|
71
47
|
const skip = this.options.dryRun || (this.options.failFast && !this.success);
|
|
72
|
-
const
|
|
48
|
+
const testCaseRunner = new test_case_runner_1.default({
|
|
73
49
|
eventBroadcaster: this.eventBroadcaster,
|
|
74
50
|
stopwatch: this.stopwatch,
|
|
75
51
|
gherkinDocument: this.eventDataCollector.getGherkinDocument(pickle.uri),
|
|
76
52
|
newId: this.newId,
|
|
77
53
|
pickle,
|
|
54
|
+
testCase,
|
|
78
55
|
retries,
|
|
79
56
|
skip,
|
|
80
57
|
supportCodeLibrary: this.supportCodeLibrary,
|
|
81
58
|
worldParameters: this.options.worldParameters,
|
|
82
59
|
});
|
|
83
|
-
const status = await
|
|
84
|
-
if (
|
|
60
|
+
const status = await testCaseRunner.run();
|
|
61
|
+
if (helpers_2.shouldCauseFailure(status, this.options)) {
|
|
85
62
|
this.success = false;
|
|
86
63
|
}
|
|
87
64
|
}
|
|
@@ -89,30 +66,37 @@ class Runtime {
|
|
|
89
66
|
if (this.options.filterStacktraces) {
|
|
90
67
|
this.stackTraceFilter.filter();
|
|
91
68
|
}
|
|
92
|
-
|
|
69
|
+
const testRunStarted = {
|
|
93
70
|
testRunStarted: {
|
|
94
71
|
timestamp: this.stopwatch.timestamp(),
|
|
95
72
|
},
|
|
96
|
-
}
|
|
73
|
+
};
|
|
74
|
+
this.eventBroadcaster.emit('envelope', testRunStarted);
|
|
97
75
|
this.stopwatch.start();
|
|
98
76
|
await this.runTestRunHooks(this.supportCodeLibrary.beforeTestRunHookDefinitions, 'a BeforeAll');
|
|
99
|
-
await
|
|
100
|
-
|
|
77
|
+
const assembledTestCases = await assemble_test_cases_1.assembleTestCases({
|
|
78
|
+
eventBroadcaster: this.eventBroadcaster,
|
|
79
|
+
newId: this.newId,
|
|
80
|
+
pickles: this.pickleIds.map((pickleId) => this.eventDataCollector.getPickle(pickleId)),
|
|
81
|
+
supportCodeLibrary: this.supportCodeLibrary,
|
|
82
|
+
});
|
|
83
|
+
for (const pickleId of this.pickleIds) {
|
|
84
|
+
await this.runTestCase(pickleId, assembledTestCases[pickleId]);
|
|
85
|
+
}
|
|
86
|
+
await this.runTestRunHooks(this.supportCodeLibrary.afterTestRunHookDefinitions.slice(0).reverse(), 'an AfterAll');
|
|
101
87
|
this.stopwatch.stop();
|
|
102
|
-
|
|
88
|
+
const testRunFinished = {
|
|
103
89
|
testRunFinished: {
|
|
104
90
|
timestamp: this.stopwatch.timestamp(),
|
|
91
|
+
success: this.success,
|
|
105
92
|
},
|
|
106
|
-
}
|
|
93
|
+
};
|
|
94
|
+
this.eventBroadcaster.emit('envelope', testRunFinished);
|
|
107
95
|
if (this.options.filterStacktraces) {
|
|
108
96
|
this.stackTraceFilter.unfilter();
|
|
109
97
|
}
|
|
110
98
|
return this.success;
|
|
111
99
|
}
|
|
112
|
-
shouldCauseFailure(status) {
|
|
113
|
-
return (lodash_1.default.includes([status_1.default.AMBIGUOUS, status_1.default.FAILED, status_1.default.UNDEFINED], status) ||
|
|
114
|
-
(status === status_1.default.PENDING && this.options.strict));
|
|
115
|
-
}
|
|
116
100
|
}
|
|
117
101
|
exports.default = Runtime;
|
|
118
102
|
//# sourceMappingURL=index.js.map
|
package/lib/runtime/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":";;;;;AAAA,kDAAyE;AACzE,+EAAoD;AACpD,2EAAgD;AAChD,oDAA2B;AAC3B,uCAAgE;AAGhE,0EAA+C;AAI/C,oDAAgE;AAChE,2CAAqE;AACrE,+DAAyD;AAqBzD,MAAqB,OAAO;IAW1B,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,EACL,OAAO,EACP,SAAS,EACT,kBAAkB,GACC;QACnB,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAA;QACxC,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAA;QAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,gCAAoB,EAAE,CAAA;QAC3C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,gBAAgB,GAAG,IAAI,4BAAgB,EAAE,CAAA;QAC9C,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAA;QAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,WAAoC,EACpC,IAAY;QAEZ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACvB,OAAM;SACP;QACD,KAAK,MAAM,cAAc,IAAI,WAAW,EAAE;YACxC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,0BAAc,CAAC,GAAG,CAAC;gBACzC,SAAS,EAAE,EAAE;gBACb,EAAE,EAAE,cAAc,CAAC,IAAI;gBACvB,OAAO,EAAE,IAAI;gBACb,qBAAqB,EAAE,8BAAc,CACnC,cAAc,CAAC,OAAO,CAAC,OAAO,EAC9B,IAAI,CAAC,kBAAkB,CAAC,cAAc,CACvC;aACF,CAAC,CAAA;YACF,IAAI,6BAAa,CAAC,KAAK,CAAC,EAAE;gBACxB,MAAM,QAAQ,GAAG,wBAAc,CAAC,cAAc,CAAC,CAAA;gBAC/C,MAAM,IAAI,gBAAM,CACd,KAAK,EACL,GAAG,IAAI,mCAAmC,QAAQ,EAAE,CACrD,CAAA;aACF;SACF;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CACf,QAAgB,EAChB,QAA2B;QAE3B,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QAC1D,MAAM,OAAO,GAAG,0BAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC5E,MAAM,cAAc,GAAG,IAAI,0BAAc,CAAC;YACxC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,eAAe,EAAE,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC;YACvE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM;YACN,QAAQ;YACR,OAAO;YACP,IAAI;YACJ,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe;SAC9C,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,CAAA;QACzC,IAAI,4BAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;YAC5C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;SACrB;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE;YAClC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAA;SAC/B;QACD,MAAM,cAAc,GAAsB;YACxC,cAAc,EAAE;gBACd,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE;aACtC;SACF,CAAA;QACD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;QACtD,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;QACtB,MAAM,IAAI,CAAC,eAAe,CACxB,IAAI,CAAC,kBAAkB,CAAC,4BAA4B,EACpD,aAAa,CACd,CAAA;QACD,MAAM,kBAAkB,GAAG,MAAM,uCAAiB,CAAC;YACjD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CACvC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAC5C;YACD,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;SAC5C,CAAC,CAAA;QACF,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;YACrC,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAA;SAC/D;QACD,MAAM,IAAI,CAAC,eAAe,CACxB,IAAI,CAAC,kBAAkB,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EACtE,aAAa,CACd,CAAA;QACD,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QACrB,MAAM,eAAe,GAAsB;YACzC,eAAe,EAAE;gBACf,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE;gBACrC,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB;SACF,CAAA;QACD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAA;QACvD,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE;YAClC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAA;SACjC;QACD,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;CACF;AA7HD,0BA6HC","sourcesContent":["import { EventDataCollector, formatLocation } from '../formatter/helpers'\nimport StackTraceFilter from '../stack_trace_filter'\nimport UserCodeRunner from '../user_code_runner'\nimport VError from 'verror'\nimport { retriesForPickle, shouldCauseFailure } 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 { ITestRunStopwatch, RealTestRunStopwatch } 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 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 = 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 for (const hookDefinition of definitions) {\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 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 (shouldCauseFailure(status, this.options)) {\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 for (const pickleId of this.pickleIds) {\n await this.runTestCase(pickleId, assembledTestCases[pickleId])\n }\n await this.runTestRunHooks(\n this.supportCodeLibrary.afterTestRunHookDefinitions.slice(0).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"]}
|