visual-journal / scripts /image-dimensions.test.mjs
misonL's picture
Deploy e9050df to Docker Space
a51c565 verified
Raw
History Blame Contribute Delete
3.86 kB
import { readImageDimensions } from '../skills/gpt-image-playground-agent/scripts/lib/image-dimensions.mjs';
import assert from 'node:assert/strict';
import { test } from 'node:test';
test('readImageDimensions reads PNG dimensions', () => {
assert.deepEqual(readImageDimensions(pngBuffer(3840, 2160)), { width: 3840, height: 2160 });
});
test('readImageDimensions reads JPEG dimensions', () => {
assert.deepEqual(readImageDimensions(jpegBuffer(1280, 720)), { width: 1280, height: 720 });
});
test('readImageDimensions reads progressive JPEG dimensions', () => {
assert.deepEqual(readImageDimensions(jpegBuffer(1600, 900, 0xc2)), { width: 1600, height: 900 });
});
test('readImageDimensions reads WebP VP8X dimensions', () => {
assert.deepEqual(readImageDimensions(webpVp8xBuffer(1024, 1024)), { width: 1024, height: 1024 });
});
test('readImageDimensions reads WebP VP8L dimensions', () => {
assert.deepEqual(readImageDimensions(webpVp8lBuffer(512, 768)), { width: 512, height: 768 });
});
test('readImageDimensions reads WebP VP8 dimensions', () => {
assert.deepEqual(readImageDimensions(webpVp8Buffer(640, 360)), { width: 640, height: 360 });
});
test('readImageDimensions rejects empty buffers', () => {
assert.throws(() => readImageDimensions(Buffer.alloc(0)), /图片数据为空/);
});
test('readImageDimensions rejects unknown formats', () => {
assert.throws(() => readImageDimensions(Buffer.from('not-an-image')), /无法识别图片格式/);
});
test('readImageDimensions rejects truncated PNG buffers', () => {
assert.throws(() => readImageDimensions(pngBuffer(1, 1).subarray(0, 16)), /PNG 图片数据截断/);
});
test('readImageDimensions rejects truncated JPEG buffers', () => {
assert.throws(() => readImageDimensions(Buffer.from([0xff, 0xd8, 0xff, 0xc0, 0x00])), /JPEG 图片数据截断/);
});
test('readImageDimensions rejects JPEG SOF segments without enough metadata for dimensions', () => {
assert.throws(() => readImageDimensions(jpegBuffer(1280, 720, 0xc0, 0x07)), /JPEG 图片数据截断/);
});
test('readImageDimensions rejects truncated WebP buffers', () => {
assert.throws(() => readImageDimensions(webpHeader('VP8X', 20)), /WebP 图片数据截断/);
});
function pngBuffer(width, height) {
const buffer = Buffer.alloc(24);
buffer[0] = 0x89;
buffer.write('PNG', 1, 'ascii');
buffer[4] = 0x0d;
buffer[5] = 0x0a;
buffer[6] = 0x1a;
buffer[7] = 0x0a;
buffer.writeUInt32BE(13, 8);
buffer.write('IHDR', 12, 'ascii');
buffer.writeUInt32BE(width, 16);
buffer.writeUInt32BE(height, 20);
return buffer;
}
function jpegBuffer(width, height, marker = 0xc0, length = 0x0b) {
return Buffer.from([
0xff,
0xd8,
0xff,
0xe0,
0x00,
0x04,
0x00,
0x00,
0xff,
marker,
0x00,
length,
0x08,
(height >> 8) & 0xff,
height & 0xff,
(width >> 8) & 0xff,
width & 0xff,
0x01,
0x01,
0x11,
0x00
]);
}
function webpHeader(chunk, length) {
const buffer = Buffer.alloc(length);
buffer.write('RIFF', 0, 'ascii');
buffer.write('WEBP', 8, 'ascii');
buffer.write(chunk, 12, 'ascii');
return buffer;
}
function webpVp8xBuffer(width, height) {
const buffer = webpHeader('VP8X', 30);
buffer.writeUIntLE(width - 1, 24, 3);
buffer.writeUIntLE(height - 1, 27, 3);
return buffer;
}
function webpVp8lBuffer(width, height) {
const buffer = webpHeader('VP8L', 25);
const bits = ((height - 1) << 14) | (width - 1);
buffer.writeUInt32LE(bits, 21);
return buffer;
}
function webpVp8Buffer(width, height) {
const buffer = webpHeader('VP8 ', 30);
buffer.writeUInt16LE(width, 26);
buffer.writeUInt16LE(height, 28);
return buffer;
}