@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
JavaScript
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