UNPKG

@progress/kendo-e2e

Version:

Kendo UI end-to-end test utilities.

192 lines (190 loc) 7.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.toMatchFromHtml = toMatchFromHtml; exports.toMatchSpec = toMatchSpec; exports.toMatchFromHtmlWithPassed = toMatchFromHtmlWithPassed; exports.toMatchSpecWithPassed = toMatchSpecWithPassed; exports.generateReport = generateReport; const _1 = require("."); function toMatchFromHtml(markup, expected, comparerOptions) { const result = (0, _1.compareHtml)(markup, expected, comparerOptions); const pass = result.passed.length > 0 && result.missing.length === 0 && result.extra.length === 0; return { pass, message: generateReport.bind(null, { comparerResult: result, }), }; } function toMatchSpec(markup, spec, specOptions, comparerOptions) { const expected = (0, _1.specToHtml)(spec, specOptions); return toMatchFromHtml(markup, expected, comparerOptions); } function toMatchFromHtmlWithPassed(markup, passed = 0, expected, comparerOptions) { const result = (0, _1.compareHtml)(markup, expected, comparerOptions); const pass = result.passed.length === passed && result.missing.length === 0 && result.extra.length === 0; return { pass, message: generateReport.bind(null, { comparerResult: result, passed: passed, }), }; } function toMatchSpecWithPassed(markup, passed = 0, spec, specOptions, comparerOptions) { const expected = (0, _1.specToHtml)(spec, specOptions); return toMatchFromHtmlWithPassed(markup, passed, expected, comparerOptions); } function generateReport({ comparerResult, passed }) { const allExpectedSelectors = comparerResult.expectedSelectors.reduce((acc, curr) => { return [...acc, ...curr.split(" ")]; }, []); const allActualSelectors = comparerResult.actualSelectors.reduce((acc, curr) => { return [...acc, ...curr.split(" ")]; }, []); const differentSelectors = findDifferences(comparerResult); const extra = comparerResult.extra .filter((sel) => differentSelectors.map((diff) => diff.actual).includes(sel) === false) .map((selector) => { const strippedSelector = stripSelector(selector, allExpectedSelectors); return [strippedSelector, selector]; }); const missing = comparerResult.missing .filter((sel) => differentSelectors .map((diff) => diff.expected) .includes(sel) === false) .map((selector) => { const strippedSelector = stripSelector(selector, allActualSelectors); return [strippedSelector, selector]; }); const passedFailedMessage = passed && passed !== comparerResult.passed.length ? `| ${Colors.FgRed}Expected: ${Colors.Bright}${passed}${Colors.Reset}` : ""; const passedMessage = `\n${Colors.FgYellow}Passed Selectors: ${comparerResult.passed.length} ${passedFailedMessage}`; const differenceMessage = generateDifferencesMsg(differentSelectors) || ""; const extraMessage = genExtraMsg(extra) || ""; const missingMessage = genMissingMsg(missing) || ""; const separator = `${Colors.FgYellow + Colors.Dim}${"-".repeat(50)}${Colors.Reset}`; const messages = [ passedMessage, differenceMessage, extraMessage, missingMessage, ] .map((msg) => msg ? `${msg}\n\n${Colors.FgYellow + Colors.Dim}${separator}` : "") .join("\n"); return `${Colors.FgYellow}Spec Reporter:\n${separator}${messages}${Colors.Reset}`; } function findDifferences(comparerResult) { const differentSelectors = []; let actualIdx = 0; let expectedIdx = 0; while (actualIdx < comparerResult.actualSelectors.length && expectedIdx < comparerResult.expectedSelectors.length) { if (comparerResult.extra.includes(comparerResult.actualSelectors[actualIdx]) && comparerResult.missing.includes(comparerResult.expectedSelectors[expectedIdx])) { differentSelectors.push(compareSelectors([ comparerResult.actualSelectors[actualIdx], comparerResult.expectedSelectors[expectedIdx], ])); actualIdx++; expectedIdx++; continue; } if (comparerResult.extra.includes(comparerResult.actualSelectors[actualIdx])) { actualIdx++; continue; } if (comparerResult.missing.includes(comparerResult.expectedSelectors[expectedIdx])) { expectedIdx++; continue; } actualIdx++; expectedIdx++; } return differentSelectors; } function compareSelectors([actual, expected]) { const actualParts = actual.split(" "); const expectedParts = expected.split(" "); const differentSelectors = actualParts.reduce((acc, curr, idx) => { if (curr !== expectedParts[idx]) { return [...acc, [curr, expectedParts[idx]]]; } return acc; }, []); return { actual, expected, differences: { actual: differentSelectors.map((diff) => diff[0]), expected: differentSelectors.map((diff) => diff[1]), }, }; } function stripSelector(selector, selectors) { return selector.split(" ").reduce((acc, curr) => { if (selectors.includes(curr)) { return acc; } return curr; }, ""); } function genExtraMsg(extra) { if (extra.length > 0) { return `${Colors.FgYellow}Extra Selectors Found: ${extra .map(([strippedSelector, extraSelector]) => `${Colors.Dim + Colors.FgYellow}${extraSelector.replace(strippedSelector, `${Colors.Reset}${Colors.Bright}${Colors.FgRed}${strippedSelector}`)}`) .join("\n\n")}`; } } function genMissingMsg(missing) { if (missing.length > 0) { return `${Colors.FgYellow}Missing Selectors Found: ${missing .map(([strippedSelector, missingSelector]) => `${Colors.Dim + Colors.FgYellow}${missingSelector.replace(strippedSelector, `${Colors.Reset}${Colors.Bright}${Colors.FgRed}${strippedSelector}`)}`) .join("\n\n")}`; } } function generateDifferencesMsg(differentSelectors) { if (differentSelectors.length > 0) { return `${Colors.FgYellow}Different Selectors Found (Actual/Expected): ${differentSelectors .map((diff) => ` ${Colors.Dim}${decorateParts(diff.actual, diff.differences.actual, Colors.FgRed)} ${Colors.Dim}${decorateParts(diff.expected, diff.differences.expected, Colors.FgYellow)} `) .join("\n-----")}`; } } function decorateParts(selector, parts, color) { let result; parts.forEach((part) => { result = selector.replace(part, `${Colors.Reset}${Colors.Bright}${color}${part}${Colors.Dim}${Colors.FgYellow}`); }); return result; } const Colors = { Reset: "\x1b[0m", Bright: "\x1b[1m", Dim: "\x1b[2m", Underscore: "\x1b[4m", Blink: "\x1b[5m", Reverse: "\x1b[7m", Hidden: "\x1b[8m", FgBlack: "\x1b[30m", FgRed: "\x1b[31m", FgGreen: "\x1b[32m", FgYellow: "\x1b[33m", FgBlue: "\x1b[34m", FgMagenta: "\x1b[35m", FgCyan: "\x1b[36m", FgWhite: "\x1b[37m", FgGray: "\x1b[90m", }; //# sourceMappingURL=matchers.js.map