@amiceli/vitest-cucumber
Version:
vitest tools to use Gherkin feature in unit tests
85 lines (84 loc) • 3.17 kB
JavaScript
import { customExpressionRegEx } from '../../parser/expression/custom';
import { builtInExpressionRegEx, ExpressionStep, } from '../../parser/expression/ExpressionStep';
import { Step, } from '../../parser/models';
function compilePattern(pattern) {
const allExpressionRegEx = builtInExpressionRegEx.concat(customExpressionRegEx);
const hasExpressions = allExpressionRegEx.some((r) => pattern.includes(r.keyword));
if (!hasExpressions) {
return undefined;
}
let regexString = pattern;
const groupCount = {};
regexString = regexString.replace(/[?]/g, '\\$&');
for (const r of allExpressionRegEx) {
r.resetExpressionStates();
groupCount[r.groupName] = 0;
}
for (const r of allExpressionRegEx) {
regexString = regexString.replace(r.keywordRegex, (originalRegex) => {
groupCount[r.groupName] += 1;
return r.getRegex(groupCount[r.groupName], originalRegex);
});
}
regexString = `^${regexString}$`;
return {
regex: new RegExp(regexString, 'g'),
originalPattern: pattern,
};
}
export function defineSharedStep(type, name, scenarioStepCallback) {
const foundStep = new Step(type, name);
const compiledPattern = compilePattern(name);
return {
key: foundStep.getTitle(),
fn: scenarioStepCallback,
step: foundStep,
params: [
foundStep.dataTables.length > 0 ? foundStep.dataTables : null,
foundStep.docStrings,
].filter((p) => p !== null),
compiledPattern,
};
}
export function defineStepToTest(options) {
const { parent, stepDetails, stepType, scenarioStepCallback } = options;
const foundStep = parent.checkIfStepExists(stepType, stepDetails);
const params = ExpressionStep.matchStep(foundStep, stepDetails);
foundStep.isCalled = true;
return {
key: foundStep.getTitle(),
fn: scenarioStepCallback,
step: foundStep,
params: [
...params,
foundStep.dataTables.length > 0 ? foundStep.dataTables : null,
foundStep.docStrings,
].filter((p) => p !== null),
};
}
export function updatePredefinedStepsAccordingLevel(steps) {
const finallySteps = steps.rulePredefinedSteps;
finallySteps.push(...steps.featurePredefinedSteps.filter((featureStep) => {
return (finallySteps.find((s) => {
return (s.step.type === featureStep.step.type &&
s.step.details === featureStep.step.details);
}) === undefined);
}));
finallySteps.push(...steps.globallyPredefinedSteps.filter((globalStep) => {
return (finallySteps.find((s) => {
return (s.step.type === globalStep.step.type &&
s.step.details === globalStep.step.details);
}) === undefined);
}));
return finallySteps;
}
export function orderStepsToRun(parent, steps) {
const orderedSteps = [];
for (const step of parent.steps) {
const defineStep = steps.find((s) => s.step.matchStep(step));
if (defineStep) {
orderedSteps.push(defineStep);
}
}
return orderedSteps;
}