pixel8/tests/core.test.js

60 lines
2.6 KiB
JavaScript

"use strict";
const { test } = require("node:test");
const assert = require("node:assert/strict");
const { solid, validatePixels, pixelsToBuffer, frameFromPixel8Json } = require("../src/frame");
const { transform, testPattern, chaseFrame } = require("../src/mapping");
const { buildDdpPacket } = require("../src/ddp");
const { solidSource, chaseSource, rainbowSource, sequenceSource } = require("../src/sources");
test("frame validation: exactly 64 pixels, channels 0-255", () => {
assert.equal(validatePixels(solid([1, 2, 3])).length, 64);
assert.throws(() => validatePixels(solid().slice(0, 63)), /exactly 64/);
assert.throws(() => validatePixels([...solid().slice(0, 63), [256, 0, 0]]), /0-255/);
assert.equal(pixelsToBuffer(solid()).length, 192);
});
test("pixel8 JSON round-trip", () => {
const f = frameFromPixel8Json({ width: 8, height: 8, pixels: solid([255, 0, 0]) });
assert.equal(f.pixels.length, 64);
assert.throws(() => frameFromPixel8Json({ width: 4, height: 8, pixels: solid() }), /8 wide/);
});
test("mapping: serpentine reverses odd rows; rotation/flip", () => {
const px = Array.from({ length: 64 }, (_, i) => [i, 0, 0]);
const s = transform(px, { serpentine: true });
assert.equal(s[8][0], 15); // row 1 reversed: index 8 -> 15
assert.equal(s[0][0], 0);
assert.deepEqual(transform(px, { rotate: 90 }).length, 64);
assert.deepEqual(transform(px, { flipX: true }).length, 64);
});
test("test patterns: corners, chase", () => {
const c = testPattern("corners");
assert.deepEqual(c[0], [255, 255, 255]);
assert.deepEqual(c[1], [0, 0, 0]);
assert.deepEqual(chaseFrame(5)[5], [255, 255, 255]);
assert.throws(() => testPattern("nope"), /unknown/);
});
test("DDP packet: 10-byte header + 192-byte payload", () => {
const pkt = buildDdpPacket(solid([1, 2, 3]), { sequence: 7 });
assert.equal(pkt.length, 202);
assert.equal(pkt[0], 0x40);
assert.equal(pkt[1], 7);
assert.equal(pkt[2], 0x01);
assert.equal(pkt.readUInt16BE(8), 192);
assert.equal(pkt[10], 1); assert.equal(pkt[11], 2); assert.equal(pkt[12], 3);
});
test("sources: solid, chase, rainbow, sequence loop/hold", () => {
assert.deepEqual(solidSource([9, 9, 9]).next(0)[0], [9, 9, 9]);
assert.deepEqual(chaseSource(10).next(100)[1], [255, 255, 255]);
assert.equal(rainbowSource().next(0).length, 64);
const seq = sequenceSource([solid([1, 0, 0]), solid([2, 0, 0])], { fps: 1, loop: true });
assert.deepEqual(seq.next(0)[0], [1, 0, 0]);
assert.deepEqual(seq.next(1500)[0], [2, 0, 0]);
assert.deepEqual(seq.next(2500)[0], [1, 0, 0]);
const hold = sequenceSource([solid([1, 0, 0])], { fps: 1, loop: false });
assert.deepEqual(hold.next(99999)[0], [1, 0, 0]);
});