54 lines
1.4 KiB
JavaScript
54 lines
1.4 KiB
JavaScript
const assert = require("assert").strict
|
|
const {test} = require("supertape")
|
|
const {_convertImageStream} = require("./emoji-sheet")
|
|
const fs = require("fs")
|
|
const {Transform} = require("stream").Transform
|
|
|
|
/* c8 ignore next 7 */
|
|
function slow() {
|
|
if (process.argv.includes("--slow")) {
|
|
return test
|
|
} else {
|
|
return test.skip
|
|
}
|
|
}
|
|
|
|
class Meter extends Transform {
|
|
bytes = 0
|
|
|
|
_transform(chunk, encoding, cb) {
|
|
this.bytes += chunk.length
|
|
this.push(chunk)
|
|
cb()
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param {import("supertape").Test} t
|
|
* @param {string} path
|
|
* @param {number} totalSize
|
|
*/
|
|
async function runSingleTest(t, path, totalSize) {
|
|
const file = fs.createReadStream(path)
|
|
const meter = new Meter()
|
|
const p = file.pipe(meter)
|
|
const result = await _convertImageStream(p, () => {
|
|
file.pause()
|
|
file.emit("end")
|
|
})
|
|
t.equal(result.subarray(1, 4).toString("ascii"), "PNG", `result was not a PNG file: ${result.toString("base64")}`)
|
|
/* c8 ignore next 5 */
|
|
if (meter.bytes < totalSize / 4) { // should download less than 25% of each file
|
|
t.pass("intentionally read partial file")
|
|
} else {
|
|
t.fail(`read more than 25% of file, read: ${meter.bytes}, total: ${totalSize}`)
|
|
}
|
|
}
|
|
|
|
slow()("emoji-sheet: only partial file is read for APNG", async t => {
|
|
await runSingleTest(t, "test/res/butterfly.png", 2438998)
|
|
})
|
|
|
|
slow()("emoji-sheet: only partial file is read for GIF", async t => {
|
|
await runSingleTest(t, "test/res/butterfly.gif", 781223)
|
|
})
|