@uuv/assistant
Version:
UUV Helper used to improve the life of testers and developers by generating cucumber phrases from the GUI.
158 lines (157 loc) • 8.63 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 __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
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 TextualTranslator = __importStar(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.sentences = sentences.map(s => stepCase + 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* () {
var _a, _b;
if (TextualTranslator.isTextualNode(node)) {
const res = yield TextualTranslator.computeSentence(node);
return (_a = res === null || res === void 0 ? void 0 : res.sentences) !== null && _a !== void 0 ? _a : [];
}
const res = yield this.translate(node);
return (_b = res === null || res === void 0 ? void 0 : res.sentences) !== null && _b !== void 0 ? _b : [];
});
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;