might-cli
Version:
A no-code solution for performing frontend tests
60 lines (59 loc) • 2.08 kB
JavaScript
import jimp from 'jimp';
import looksSame from 'looks-same';
export async function difference(reference, current, tolerance, antialiasingTolerance) {
const opts = {
tolerance,
strict: false,
ignoreCaret: true,
ignoreAntialiasing: true,
antialiasingTolerance
};
const ref = await reference.getBufferAsync(jimp.MIME_PNG);
const cur = await current.getBufferAsync(jimp.MIME_PNG);
return new Promise((resolve, reject) => {
looksSame(ref, cur, opts, (err, result) => {
if (err) {
reject(err);
return;
}
if (!result.equal) {
looksSame.createDiff({
current: cur,
reference: ref,
highlightColor: '#FF00FF',
...opts
}, (err, buffer) => {
if (err) {
reject(err);
return;
}
resolve({
same: false,
differences: 1,
diffImage: detailedDifference(reference, current, buffer)
});
});
}
else {
resolve({
same: true
});
}
});
});
}
async function detailedDifference(reference, current, diffBuffer) {
const width = reference.getWidth();
const height = reference.getHeight();
const margin = Math.min(50, width * 0.15);
const diff = await jimp.read(diffBuffer);
const halfReference = reference.clone();
const final = await jimp.create((width * 2) + margin, (height * 2) + margin);
final.composite(current, 0, 0);
final.composite(reference, width + margin, 0);
halfReference.opacity(0.35);
final.composite(current, 0, height + margin);
final.composite(halfReference, 0, height + margin);
final.composite(diff, width + margin, height + margin);
return final.getBufferAsync(jimp.MIME_PNG);
}