@web/test-runner-visual-regression
Version:
Web test runner visual regression
111 lines • 4.02 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.visualDiffCommand = void 0;
const path_1 = __importDefault(require("path"));
const VisualRegressionError_js_1 = require("./VisualRegressionError.js");
function resolveImagePath(baseDir, name) {
const finalName = path_1.default.extname(name) ? name : `${name}.png`;
if (path_1.default.isAbsolute(finalName)) {
return finalName;
}
return path_1.default.join(baseDir, finalName);
}
function passesFailureThreshold({ diffPercentage, diffPixels }, { failureThresholdType, failureThreshold }) {
if (failureThresholdType === 'percent') {
return diffPercentage <= failureThreshold
? { passed: true }
: {
passed: false,
// if diff is suitably small, output raw value, otherwise to two decimal points.
// this avoids outputting a failure value of "0.00%"
message: `${diffPercentage < 0.005 ? diffPercentage : diffPercentage.toFixed(2)}%`,
};
}
if (failureThresholdType === 'pixel') {
return diffPixels <= failureThreshold
? { passed: true }
: { passed: false, message: `${diffPixels} pixels` };
}
throw new VisualRegressionError_js_1.VisualRegressionError(`Unrecognized failureThresholdType: ${failureThresholdType}`);
}
async function visualDiffCommand(options, image, name, { browser, testFile }) {
const baseDir = path_1.default.resolve(options.baseDir);
const baselineName = options.getBaselineName({ browser, name, testFile });
const baselineImage = await options.getBaseline({
filePath: resolveImagePath(baseDir, baselineName),
baseDir,
name: baselineName,
});
if (options.update) {
await options.saveBaseline({
filePath: resolveImagePath(baseDir, baselineName),
baseDir,
name: baselineName,
content: image,
});
return { diffPercentage: -1, passed: true };
}
const diffName = options.getDiffName({ browser, name, testFile });
const failedName = options.getFailedName({ browser, name, testFile });
const diffFilePath = resolveImagePath(baseDir, diffName);
const saveFailed = async () => {
await options.saveFailed({
filePath: resolveImagePath(baseDir, failedName),
baseDir,
name: failedName,
content: image,
});
};
const saveDiff = async () => {
await options.saveDiff({
filePath: diffFilePath,
baseDir,
name: diffName,
content: diffImage,
});
};
if (!baselineImage) {
await saveFailed();
return {
errorMessage: 'There was no baseline image to compare against.',
diffPercentage: -1,
passed: false,
};
}
const result = await options.getImageDiff({
name,
baselineImage,
image,
options: options.diffOptions,
});
const { error, diffImage } = result;
if (error) {
// The diff has failed, be sure to save the new image.
await saveFailed();
await saveDiff();
return {
passed: false,
errorMessage: error,
diffPercentage: -1,
};
}
const { passed, message } = passesFailureThreshold(result, options);
if (!passed) {
await saveDiff();
}
if (!passed || options.buildCache) {
await saveFailed();
}
return {
errorMessage: !passed
? `Visual diff failed. New screenshot is ${message} different.\nSee diff for details: ${diffFilePath}`
: undefined,
diffPercentage: -1,
passed,
};
}
exports.visualDiffCommand = visualDiffCommand;
//# sourceMappingURL=visualDiffCommand.js.map