UNPKG

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