@uuv/assistant
Version:
UUV Helper used to improve the life of testers and developers by generating cucumber phrases from the GUI.
129 lines (128 loc) • 7.25 kB
JavaScript
;
/**
* Software Name : UUV
*
* SPDX-License-Identifier: MIT
*
* This software is distributed under the MIT License,
* see the "LICENSE" file for more details
*
* Authors: NJAKO MOLOM Louis Fredice & SERVICAL Stanley
* Software description: Make test writing fast, understandable by any human
* understanding English or French.
*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ExpectTranslator = void 0;
const Commons_1 = require("../Commons");
const abstract_translator_1 = require("./abstract-translator");
const model_1 = require("./model");
const textual_translator_1 = require("./textual-translator");
const informative_nodes_helper_1 = require("../helper/informative-nodes-helper");
const dom_accessibility_api_1 = require("dom-accessibility-api");
const stepCase = model_1.StepCaseEnum.THEN;
class ExpectTranslator extends abstract_translator_1.Translator {
buildResponse(sentences) {
const response = this.initResponse();
response.steps = sentences.map(s => {
return {
keyword: stepCase,
sentence: s
};
});
return response;
}
getSentenceFromAccessibleRoleAndName(role, name) {
const key = "key.then.element.withRoleAndName";
const sentence = this.computeSentenceFromKeyRoleAndName(key, role, name);
return this.buildResponse([sentence]);
}
getSentenceFromAccessibleRoleAndNameAndContent(role, name, content) {
const isDisabled = this.selectedHtmlElem.classList.contains(Commons_1.UUV_DISABLED_CLASS);
const key = isDisabled ? "key.then.element.withRoleAndNameAndContentDisabled" : "key.then.element.withRoleAndNameAndContent";
const sentence = this.computeSentenceFromKeyRoleNameAndContent(key, role, name, content);
return this.buildResponse([sentence]);
}
getSentenceFromDomSelector(domSelector, htmlElem) {
const key = "key.then.element.withSelector";
const sentence = this.computeSentenceFromKeyAndSelector(key, domSelector);
return this.buildResponse([sentence]);
}
computeTableSentenceFromKeyNameAndContent(sentenceKey, indefiniteArticle, roleName, accessibleName, headers, rows, cellRoleName) {
var _a;
if (!sentenceKey) {
return "";
}
const baseSentence = this.dictionary.getRoleBasedSentencesTemplate().find((v) => v.key === sentenceKey);
const sentenceAvailable = `Then ${(_a = baseSentence === null || baseSentence === void 0 ? void 0 : baseSentence.wording) !== null && _a !== void 0 ? _a : ""}`
.replace("$indefiniteArticle", `${indefiniteArticle}`)
.replace("$roleName", `${roleName}`)
.replace("{string}", `"${accessibleName}"`)
.replace("{string}", "");
const headerValues = Array.from(headers.querySelectorAll("[role=columnheader], th")).map(c => (0, dom_accessibility_api_1.computeAccessibleName)(c));
const tableLines = ["| " + headerValues.join(" | ") + " |", "| " + headerValues.map(() => "---").join(" | ") + " |"];
rows.forEach(row => {
const values = Array.from(row.querySelectorAll(`[role=${cellRoleName}], td, [role=columnheader], th`)).map(c => {
if (c.classList.contains("ag-floating-filter")) {
return Array.from(c.querySelectorAll("[role=button]:not(.ag-hidden [role=button]), button:not(.ag-hidden button)")).reduce((accumulator, button) => accumulator + (accumulator.length > 0 ? " " : "") + (0, dom_accessibility_api_1.computeAccessibleName)(button), "");
}
return (0, dom_accessibility_api_1.computeAccessibleName)(c);
});
tableLines.push("| " + values.join(" | ") + " |");
});
return sentenceAvailable + "\n" + this.formatMarkdownTable(tableLines).join("\n");
}
computeDialogSentenceFromKeyNameAndContent(sentenceKey, accessibleName, row) {
return __awaiter(this, void 0, void 0, function* () {
const sentences = [`Then ${this.computeSentenceFromKeyRoleAndName(sentenceKey, "dialog", accessibleName)}`];
const getSentencesForNode = (node) => __awaiter(this, void 0, void 0, function* () {
if (textual_translator_1.TextualTranslator.isTextualNode(node)) {
const res = yield textual_translator_1.TextualTranslator.computeSentence(node);
return (0, model_1.getSentencesAsStringArray)(res);
}
const res = yield this.translate(node);
return (0, model_1.getSentencesAsStringArray)(res);
});
const handleElement = (element) => __awaiter(this, void 0, void 0, function* () {
if (element.children.length === 1) {
const informativeChildren = yield new informative_nodes_helper_1.InformativeNodesHelper().getAvailableChildren(element);
for (const child of informativeChildren) {
sentences.push(...(yield getSentencesForNode(child)));
}
}
else {
sentences.push(...(yield getSentencesForNode(element)));
}
});
yield Promise.all(Array.from(row.children).map(el => handleElement(el)));
return sentences;
});
}
formatMarkdownTable(lines) {
const headerLine = lines.find(line => !/^ *\|? *-+/.test(line));
const separatorLine = lines.find(line => /^ *\|? *-+/.test(line));
const dataLines = lines.filter(line => line !== headerLine && line !== separatorLine && line.trim());
const parse = (line) => line
.replace(/^\||\|$/g, "")
.split("|")
.map(cell => cell.trim());
const header = parse(headerLine);
const rows = dataLines.map(parse);
const colCount = Math.max(header.length, ...rows.map(r => r.length));
const colWidths = Array(colCount).fill(0);
[header, ...rows].forEach(r => r.forEach((cell, i) => (colWidths[i] = Math.max(colWidths[i], cell.length))));
const FORMAT_PREFFIX = " ";
const formatRow = (row) => FORMAT_PREFFIX + "| " + row.map((cell, i) => cell.padEnd(colWidths[i])).join(" | ") + " |";
const separator = FORMAT_PREFFIX + "| " + colWidths.map(w => "-".repeat(w)).join(" | ") + " |";
return [formatRow(header), separator, ...rows.map(formatRow)];
}
}
exports.ExpectTranslator = ExpectTranslator;