Skip to content

Commit

Permalink
test get* functions directly
Browse files Browse the repository at this point in the history
  • Loading branch information
gugu committed Nov 11, 2022
1 parent ee8ace9 commit c39ae7d
Show file tree
Hide file tree
Showing 11 changed files with 207 additions and 65 deletions.
147 changes: 123 additions & 24 deletions package-lock.json

Large diffs are not rendered by default.

10 changes: 7 additions & 3 deletions package.json
Expand Up @@ -54,7 +54,9 @@
"LICENSE"
],
"devDependencies": {
"@ava/typescript": "^3.0.1",
"@size-limit/preset-small-lib": "^8.1.0",
"@types/jsdom": "^20.0.1",
"@types/sharp": "^0.31.0",
"ava": "^5.0.1",
"benchmark": "^2.1.4",
Expand All @@ -69,10 +71,12 @@
"typescript": "^4.8.4"
},
"dependencies": {
"@ava/typescript": "^3.0.1",
"@types/jsdom": "^20.0.1",
"@types/diff": "^5.0.2",
"chalk": "^5.1.2",
"diff": "^5.1.0",
"jsdom": "^20.0.2",
"pdf-lib": "^1.17.1",
"sharp": "^0.31.2"
"sharp": "^0.31.2",
"xml-formatter": "^2.6.1"
}
}
6 changes: 3 additions & 3 deletions src/png.ts
Expand Up @@ -4,8 +4,8 @@ import { createSVG } from './svg.js';
import { getOptions } from "./utils.js";
import sharp from "sharp";

export async function getPNG(text: string, inOptions: ImageOptions) {
const options = getOptions(inOptions);
export async function getPNG(text: string, inOptions: ImageOptions = {}) {
const options = getOptions({...inOptions, type: 'png'});
const matrix = QR(text, options.ec_level, options.parse_url);
return generateImage({ matrix, ...options, type: 'png' });
}
Expand Down Expand Up @@ -34,7 +34,7 @@ export async function generateImage({
layers.push({
input: data,
})
qrImage.composite(layers);
}
qrImage.composite(layers);
return await qrImage.png().toBuffer();
}
2 changes: 1 addition & 1 deletion src/png_browser.ts
Expand Up @@ -76,7 +76,7 @@ export async function generateImage({
}
}
if (logo) {
const logoImage = await new Promise<HTMLImageElement>(async (resolve, reject) => {
const logoImage = await new Promise<HTMLImageElement>(async (resolve) => {
const image = new Image();
image.onload = () => resolve(image);
image.src = await blobToDataURL(new window.Blob([logo]));
Expand Down
4 changes: 2 additions & 2 deletions src/svg.ts
Expand Up @@ -7,8 +7,8 @@ interface FillSVGOptions
blockSize?: number;
}

export async function getSVG(text: string, inOptions: ImageOptions) {
const options = getOptions(inOptions);
export async function getSVG(text: string, inOptions: ImageOptions = {}) {
const options = getOptions({...inOptions, type: "svg"});
const matrix = QR(text, options.ec_level, options.parse_url);
return createSVG({ matrix, ...options });
}
Expand Down
25 changes: 17 additions & 8 deletions src/tests/_common.ts
Expand Up @@ -3,27 +3,36 @@ import looksSame from "looks-same";
import { readFile } from "node:fs/promises";
import { dirname } from "node:path";
import { fileURLToPath } from "node:url";
import * as diff from "diff";
import XMLFormatter from "xml-formatter";
import chalk from "chalk";
chalk.level = 3;

const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)

export const goldenDir = `${__dirname}/../../test_data/golden`;
export const generatedImageDir = `${__dirname}/../../test_data/generated`;

export const assertEqual = async (t: ExecutionContext<unknown>, type: string, filename: string) => {
if (type === "png") {
export const assertEqual = async (t: ExecutionContext<unknown>, filename: string) => {
if (filename.endsWith(".png")) {
const lsRes = await looksSame(
`${generatedImageDir}/${filename}`,
`${goldenDir}/${filename}`,
{ strict: true }
);
t.assert(lsRes.equal);
} else if (type !== "pdf") {
t.assert(
(await readFile(`${generatedImageDir}/${filename}`)).toString() ===
(await readFile(`${goldenDir}/${filename}`)).toString(),
`${filename} is not equal to golden`
);
} else if (!filename.endsWith("pdf")) {
const f1 = (await readFile(`${generatedImageDir}/${filename}`)).toString();
const f2 = (await readFile(`${goldenDir}/${filename}`)).toString();
if (f1 !== f2) {
for (const el of diff.diffLines(XMLFormatter(f1), XMLFormatter(f2), { newlineIsToken: true })) {
console.log(el.added ? chalk.bold.green(el.value) : chalk.bold.red(el.value));
};
t.fail();
} else {
t.pass();
}
} else {
t.pass();
}
Expand Down
3 changes: 2 additions & 1 deletion src/tests/browser.test.ts
Expand Up @@ -17,6 +17,7 @@ test.before(async () => {
global.Event = dom.window.Event;
global.FileReader = dom.window.FileReader;
global.Blob = dom.window.Blob;
global.atob = dom.window.atob;
global.navigator = dom.window.navigator;
})

Expand Down Expand Up @@ -140,6 +141,6 @@ const functions = {
...testData.params,
});
await writeFile(`${generatedImageDir}/browser_${testData.filename}`, Buffer.from(image));
await assertEqual(t, testData.type, testData.filename);
await assertEqual(t, testData.filename);
});
});
49 changes: 28 additions & 21 deletions src/tests/test.ts
@@ -1,8 +1,10 @@
import test from "ava";
import { readFile, writeFile } from "node:fs/promises";

import { getQRImage, QRImageOptions } from "../qr.js";
import type { ImageType } from "../typing/types.js";
import { getPNG } from "../png.js";
import { getSVG } from "../svg.js";
import { getPDF } from "../pdf.js";
import type { ImageOptions } from "../typing/types.js";
import { assertEqual, generatedImageDir, goldenDir } from "./_common.js";

const text = "I \u2764\uFE0F QR code!";
Expand All @@ -16,28 +18,34 @@ const defaultParams = {

interface TestParams {
name: string;
type: ImageType;
fn: typeof getPNG | typeof getPDF | typeof getSVG;
filename: string;
params: QRImageOptions;
params: ImageOptions;
}

([
{
name: "PNG",
type: "png",
fn: getPNG,
filename: "qr.png",
},
{
name: "PNG with empty options",
fn: getPNG,
filename: "qr_with_empty_options.png",
options: {},
},
{
name: "PNG with size",
type: "png",
fn: getPNG,
filename: "qr_with_size.png",
params: {
size: 9,
}
},
{
name: "PNG with colors",
type: "png",
fn: getPNG,
filename: "qr_with_colors.png",
params: {
color: 0x0000a0ff,
Expand All @@ -46,34 +54,34 @@ interface TestParams {
},
{
name: "PNG with logo",
type: "png",
fn: getPNG,
filename: "qr_with_logo.png",
params: { logo: await readFile(`${goldenDir}/logo.png`) },
},
{
name: "SVG",
type: "svg",
fn: getSVG,
filename: "qr.svg",
},
{
name: "SVG with EC level",
type: "svg",
fn: getSVG,
filename: "qr_with_ec_level.svg",
params: {
ec_level: "H",
},
},
{
name: "SVG with size",
type: "svg",
fn: getSVG,
filename: "qr_with_size.svg",
params: {
size: 6,
},
},
{
name: "SVG with colors",
type: "svg",
fn: getSVG,
filename: "qr_with_colors.svg",
params: {
color: 0xff0000ff,
Expand All @@ -82,51 +90,50 @@ interface TestParams {
},
{
name: "SVG with logo as buffer",
type: "svg",
fn: getSVG,
filename: "qr_with_logo.svg",
params: { logo: await readFile(`${goldenDir}/logo.png`) },
},
{
name: "SVG with logo as arraybuffer",
type: "svg",
fn: getSVG,
filename: "qr_with_logo_as_arraybuffer.svg",
params: {
logo: (await readFile(`${goldenDir}/logo.png`)).buffer,
},
},
{
name: "PDF",
type: "pdf",
fn: getPDF,
filename: "qr.pdf",
},
{
name: "PDF with colors",
type: "pdf",
fn: getPDF,
filename: "qr_with_colors.pdf",
params: { color: 0xff0000ff, bgColor: 0x00ff00ff },
},
{
name: "PDF with arraybuffer",
type: "pdf",
fn: getPDF,
filename: "qr_logo_arraybuffer.pdf",
params: {
logo: (await readFile(`${goldenDir}/logo.png`)).buffer,
},
},
{
name: "PDF with logo",
type: "pdf",
fn: getPDF,
filename: "qr_with_logo.pdf",
params: { logo: await readFile(`${goldenDir}/logo.png`) },
},
] as TestParams[]).forEach((testData) => {
test(testData.name, async (t) => {
const image = await getQRImage(text, {
type: testData.type,
const image = await testData.fn(text, {
...defaultParams,
...testData.params,
});
await writeFile(`${generatedImageDir}/${testData.filename}`, image);
await assertEqual(t, testData.type, testData.filename);
await assertEqual(t, testData.filename);
});
});
Binary file added test_data/golden/qr_with_empty_options.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion tsconfig.tsbuildinfo

Large diffs are not rendered by default.

24 changes: 23 additions & 1 deletion yarn.lock
Expand Up @@ -293,6 +293,11 @@
"resolved" "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz"
"version" "2.0.0"

"@types/diff@^5.0.2":
"integrity" "sha512-uw8eYMIReOwstQ0QKF0sICefSy8cNO/v7gOTiIy9SbwuHyEecJUm7qlgueOO5S1udZ5I/irVydHVwMchgzbKTg=="
"resolved" "https://registry.npmjs.org/@types/diff/-/diff-5.0.2.tgz"
"version" "5.0.2"

"@types/http-cache-semantics@^4.0.1":
"integrity" "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="
"resolved" "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz"
Expand Down Expand Up @@ -782,7 +787,7 @@
"ansi-styles" "^4.1.0"
"supports-color" "^7.1.0"

"chalk@^5.0.0", "chalk@^5.0.1":
"chalk@^5.0.0", "chalk@^5.0.1", "chalk@^5.1.2":
"integrity" "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ=="
"resolved" "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz"
"version" "5.1.2"
Expand Down Expand Up @@ -1241,6 +1246,11 @@
"resolved" "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz"
"version" "2.0.1"

"diff@^5.1.0":
"integrity" "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw=="
"resolved" "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz"
"version" "5.1.0"

"dir-glob@^3.0.1":
"integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="
"resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz"
Expand Down Expand Up @@ -4601,11 +4611,23 @@
"resolved" "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz"
"version" "5.1.0"

"xml-formatter@^2.6.1":
"integrity" "sha512-dOiGwoqm8y22QdTNI7A+N03tyVfBlQ0/oehAzxIZtwnFAHGeSlrfjF73YQvzSsa/Kt6+YZasKsrdu6OIpuBggw=="
"resolved" "https://registry.npmjs.org/xml-formatter/-/xml-formatter-2.6.1.tgz"
"version" "2.6.1"
dependencies:
"xml-parser-xo" "^3.2.0"

"xml-name-validator@^4.0.0":
"integrity" "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw=="
"resolved" "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz"
"version" "4.0.0"

"xml-parser-xo@^3.2.0":
"integrity" "sha512-8LRU6cq+d7mVsoDaMhnkkt3CTtAs4153p49fRo+HIB3I1FD1o5CeXRjRH29sQevIfVJIcPjKSsPU/+Ujhq09Rg=="
"resolved" "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-3.2.0.tgz"
"version" "3.2.0"

"xmlchars@^2.2.0":
"integrity" "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
"resolved" "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz"
Expand Down

0 comments on commit c39ae7d

Please sign in to comment.