mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
test: add darkening regression tests for image enhancement
Tests verify well-exposed and bright-but-normal images are not darkened, all modes produce valid output, and intensity slider produces visibly different results.
This commit is contained in:
@@ -280,4 +280,55 @@ describe("applyCorrections pipeline (CLAHE + normalise + gamma)", () => {
|
|||||||
enhStats.channels[2].mean * 0.114;
|
enhStats.channels[2].mean * 0.114;
|
||||||
expect(Math.abs(enhLum - origLum)).toBeLessThan(origLum * 0.15);
|
expect(Math.abs(enhLum - origLum)).toBeLessThan(origLum * 0.15);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("does not darken a bright-but-normal image (exposure score ~55-65)", async () => {
|
||||||
|
const brightishBuffer = await sharp({
|
||||||
|
create: { width: 100, height: 100, channels: 3, background: { r: 160, g: 160, b: 160 } },
|
||||||
|
})
|
||||||
|
.png()
|
||||||
|
.toBuffer();
|
||||||
|
|
||||||
|
const analysis = await analyzeImage(brightishBuffer);
|
||||||
|
expect(analysis.scores.exposure).toBeGreaterThan(55);
|
||||||
|
expect(analysis.scores.exposure).toBeLessThan(70);
|
||||||
|
|
||||||
|
const enhanced = applyCorrections(sharp(brightishBuffer), analysis.corrections, "auto", 50, {});
|
||||||
|
const enhancedBuf = await enhanced.toBuffer();
|
||||||
|
const enhStats = await sharp(enhancedBuf).stats();
|
||||||
|
const origStats = await sharp(brightishBuffer).stats();
|
||||||
|
|
||||||
|
const origLum =
|
||||||
|
origStats.channels[0].mean * 0.299 +
|
||||||
|
origStats.channels[1].mean * 0.587 +
|
||||||
|
origStats.channels[2].mean * 0.114;
|
||||||
|
const enhLum =
|
||||||
|
enhStats.channels[0].mean * 0.299 +
|
||||||
|
enhStats.channels[1].mean * 0.587 +
|
||||||
|
enhStats.channels[2].mean * 0.114;
|
||||||
|
|
||||||
|
// Must NOT darken by more than 10%
|
||||||
|
expect(enhLum).toBeGreaterThan(origLum * 0.9);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("each enhancement mode produces output without crashing", async () => {
|
||||||
|
const modes = ["auto", "portrait", "landscape", "low-light", "food", "document"] as const;
|
||||||
|
for (const mode of modes) {
|
||||||
|
const analysis = await analyzeImage(PNG_200x150);
|
||||||
|
const enhanced = applyCorrections(sharp(PNG_200x150), analysis.corrections, mode, 50, {});
|
||||||
|
const buf = await enhanced.toBuffer();
|
||||||
|
expect(buf.length).toBeGreaterThan(0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it("intensity 100 produces a visibly different output from intensity 0", async () => {
|
||||||
|
const analysis = await analyzeImage(PNG_200x150);
|
||||||
|
|
||||||
|
const low = applyCorrections(sharp(PNG_200x150), analysis.corrections, "auto", 0, {});
|
||||||
|
const high = applyCorrections(sharp(PNG_200x150), analysis.corrections, "auto", 100, {});
|
||||||
|
|
||||||
|
const lowBuf = await low.toBuffer();
|
||||||
|
const highBuf = await high.toBuffer();
|
||||||
|
|
||||||
|
expect(Buffer.compare(lowBuf, highBuf)).not.toBe(0);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user