UNPKG

@vizidrix/libringbufferjs

Version:

Vizidrix - LibRingBufferJS provides a small suite of low level wrappers around a pre-allocated 2s compliment sized auto wrapping buffer

158 lines 6.9 kB
var test = require('blue-tape'); var libringbufferjs_1 = require('../src/libringbufferjs'); test('RingBuffer<T>', function (suite) { suite.test('should create a buffer of proper length', function (assert) { var rb = libringbufferjs_1.RingBuffer(4, function () { return { value: 0 }; }); assert.equal(rb.getRingSize(), 4, 'be a 4 slice ring'); assert.end(); }); suite.test('should not reset elements if no reset is provided', function (assert) { var rb = libringbufferjs_1.RingBuffer(4, function () { return { value: 0 }; }); var writer = rb.claim(); writer.value = 20; for (var i = 0; i < 4; i++) { rb.claim(); } var reader = rb.peek(0); assert.equal(reader.value, 20, 'retain prior value due to no reset'); assert.end(); }); suite.test('should reset elements wrapping if reset is provided', function (assert) { var rb = libringbufferjs_1.RingBuffer(4, function () { return { value: 0 }; }, function (T) { return T.value = 0; }); var writer = rb.claim(); writer.value = 20; for (var i = 0; i < 4; i++) { rb.claim(); } var reader = rb.peek(0); assert.equal(reader.value, 0, 'reset value using provided function'); assert.end(); }); suite.end(); }); test('ObjectRingBuffer<T>', function (suite) { suite.test('should create a buffer of proper length', function (assert) { var rb = libringbufferjs_1.ObjectRingBuffer(4, function (ring, index) { return { value: index }; }); assert.equal(rb.getRingSize(), 4, 'be a 4 slice ring'); assert.end(); }); suite.test('should not reset elements if no reset is provided', function (assert) { var rb = libringbufferjs_1.ObjectRingBuffer(4, function (ring, index) { return { value: index }; }); var writer = rb.claim(); writer.value = 20; for (var i = 0; i < 4; i++) { rb.claim(); } var reader = rb.peek(0); assert.equal(reader.value, 20, 'retain prior value due to no reset'); assert.end(); }); suite.test('should reset elements wrapping if reset is provided', function (assert) { var rb = libringbufferjs_1.ObjectRingBuffer(4, function (ring, index) { return { value: index }; }, function (T) { return T.value = 0; }); var writer = rb.claim(); writer.value = 20; for (var i = 0; i < 4; i++) { rb.claim(); } var reader = rb.peek(0); assert.equal(reader.value, 0, 'reset value using provided function'); assert.end(); }); suite.end(); }); test('BinaryRingBuffer', function (suite) { suite.test('should create buffer with valid config params', function (assert) { var rb = libringbufferjs_1.BinaryRingBuffer(4, 4); assert.equal(rb.getRingSize(), 4, 'be 4 slice ring'); assert.end(); }); suite.test('should convert non integer numbers to integer for ring size and slice size', function (assert) { var rb = libringbufferjs_1.BinaryRingBuffer(10.5, 0.4); assert.equal(rb.getRingSize(), 16, 'corrected to 2s complement'); assert.end(); }); suite.test('should return valid claim and step write position', function (assert) { var rb = libringbufferjs_1.BinaryRingBuffer(4, 4); var handle = rb.claim(); var position = rb.getPosition(); assert.equal(handle.byteOffset, 0, 'return first position index'); assert.equal(position, 1, 'moves to the next position'); assert.end(); }); suite.test('should write to claim handle', function (assert) { var rb = libringbufferjs_1.BinaryRingBuffer(4, 4); var writer = rb.claim(); writer.setInt8(0, 10); writer.setInt8(1, 20); assert.equal(writer.byteLength, 4, 'only return claimed slice'); var reader = rb.peek(0); assert.equal(reader.getInt8(0), 10, 'read success first byte from 4x4'); assert.equal(reader.getInt8(1), 20, 'read success second byte from 4x4'); assert.end(); }); suite.test('should be able to make big rings', function (assert) { var rb = libringbufferjs_1.BinaryRingBuffer(64, 32); var writer = rb.claim(); writer.setInt32(0, 10); assert.equal(writer.byteLength, 32, 'writer is the correct length'); var reader = rb.peek(0); assert.equal(reader.getInt32(0), 10, 'sucessful read from 64 slice ring'); assert.end(); }); suite.test('should wrap index and not position when rolling back around the ring', function (assert) { var rb = libringbufferjs_1.BinaryRingBuffer(4, 4); rb.claim(); rb.claim(); rb.claim(); assert.equal(rb.getPosition(), 3, 'return correct position after first claims'); assert.equal(rb.getIndex(), 3, 'return correct index after first claims'); rb.claim(); rb.claim(); assert.equal(rb.getPosition(), 5, 'return correct position after wrapping claims'); assert.equal(rb.getIndex(), 1, 'return correct index after wrapping claims'); assert.end(); }); suite.test('should be able to write to cursor position after wrapping large ring', function (assert) { var rb = libringbufferjs_1.BinaryRingBuffer(4, 32); for (var i = 0; i < 31; i++) { var writer = rb.claim(); writer.setInt32(0, 10); } assert.end(); }); suite.test('should clear data by default', function (assert) { var rb = libringbufferjs_1.BinaryRingBuffer(4, 4); var writer = rb.claim(); writer.setInt8(0, 10); for (var i = 0; i < 4; i++) { rb.claim(); } var reader = rb.peek(0); assert.equal(reader.getInt8(0), 0, 'clear data from ring on each pass by default'); assert.end(); }); suite.test('should clear data if flag is set as true', function (assert) { var rb = libringbufferjs_1.BinaryRingBuffer(4, 4, true); var writer = rb.claim(); writer.setInt8(0, 10); for (var i = 0; i < 4; i++) { rb.claim(); } var reader = rb.peek(0); assert.equal(reader.getInt8(0), 0, 'clear data from ring on each pass if flag is true'); assert.end(); }); suite.test('should not clear data if flag is set as false', function (assert) { var rb = libringbufferjs_1.BinaryRingBuffer(4, 4, false); var writer = rb.claim(); writer.setInt8(0, 10); for (var i = 0; i < 4; i++) { rb.claim(); } var reader = rb.peek(0); assert.equal(reader.getInt8(0), 10, 'not clear data from ring if flag is false'); assert.end(); }); suite.end(); }); //# sourceMappingURL=ringbuffer.test.js.map