UNPKG

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
"use strict"; 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