const test = require("tap").test; const { ringbuffer_from_data, sharedbuffer_growable, sharedbuffer, ringbuffer } = require("./../ringbuffer"); test("from data", (t) => { const testData = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]); const frame_size = 2; const rb = ringbuffer_from_data(testData, Uint8Array, frame_size); t.equal(rb.count(), 4); t.same(rb.pop(), [1, 2]); t.same(rb.pop(), [3, 4]); t.same(rb.pop(), [5, 6]); t.same(rb.pop(), [7, 8]); t.equal(rb.pop(), undefined); t.end(); }); const tests = (shared_buffer) => { test("pop should return undefined when buffer is empty", (t) => { const frame_size = 4; const max_frames = 8; const sb = shared_buffer(frame_size, max_frames, Uint8Array); const rb = ringbuffer(sb, frame_size, max_frames, Uint8Array); const poppedFrame = rb.pop(); t.equal( poppedFrame, undefined, "Popping from an empty buffer should return undefined" ); t.end(); }); test("fifo push and pop", (t) => { const frame_size = 4; const max_frames = 100; const sb = shared_buffer(frame_size, max_frames, Uint8Array); const rb = ringbuffer(sb, frame_size, max_frames, Uint8Array); const frames = [ new Uint8Array([1, 2, 3, 4]), new Uint8Array([5, 6, 7, 8]), new Uint8Array([9, 10, 11, 12]), new Uint8Array([13, 14, 15, 16]), new Uint8Array([2, 2, 3, 4]), new Uint8Array([3, 6, 7, 8]), new Uint8Array([4, 10, 11, 12]), new Uint8Array([5, 14, 15, 16]), ]; for (let i = 0; i < frames.length; i++) { rb.push(frames[i]); } for (let i = 0; i < frames.length; i++) { const res = rb.pop(); t.same(res, frames[i], `frame ${i} should match`); } t.end(); }); test("fifo push and pop float", (t) => { const frame_size = 4; const max_frames = 100; const sb = shared_buffer(frame_size, max_frames, Float32Array); const rb = ringbuffer(sb, frame_size, max_frames, Float32Array); const frames = [ new Float32Array([1, 2, 3.2, 4]), new Float32Array([5, 6.44, 7, 8]), new Float32Array([9.1, 10.22, 11, 12]), new Float32Array([13, 14, 15, 16]), new Float32Array([2, 2.2, 3, 4]), ]; for (let i = 0; i < frames.length; i++) { rb.push(frames[i]); } for (let i = 0; i < frames.length; i++) { const res = rb.pop(); t.same(res, frames[i], `frame ${i} should match`); } t.end(); }); test("push and pop with wrapping", (t) => { const frame_size = 4; const max_frames = 2; const sb = shared_buffer(frame_size, max_frames, Uint8Array); const rb = ringbuffer(sb, frame_size, max_frames, Uint8Array); const frame1 = new Uint8Array([1, 2, 3, 4]); const frame2 = new Uint8Array([5, 6, 7, 8]); const frame3 = new Uint8Array([9, 10, 11, 12]); const frame4 = new Uint8Array([13, 14, 15, 16]); rb.push(frame1); rb.push(frame2); t.same(rb.pop(), frame1); t.same(rb.pop(), frame2); rb.push(frame3); rb.push(frame4); t.same(rb.pop(), frame3); t.same(rb.pop(), frame4); t.end(); }); test("push and pop with wrapping overwrite", (t) => { const frame_size = 4; const max_frames = 2; const sb = shared_buffer(frame_size, max_frames, Uint8Array); const rb = ringbuffer(sb, frame_size, max_frames, Uint8Array); const frame1 = new Uint8Array([1, 2, 3, 4]); const frame2 = new Uint8Array([5, 6, 7, 8]); const frame3 = new Uint8Array([9, 10, 11, 12]); const frame4 = new Uint8Array([13, 14, 15, 16]); rb.push(frame1); rb.push(frame2); rb.push(frame3); rb.push(frame4); t.same(rb.pop(), frame3); t.same(rb.pop(), frame4); t.same(rb.pop(), undefined); t.same(rb.dropped_count(), 2); t.end(); }); test("push and pop with multiple wrapping overwrite", (t) => { const frame_size = 4; const max_frames = 2; const sb = shared_buffer(frame_size, max_frames, Uint8Array); const rb = ringbuffer(sb, frame_size, max_frames, Uint8Array); const frame1 = new Uint8Array([1, 2, 3, 4]); const frame2 = new Uint8Array([5, 6, 7, 8]); const frame3 = new Uint8Array([9, 10, 11, 12]); const frame4 = new Uint8Array([13, 14, 15, 16]); rb.push(frame1); rb.push(frame2); rb.push(frame3); rb.push(frame4); rb.push(frame1); rb.push(frame2); rb.push(frame3); rb.push(frame4); t.same(rb.pop(), frame3); t.same(rb.pop(), frame4); t.same(rb.pop(), undefined); t.same(rb.dropped_count(), 6); t.end(); }); test("float data type multiple", (t) => { const frame_size = 4; const max_frames = 2; const sb = shared_buffer(frame_size, max_frames, Float32Array); const rb = ringbuffer(sb, frame_size, max_frames, Float32Array); const frame1 = new Float32Array([1, 2, 3, 4.23]); const frame2 = new Float32Array([5, 6.44, 2, 7]); const frame3 = new Float32Array([9, 10, 11, 12]); const frame4 = new Float32Array([13.2, 14, 15, 16]); rb.push(frame1); rb.push(frame2); rb.push(frame3); rb.push(frame4); rb.push(frame1); rb.push(frame2); rb.push(frame3); rb.push(frame4); t.same(rb.pop(), frame3); t.same(rb.pop(), frame4); t.same(rb.pop(), undefined); t.same(rb.dropped_count(), 6); t.end(); }); test("float data type", (t) => { const frame_size = 4; const max_frames = 2; const sb = shared_buffer(frame_size, max_frames, Float32Array); const rb = ringbuffer(sb, frame_size, max_frames, Float32Array); const frame1 = new Float32Array([1, 2, 3, 4.23]); const frame2 = new Float32Array([5, 6.44, 2, 7]); const frame3 = new Float32Array([9, 10, 11, 12]); const frame4 = new Float32Array([13.2, 14, 15, 16]); rb.push(frame1); rb.push(frame2); rb.push(frame3); rb.push(frame4); t.same(rb.pop(), frame3); t.same(rb.pop(), frame4); t.same(rb.pop(), undefined); t.same(rb.dropped_count(), 2); t.end(); }); test("push and pop with", (t) => { const frame_size = 2; const max_frames = 64; const sb = shared_buffer(frame_size, max_frames, Uint8Array); const rb = ringbuffer(sb, frame_size, max_frames, Uint8Array); const a = []; for (let i = 0; i < 100; i++) { a.push(new Uint8Array([i, 0])); } const b = []; for (let i = 0; i < 100; i++) { b.push(new Uint8Array([i, 1])); } for (let i = 0; i < a.length; i++) { rb.push(a[i]); rb.push(b[i]); const res = []; while (true) { let r = rb.pop(); if (r) { res.push(r); } else { break; } } t.same(res[0], a[i]); t.same(res[1], b[i]); t.same(res.length, 2); } t.end(); }); } tests(sharedbuffer); tests(sharedbuffer_growable);