import { expect, test, describe } from "vitest";
import { methods } from "./index.js";
import { createJimp } from "@jimp/core";
import { makeTestImage } from "@jimp/test-utils";
const jimp = createJimp({ plugins: [methods] });
describe("Autocrop", () => {
test("image with transparent surround color", async () => {
const imgSrc = jimp.fromBitmap(
makeTestImage(
" ",
" ◆◆ ",
" ◆▦▦◆ ",
" ◆▦▦▦▦◆ ",
" ◆▦▦◆ ",
" ◆◆ ",
" ",
),
);
expect(imgSrc.autocrop()).toMatchSnapshot();
});
test("image with opaque surround color", async () => {
const imgSrc = jimp.fromBitmap(
makeTestImage(
"▥▥▥▥▥▥▥▥▥▥",
"▥▥▥▥◆◆▥▥▥▥",
"▥▥▥◆▦▦◆▥▥▥",
"▥▥◆▦▦▦▦◆▥▥",
"▥▥▥◆▦▦◆▥▥▥",
"▥▥▥▥◆◆▥▥▥▥",
"▥▥▥▥▥▥▥▥▥▥",
),
);
expect(imgSrc.autocrop()).toMatchSnapshot();
});
test("image with one color border", async () => {
const imgSrc = jimp.fromBitmap(
makeTestImage(
"▥▥▥▥▥▥▥▥▥▥▥▥",
"▥▥▥▥▥▥▥▥▥▥▥▥",
"▥▥ ◆◆ ▥▥",
"▥▥ ◆▦▦◆ ▥▥",
"▥▥ ◆▦▦▦▦◆ ▥▥",
"▥▥ ◆▦▦◆ ▥▥",
"▥▥ ◆◆ ▥▥",
"▥▥▥▥▥▥▥▥▥▥▥▥",
"▥▥▥▥▥▥▥▥▥▥▥▥",
),
);
expect(imgSrc.autocrop()).toMatchSnapshot();
});
test("image border with small variation", async () => {
const imgSrc = jimp.fromBitmap(
makeTestImage(
"323232323232",
"232323232323",
"32 ◆◆ 32",
"23 ◆▦▦◆ 23",
"32 ◆▦▦▦▦◆ 32",
"23 ◆▦▦◆ 23",
"32 ◆◆ 32",
"232323232323",
"323232323232",
),
);
expect(imgSrc.clone().autocrop()).toMatchSnapshot();
expect(imgSrc.clone().autocrop(0.005)).toMatchSnapshot();
});
test("image border with small variation configured by options", async () => {
const imgSrc = jimp.fromBitmap(
makeTestImage(
"323232323232",
"232323232323",
"32 ◆◆ 32",
"23 ◆▦▦◆ 23",
"32 ◆▦▦▦▦◆ 32",
"23 ◆▦▦◆ 23",
"32 ◆◆ 32",
"232323232323",
"323232323232",
),
);
expect(imgSrc.clone().autocrop()).toMatchSnapshot();
expect(imgSrc.clone().autocrop({ tolerance: 0.005 })).toMatchSnapshot();
});
test("image without frame", async () => {
const imgSrc = jimp.fromBitmap(
makeTestImage(
"▥▥ ◆◆ ",
"▥▥ ◆▦▦◆ ",
"▥▥ ◆▦▦▦▦◆ ",
"▥▥ ◆▦▦◆ ",
"▥▥ ◆◆ ",
"▥▥▥▥▥▥▥▥▥▥",
"▥▥▥▥▥▥▥▥▥▥",
),
);
expect(imgSrc.autocrop({ cropOnlyFrames: false })).toMatchSnapshot();
});
test("image without frame configured by options", async () => {
const imgSrc = jimp.fromBitmap(
makeTestImage(
"▥▥ ◆◆ ",
"▥▥ ◆▦▦◆ ",
"▥▥ ◆▦▦▦▦◆ ",
"▥▥ ◆▦▦◆ ",
"▥▥ ◆◆ ",
"▥▥▥▥▥▥▥▥▥▥",
"▥▥▥▥▥▥▥▥▥▥",
),
);
expect(imgSrc.autocrop({ cropOnlyFrames: false })).toMatchSnapshot();
});
test("image with symmetric border configured by options", async () => {
const imgSrc = jimp.fromBitmap(
makeTestImage(
"▥▥▥▥▥▥▥▥▥▥▥▥▥▥",
"▥▥ ◆◆ ▥▥▥▥",
"▥▥ ◆▦▦◆ ▥▥▥▥",
"▥▥ ◆▦▦▦▦◆ ▥▥▥▥",
"▥▥ ◆▦▦◆ ▥▥▥▥",
"▥▥ ◆◆ ▥▥▥▥",
"▥▥▥▥▥▥▥▥▥▥▥▥▥▥",
"▥▥▥▥▥▥▥▥▥▥▥▥▥▥",
),
);
expect(imgSrc.autocrop({ cropSymmetric: true })).toMatchSnapshot();
});
test("image without frame and with symmetric border configured by options", async () => {
const imgSrc = jimp.fromBitmap(
makeTestImage(
"▥▥ ◆◆ ▥▥▥▥",
"▥▥ ◆▦▦◆ ▥▥▥▥",
"▥▥ ◆▦▦▦▦◆ ▥▥▥▥",
"▥▥ ◆▦▦◆ ▥▥▥▥",
"▥▥ ◆◆ ▥▥▥▥",
"▥▥▥▥▥▥▥▥▥▥▥▥▥▥",
"▥▥▥▥▥▥▥▥▥▥▥▥▥▥",
),
);
expect(
imgSrc.autocrop({ cropSymmetric: true, cropOnlyFrames: false }),
).toMatchSnapshot();
});
test("image without frame and with some border left", async () => {
const imgSrc = jimp.fromBitmap(
makeTestImage(
"323232323232",
"232323232323",
"32 ◆◆ 32",
"23 ◆▦▦◆ 23",
"32 ◆▦▦▦▦◆ 32",
"23 ◆▦▦◆ 23",
"32 ◆◆ 32",
"232323232323",
"323232323232",
),
);
expect(
imgSrc.autocrop({
tolerance: 0.005,
leaveBorder: 1,
}),
).toMatchSnapshot();
});
test('image not cropped given an out of bounds "leaveBorder" value ', async () => {
const imgSrc = jimp.fromBitmap(
makeTestImage(
"323232323232",
"232323232323",
"32 ◆◆ 32",
"23 ◆▦▦◆ 23",
"32 ◆▦▦▦▦◆ 32",
"23 ◆▦▦◆ 23",
"32 ◆◆ 32",
"232323232323",
"323232323232",
),
);
expect(
imgSrc.autocrop({
tolerance: 0.005,
leaveBorder: 100,
}),
).toMatchSnapshot();
});
test("image with top and bottom frame and leaveBorder", async () => {
const imgSrc = jimp.fromBitmap(
makeTestImage(
"▥▥▥▥▥▥▥▥",
"▥▥▥▥▥▥▥▥",
"▥▥▥▥▥▥▥▥",
" ◆◆ ",
" ◆▦▦◆ ",
" ◆▦▦▦▦◆ ",
" ◆▦▦◆ ",
" ◆◆ ",
"▥▥▥▥▥▥▥▥",
"▥▥▥▥▥▥▥▥",
"▥▥▥▥▥▥▥▥",
),
);
expect(
imgSrc.autocrop({
cropSymmetric: true,
cropOnlyFrames: false,
leaveBorder: 2,
}),
).toMatchSnapshot();
});
test("ignore sides north", async () => {
const imgSrc = jimp.fromBitmap(
makeTestImage(
" ",
" ◆◆ ",
" ◆▦▦◆ ",
" ◆▦▦▦▦◆ ",
" ◆▦▦◆ ",
" ◆◆ ",
" ",
),
);
expect(
imgSrc.autocrop({ cropOnlyFrames: false, ignoreSides: { north: true } }),
).toMatchSnapshot();
});
test("ignore sides south and west", async () => {
const imgSrc = jimp.fromBitmap(
makeTestImage(
" ",
" ◆◆ ",
" ◆▦▦◆ ",
" ◆▦▦▦▦◆ ",
" ◆▦▦◆ ",
" ◆◆ ",
" ",
),
);
expect(
imgSrc.autocrop({
cropOnlyFrames: false,
ignoreSides: { west: true, south: true },
}),
).toMatchSnapshot();
});
test("ignore sides east", async () => {
const imgSrc = jimp.fromBitmap(
makeTestImage(
" ",
" ◆◆ ",
" ◆▦▦◆ ",
" ◆▦▦▦▦◆ ",
" ◆▦▦◆ ",
" ◆◆ ",
" ",
),
);
expect(
imgSrc.autocrop({ cropOnlyFrames: false, ignoreSides: { east: true } }),
).toMatchSnapshot();
});
});