60 lines
2.6 KiB
JavaScript
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]);
|
|
});
|