@recreatejs/jasmine-pixelmatch
Version:
HTML5 canvas visual regression tests for Jasmine using pixelmatch
67 lines (59 loc) • 2.03 kB
JavaScript
import { createCanvasFromImageData, getCanvas } from "./canvas-helpers";
import buildError from "./build-error";
import pixelmatch from "pixelmatch";
export default function toVisuallyEqual(util, customEqualityTesters) {
return {
compare(actual, expected) {
var result = {};
if (!expected) {
let actualCanvas = createCanvasFromImageData(actual);
result.message = buildError("No expected image defined", actualCanvas);
result.pass = false;
return result;
}
let width = expected.width;
let height = expected.height;
let diffCanvas = getCanvas(width, height);
let diffContext = diffCanvas.getContext("2d");
const diff = diffContext.createImageData(width, height);
try {
let differingPixels = pixelmatch(
expected.data,
actual.data,
diff.data,
width,
height,
{ threshold: 0.2, diffMask: true, alpha: 1, includeAA: false }
);
diffContext.putImageData(diff, 0, 0);
result.pass = differingPixels === 0;
if (!result.pass) {
let actualCanvas = createCanvasFromImageData(actual);
let expectedCanvas = createCanvasFromImageData(expected);
let totalPixels = width * height;
let percentDifference = (
(differingPixels / totalPixels) *
100
).toFixed(2);
let message = `Images have ${differingPixels}/${totalPixels} (${percentDifference}%) differing pixels`;
result.message = buildError(
message,
actualCanvas,
expectedCanvas,
diffCanvas
);
}
} catch (error) {
let actualCanvas = createCanvasFromImageData(actual);
let expectedCanvas = createCanvasFromImageData(expected);
result.pass = false;
result.message = buildError(
error.message,
actualCanvas,
expectedCanvas
);
}
return result;
}
};
}