cucumber-protractor
Version:
POM CukeTractor - Bootstrap your cucumber tests with cucumber, protractor and a structured way of creating page objects and component objects
113 lines (90 loc) • 3.38 kB
JavaScript
// To gen snippets in project and in ide
// node scripts/generateSnippetsVSCode.js --genFiles
// To gen snippets just in ide
// node scripts/generateSnippetsVSCode.js --genFiles --justForIDE
const fs = require('fs');
const os = require('os');
const { argv } = require('yargs');
const givenSteps = require('../uiTestHelpers/stepDefinitions/commonGivenSteps');
const whenSteps = require('../uiTestHelpers/stepDefinitions/commonWhenSteps');
const thenSteps = require('../uiTestHelpers/stepDefinitions/commonThenSteps');
const placeholders = require('../placeholders');
let ideSnippetsFolder;
let ideInstalled = true;
const snippetsFolder = 'snippets/vscode';
if (!argv.justForIDE) {
if (!fs.existsSync('snippets')) {
fs.mkdirSync('snippets');
}
if (!fs.existsSync(snippetsFolder)) {
fs.mkdirSync(snippetsFolder);
}
}
try {
ideSnippetsFolder = `${os.homedir()}/Library/Application Support/Code/User/snippets`;
if (!fs.existsSync(ideSnippetsFolder)) {
fs.mkdirSync(ideSnippetsFolder);
}
} catch (e) {
console.log('VSCode not installed on your mac');
ideInstalled = false;
}
const snippetCodes = {};
/* eslint-disable indent */
const genSnippet = (matcher, code) => {
const snippet = `{
"Print to console": {
"prefix": "${code}",
"body": [
"${matcher.replace(/\((.*)\)/g, '$1')}"
],
"description": "${matcher.replace(/\((.*)\)/g, '$1')}"
}
}`;
/* eslint-enable indent */
if (!argv.justForIDE) {
fs.writeFileSync(`${snippetsFolder}/cuketractor-${code}.code-snippets`, snippet);
}
if (ideInstalled) {
fs.writeFileSync(`${ideSnippetsFolder}/cuketractor-${code}.code-snippets`, snippet);
}
};
const genSnippets = (steps, type) => {
if (!snippetCodes[type]) {
snippetCodes[type] = [];
}
steps.forEach((step) => {
const allPlaceholders = placeholders.join('|');
const matcherWithReplacedPlaceholders = step.matcher
.replace(new RegExp(`'(${allPlaceholders})'`), (m, p1) => `'\${1:${p1}\}'`)
.replace(new RegExp(`'(${allPlaceholders})'`), (m, p1) => `'\${2:${p1}\}'`)
.replace(new RegExp(`'(${allPlaceholders})'`), (m, p1) => `'\${3:${p1}\}'`)
.replace(new RegExp(`'(${allPlaceholders})'`), (m, p1) => `'\${4:${p1}\}'`)
.replace(/\(\?\:(.*)\)\?/g, '$1');
const zeroOrManyNotMatcher = /\((.*not.*)\)\*/g;
const newMatcher = step.matcher
.replace(/\(\?\:(.*)\)\?/g, (match, p1) =>
p1.replace(/([^ ]+)/, '_$1_'))
.replace(/\(\?\:(.*)\)/g, '$1');
const generatedCode = `${step.path ?
step.path.replace(/[./]*/g, '').replace(/^(actions|checks)/g, '') : 'die'}`;
const matcher = matcherWithReplacedPlaceholders
.replace(zeroOrManyNotMatcher, '')
.replace(/\((.*)\)\*/g, '$1');
const newCode = `${type}${step.code || generatedCode}`;
snippetCodes[type].push(newCode);
genSnippet(matcher, newCode);
if (newMatcher.match(zeroOrManyNotMatcher)) {
const newCode2 = `${type}not${step.code || generatedCode}`;
const matcher2 = matcherWithReplacedPlaceholders
.replace(/\((.*)\)\*/g, '$1');
snippetCodes[type].push(newCode2);
genSnippet(matcher2, newCode2);
}
// console.log(`${type}${step.code || generatedCode}`);
});
};
genSnippets(givenSteps, 'given');
genSnippets(whenSteps, 'when');
genSnippets(thenSteps, 'then');
module.exports = snippetCodes;