event-emitters
Version:
129 lines • 4.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var Queue_1 = require("./Queue");
describe('Queue', function () {
it('can queue and dequeue 3 items', function () {
var queue = new Queue_1.Queue();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
expect(queue.length).toEqual(3);
expect(queue.dequeue()).toEqual(1);
expect(queue.length).toEqual(2);
expect(queue.dequeue()).toEqual(2);
expect(queue.dequeue()).toEqual(3);
expect(queue.length).toEqual(0);
});
it('moves elements before head to end after capacity increase when head is in first half', function () {
// set up 45123
var queue = new Queue_1.Queue(5);
queue.enqueue(98);
queue.enqueue(99);
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
expect(queue.dequeue()).toEqual(98);
expect(queue.dequeue()).toEqual(99); // xx123
queue.enqueue(4); // 4x123
queue.enqueue(5); // 45123
expect(queue.length).toEqual(5);
// exceed current capacity
queue.enqueue(6); // ee123456ee
// then fill up to the new capacity
queue.enqueue(7);
queue.enqueue(8);
queue.enqueue(9);
queue.enqueue(10); // 9a12345678
expect(queue.length).toEqual(10);
// ensure everything is in order
for (var i = 1; i <= 10; ++i) {
expect(queue.dequeue()).toEqual(i);
}
expect(queue.length).toEqual(0);
});
it('moves elements after tail to end after capacity increase when head is in last half', function () {
// set up 34512
var queue = new Queue_1.Queue(5);
queue.enqueue(97);
queue.enqueue(98);
queue.enqueue(99);
queue.enqueue(1);
queue.enqueue(2);
expect(queue.dequeue()).toEqual(97);
expect(queue.dequeue()).toEqual(98);
expect(queue.dequeue()).toEqual(99); // xxx12
queue.enqueue(3); // 3xx12
queue.enqueue(4); // 34x12
queue.enqueue(5); // 34512
expect(queue.length).toEqual(5);
// exceed current capacity
queue.enqueue(6); // 3456eeee12
// then fill up to the new capacity
queue.enqueue(7);
queue.enqueue(8);
queue.enqueue(9);
queue.enqueue(10); // 3456789012
expect(queue.length).toEqual(10);
// ensure everything is in order
for (var i = 1; i <= 10; ++i) {
expect(queue.dequeue()).toEqual(i);
}
expect(queue.length).toEqual(0);
});
it('throws an error when trying to dequeue nonexistent item', function () {
var queue = new Queue_1.Queue();
queue.enqueue(1);
expect(queue.dequeue()).toEqual(1);
expect(function () {
queue.dequeue();
}).toThrowError();
});
it('can queue past initial capacity of circular buffer', function () {
var queue = new Queue_1.Queue();
var moreThanCapacity = 17;
for (var i = 0; i < moreThanCapacity; ++i) {
queue.enqueue(i);
}
expect(queue.length).toEqual(moreThanCapacity);
for (var i = 0; i < moreThanCapacity; ++i) {
expect(queue.dequeue()).toEqual(i);
}
expect(queue.length).toEqual(0);
});
it('supports interleaved queues and dequeues', function () {
var queue = new Queue_1.Queue();
queue.enqueue(1);
queue.enqueue(2);
expect(queue.dequeue()).toEqual(1);
queue.enqueue(3);
queue.enqueue(4);
expect(queue.dequeue()).toEqual(2);
queue.enqueue(5);
queue.enqueue(6);
expect(queue.dequeue()).toEqual(3);
expect(queue.dequeue()).toEqual(4);
expect(queue.dequeue()).toEqual(5);
expect(queue.dequeue()).toEqual(6);
});
it('supports a large number of interleaved queues and dequeues', function () {
var initialSize = 4;
var queue = new Queue_1.Queue();
for (var i = 0; i < initialSize; ++i) {
queue.enqueue(i);
}
var nextRead = 0;
var nextWrite = initialSize;
for (var i = 0; i < 10000; ++i) {
if (nextRead === nextWrite || Math.random() < 0.5) {
queue.enqueue(nextWrite++);
}
else {
expect(queue.dequeue()).toEqual(nextRead++);
}
}
for (; nextRead < nextWrite; ++nextRead) {
expect(queue.dequeue()).toEqual(nextRead);
}
});
});
//# sourceMappingURL=Queue.spec.js.map