gpc-scenario-outline-numbering
Version:
This precompiler can add numbering column to Examples tables, and apply formatting to the name of the Scenario Outline.
77 lines • 3.22 kB
JavaScript
;
const gherkin_ast_1 = require("gherkin-ast");
// eslint-disable-next-line @typescript-eslint/no-var-requires
const ObjectSet = require('object-set-type');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const debug = require("debug")("gpc:scenario-outline-numbering");
const DEFAULT_CONFIG = {
addParameters: false,
parameterDelimiter: ',',
parameterFormat: '${name} - ${parameters}',
addNumbering: true,
numberingFormat: '${i} - ${name}',
strictNaming: false
};
const NUMBERING_COLUMN = 'num';
class ScenarioOutlineNumbering {
constructor(config) {
this.config = Object.assign(Object.assign({}, DEFAULT_CONFIG), (config || {}));
if (!(this.config.numberingFormat && this.config.parameterFormat)) {
throw new Error("The numberingFormat and parameterFormat parameters must have a value.");
}
}
onScenarioOutline(scenarioOutline) {
debug("Processing ScenarioOutline: %s", scenarioOutline.name);
if (this.config.addNumbering) {
scenarioOutline.name = this.config.numberingFormat
.replace(/\$\{i\}/g, `<${NUMBERING_COLUMN}>`)
.replace(/\$\{name\}/g, scenarioOutline.name);
}
if (this.config.addParameters) {
let allColumns = new ObjectSet();
scenarioOutline.examples.forEach((examples) => {
examples.header.cells.forEach((cell) => {
allColumns.add(cell);
});
});
let allColumnNames = Array.from(allColumns)
.map((column) => `<${column.value}>`)
.join(this.config.parameterDelimiter);
scenarioOutline.name = this.config.parameterFormat
.replace(/\$\{parameters\}/g, allColumnNames)
.replace(/\$\{name\}/g, scenarioOutline.name);
}
return scenarioOutline;
}
onExampleHeader(header) {
debug("Processing ExampleHeader: %o", header);
header.cells.unshift(new gherkin_ast_1.TableCell(NUMBERING_COLUMN));
}
onExampleRow(row, i) {
debug("Processing ExampleRow: %o", row);
row.cells.unshift(new gherkin_ast_1.TableCell(String(i + 1)));
}
onExamples(examples, scenarioOutline) {
debug("Processing Examples: %s", examples.name);
if (this.config.addNumbering) {
const fieldExists = examples.header.cells.some((cell) => {
return cell.value === NUMBERING_COLUMN;
});
if (fieldExists && this.config.strictNaming) {
throw new Error(`The default numbering field already exists in Scenario Outline: ${scenarioOutline.name}`);
}
else if (fieldExists) {
console.warn(`The default numbering field already exists in Scenario Outline: ${scenarioOutline.name}`);
}
else {
this.onExampleHeader(examples.header);
examples.body.forEach((row, i) => {
this.onExampleRow(row, i);
});
}
}
return examples;
}
}
module.exports = ScenarioOutlineNumbering;
//# sourceMappingURL=index.js.map