node-libpng
Version:
Unofficial bindings for node to libpng.
196 lines (179 loc) • 6.25 kB
text/typescript
import { encode, writePngFile, writePngFileSync } from "..";
import { readFileSync } from "fs";
const someGradient = Buffer.alloc(256 * 256 * 3);
for (let x = 0; x < 256; ++x) {
for (let y = 0; y < 256; ++y) {
const index = (y * 256 + x) * 3;
someGradient[index + 0] = x;
someGradient[index + 1] = y;
someGradient[index + 2] = 0;
}
}
const someOrangeRectangle = Buffer.alloc(16 * 8 * 3);
for (let index = 0; index < someOrangeRectangle.length; index += 3) {
someOrangeRectangle[index + 0] = 255;
someOrangeRectangle[index + 1] = 128;
someOrangeRectangle[index + 2] = 64;
}
const someOpaqueSquare = Buffer.alloc(16 * 16 * 4);
for (let index = 0; index < someOpaqueSquare.length; index += 4) {
someOpaqueSquare[index + 0] = 64;
someOpaqueSquare[index + 1] = 128;
someOpaqueSquare[index + 2] = 64;
someOpaqueSquare[index + 3] = 128;
}
describe("encode", () => {
it("encodes a png", () => {
const encoded = encode(someGradient, {
width: 256,
height: 256,
});
expect(encoded.toString("hex")).toMatchSnapshot();
});
it("encodes a png with given compression level", () => {
const encoded = encode(someGradient, {
width: 256,
height: 256,
compressionLevel: 5,
});
expect(encoded.toString("hex")).toMatchSnapshot();
});
it("encodes a png with an alpha channel", () => {
const encoded = encode(someOpaqueSquare, {
width: 16,
height: 16,
});
expect(encoded.toString("hex")).toMatchSnapshot();
});
it("throws an error when trying to encode something which isn't a buffer", () => {
const options = {
width: 16,
height: 16,
};
expect(() => encode("something" as any, options)).toThrowErrorMatchingSnapshot();
});
[
{
width: 16,
height: 8,
},
].forEach(options => {
it(`encodes a PNG with ${JSON.stringify(options)} as options`, () => {
expect(encode(someOrangeRectangle, options).toString("hex")).toMatchSnapshot();
});
});
[
{
width: 20,
},
{},
null,
undefined,
"string",
{
width: "twenty",
height: 10,
},
{
width: 0,
height: 0,
},
{
width: 20,
height: 1.5,
},
{
width: 1.5,
height: 20,
},
{
width: 1000,
height: 1000,
},
{
width: 16,
height: 8,
compressionLevel: "x",
},
{
width: 16,
height: 8,
compressionLevel: 1.5,
},
{
width: 16,
height: 8,
compressionLevel: -1,
},
{
width: 16,
height: 8,
compressionLevel: 10,
},
].forEach(options => {
it(`throws an error with bad options ${JSON.stringify(options)}`, () => {
expect(() => encode(someOrangeRectangle, options as any)).toThrowErrorMatchingSnapshot();
});
});
});
describe("writePngFileSync", () => {
it("encodes a PNG and writes it to disk", () => {
const options = { width: 16, height: 8 };
const encoded = encode(someOrangeRectangle, options);
const path = `${__dirname}/../../tmp-write-sync.png`;
writePngFileSync(path, someOrangeRectangle, options);
const fromDisk = readFileSync(path);
expect(Array.from(fromDisk)).toEqual(Array.from(encoded));
});
});
describe("writePngFile", () => {
describe("using the Promise API", () => {
it("encodes a PNG and writes it to disk", async () => {
const options = { width: 16, height: 8 };
const encoded = encode(someOrangeRectangle, options);
const path = `${__dirname}/../../tmp-write-promise.png`;
await writePngFile(path, someOrangeRectangle, options);
const fromDisk = readFileSync(path);
expect(Array.from(fromDisk)).toEqual(Array.from(encoded));
});
it("rejects with an error when encoding failed", async () => {
const options = { width: 16, height: 8 };
const path = `${__dirname}/../../tmp-write-promise-error-encoding.png`;
expect(writePngFile(path, Buffer.alloc(2), options)).rejects.toMatchSnapshot();
});
it("rejects with an error when writing failed", async () => {
const options = { width: 16, height: 8 };
const path = `this-file/does/not/exist.png`;
expect(writePngFile(path, someOrangeRectangle, options)).rejects.toBeTruthy();
});
});
describe("using the callback API", () => {
it("encodes a PNG and writes it to disk", done => {
const options = { width: 16, height: 8 };
const encoded = encode(someOrangeRectangle, options);
const path = `${__dirname}/../../tmp-write-callback.png`;
writePngFile(path, someOrangeRectangle, options, error => {
expect(error).toBeNull();
const fromDisk = readFileSync(path);
expect(Array.from(fromDisk)).toEqual(Array.from(encoded));
done();
});
});
it("calls the callback with an error when encoding failed", done => {
const options = { width: 16, height: 8 };
const path = `${__dirname}/../../tmp-write-callback-error-encoding.png`;
writePngFile(path, Buffer.alloc(2), options, error => {
expect(error).toMatchSnapshot();
done();
});
});
it("calls the callback with an error when writing failed", done => {
const options = { width: 16, height: 8 };
const path = `this-file/does/not/exist.png`;
writePngFile(path, someOrangeRectangle, options, error => {
expect(error).toBeTruthy();
done();
});
});
});
});