Skip to content

Commit 034b5b5

Browse files
committed
queues unit tested minimally
1 parent ab9c951 commit 034b5b5

File tree

5 files changed

+215
-86
lines changed

5 files changed

+215
-86
lines changed

benchmark/queues.js

Lines changed: 83 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,86 @@
11
let { queues } = require('./../index');
22
let ptime = require('quick-ptime');
3+
const Table = require('cli-table');
4+
var ProgressBar = require('progress');
35

4-
// setup stacks
5-
let queue = new queues.Queue();
6-
let arrayQueue = new queues.ArrayQueue();
7-
8-
// enqueue 100,000 items into the queue
9-
ptime.setTime('queue100000');
10-
for (let i = 0; i < 100000; i++) {
11-
queue.enqueue('value');
12-
}
13-
console.log('Enqueue 100,000 Queue timing:', ptime.elapsedTime('queue100000').formatted);
14-
15-
ptime.setTime('arrayqueue100000');
16-
for (let i = 0; i < 100000; i++) {
17-
arrayQueue.enqueue('value');
18-
}
19-
console.log('Enqueue 100,000 Array Queue timing:', ptime.elapsedTime('arrayqueue100000').formatted);
20-
21-
// dequeue 100,000 items into the queue
22-
ptime.setTime('dqueue100000');
23-
for (let i = 0; i < 100000; i++) {
24-
queue.dequeue();
25-
}
26-
console.log('Dequeue 100,000 Queue timing:', ptime.elapsedTime('dqueue100000').formatted);
27-
28-
ptime.setTime('darrayqueue100000');
29-
for (let i = 0; i < 100000; i++) {
30-
arrayQueue.dequeue();
31-
}
32-
console.log('Dequeue 100,000 Array Queue timing:', ptime.elapsedTime('darrayqueue100000').formatted);
6+
let bar;
7+
8+
const standard = async (name, func, value) => {
9+
// console.log("Running...", name);
10+
const result = [
11+
(await ptime.runFunctionRounds(`${name} 100000`, func, [value], 100000, true)).formatted,
12+
(await ptime.runFunctionRounds(`${name} 1000000`, func, [value], 1000000, true)).formatted,
13+
(await ptime.runFunctionRounds(`${name} 10000000`, func, [value], 10000000, true)).formatted,
14+
(await ptime.runFunctionAverage(`${name} 1`, func, [value], 1000000, true)).formatted,
15+
];
16+
17+
let str = {};
18+
str[name] = result;
19+
bar.tick();
20+
return str;
21+
};
22+
23+
const run = async () => {
24+
let results = [];
25+
let linkedStack = new stacks.LinkedStack();
26+
let uArrayStack = new stacks.UArrayStack();
27+
let bArrayStack = new stacks.BArrayStack(12100000);
28+
bar = new ProgressBar(':bar :percent :elapseds total, completes in :etas', { total: 10 });
29+
bar.tick();
30+
results.push(
31+
await standard('LinkedStack Push', linkedStack.push.bind(linkedStack), 1),
32+
await standard('UArrayStack Push', uArrayStack.push.bind(uArrayStack), 1),
33+
await standard('BArrayStack Push', bArrayStack.push.bind(bArrayStack), 1),
34+
await standard('LinkedStack Top', linkedStack.top.bind(linkedStack), 1),
35+
await standard('UArrayStack Top', uArrayStack.top.bind(uArrayStack), 1),
36+
await standard('BArrayStack Top', bArrayStack.top.bind(bArrayStack), 1),
37+
await standard('LinkedStack Pop', linkedStack.pop.bind(linkedStack), 1),
38+
await standard('UArrayStack Pop', uArrayStack.pop.bind(uArrayStack), 1),
39+
await standard('BArrayStack Pop', bArrayStack.pop.bind(bArrayStack), 1)
40+
);
41+
42+
return results;
43+
};
44+
45+
run().then(value => {
46+
const table = new Table({
47+
head: ['Stack Operation', '100,000 items', '1,000,000 items', '10,000,000 items', '1 item AVG'],
48+
});
49+
50+
table.push(...value);
51+
52+
console.log(table.toString());
53+
});
54+
55+
// let { queues } = require('./../index');
56+
// let ptime = require('quick-ptime');
57+
58+
// // setup stacks
59+
// let queue = new queues.Queue();
60+
// let arrayQueue = new queues.ArrayQueue();
61+
62+
// // enqueue 100,000 items into the queue
63+
// ptime.setTime('queue100000');
64+
// for (let i = 0; i < 100000; i++) {
65+
// queue.enqueue('value');
66+
// }
67+
// console.log('Enqueue 100,000 Queue timing:', ptime.elapsedTime('queue100000').formatted);
68+
69+
// ptime.setTime('arrayqueue100000');
70+
// for (let i = 0; i < 100000; i++) {
71+
// arrayQueue.enqueue('value');
72+
// }
73+
// console.log('Enqueue 100,000 Array Queue timing:', ptime.elapsedTime('arrayqueue100000').formatted);
74+
75+
// // dequeue 100,000 items into the queue
76+
// ptime.setTime('dqueue100000');
77+
// for (let i = 0; i < 100000; i++) {
78+
// queue.dequeue();
79+
// }
80+
// console.log('Dequeue 100,000 Queue timing:', ptime.elapsedTime('dqueue100000').formatted);
81+
82+
// ptime.setTime('darrayqueue100000');
83+
// for (let i = 0; i < 100000; i++) {
84+
// arrayQueue.dequeue();
85+
// }
86+
// console.log('Dequeue 100,000 Array Queue timing:', ptime.elapsedTime('darrayqueue100000').formatted);

lib/queues.js

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,6 @@ class LinkedQueue {
4545
return this.first.value;
4646
}
4747

48-
length() {
49-
return this.length;
50-
}
51-
5248
isEmpty() {
5349
return this.length === 0;
5450
}
@@ -60,24 +56,23 @@ class LinkedQueue {
6056
class UArrayQueue {
6157
constructor() {
6258
this.queue = [];
59+
this.length = 0;
6360
}
6461

6562
enqueue(data) {
63+
this.length++;
6664
return this.queue.unshift(data);
6765
}
6866

6967
dequeue() {
68+
this.length--;
7069
return this.queue.pop();
7170
}
7271

7372
peek() {
7473
return this.queue[this.queue.length - 1];
7574
}
7675

77-
length() {
78-
return this.queue.length;
79-
}
80-
8176
isEmpty() {
8277
return this.queue.length === 0;
8378
}
@@ -87,7 +82,7 @@ class UArrayQueue {
8782
* Implements a bounded queue using an array with the floating front method.
8883
*/
8984
class BFltArrayQueue {
90-
constructor(size = (DEFAULT_SIZE = 1000)) {
85+
constructor(size = 100) {
9186
this.queue = [];
9287
for (let i = 0; i < size; i++) {
9388
this.queue[i] = null;
@@ -106,7 +101,7 @@ class BFltArrayQueue {
106101
}
107102

108103
enqueue(data) {
109-
if (isFull()) {
104+
if (this.isFull()) {
110105
throw new Error('Enqueue attempted on a full queue.');
111106
} else {
112107
this.rear = (this.rear + 1) % this.queue.length;
@@ -116,7 +111,7 @@ class BFltArrayQueue {
116111
}
117112

118113
dequeue() {
119-
if (isEmpty()) {
114+
if (this.isEmpty()) {
120115
throw new Error('Dequeue attempted on empty queue.');
121116
} else {
122117
const toReturn = this.queue[this.front];
@@ -130,17 +125,13 @@ class BFltArrayQueue {
130125
peek() {
131126
return this.queue[this.front];
132127
}
133-
134-
length() {
135-
return this.length;
136-
}
137128
}
138129

139130
/**
140131
* Implements a bounded queue using an array with the fixed front method.
141132
*/
142133
class BFixArrayQueue {
143-
constructor(size = (DEFAULT_SIZE = 1000)) {
134+
constructor(size = 100) {
144135
this.queue = [];
145136
for (let i = 0; i < size; i++) {
146137
this.queue[i] = null;
@@ -158,16 +149,16 @@ class BFixArrayQueue {
158149
}
159150

160151
enqueue(data) {
161-
if (isFull()) {
152+
if (this.isFull()) {
162153
throw new Error('Enqueue attempted on a full queue.');
163154
} else {
164-
this.rear++;
155+
this.length = ++this.rear + 1; // important to use prefix incrementing here
165156
this.queue[this.rear] = data;
166157
}
167158
}
168159

169160
dequeue() {
170-
if (isEmpty()) {
161+
if (this.isEmpty()) {
171162
throw new Error('Dequeue attempted on empty queue.');
172163
} else {
173164
const toReturn = this.queue[0];
@@ -176,13 +167,13 @@ class BFixArrayQueue {
176167
for (let i = 1; i < this.rear; i++) {
177168
this.queue[i - 1] = this.queue[i];
178169
}
179-
this.rear--;
170+
this.length = --this.rear + 1; // important to use prefix decrementing here
180171
return toReturn;
181172
}
182173
}
183174

184175
peek() {
185-
return this.queue[this.front];
176+
return this.queue[0];
186177
}
187178

188179
length() {

lib/stacks.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ class LinkedStack {
2626
}
2727

2828
top() {
29-
return this.topNode.value;
29+
if (!this.topNode) {
30+
return undefined;
31+
} else {
32+
return this.topNode.value;
33+
}
3034
}
3135

3236
height() {
@@ -71,7 +75,7 @@ class UArrayStack {
7175
* Implements a bounded stack using an array.
7276
*/
7377
class BArrayStack {
74-
constructor(size = (DEFAULT_SIZE = 100)) {
78+
constructor(size = 100) {
7579
this.stack = [];
7680
for (let i = 0; i < size; i++) {
7781
this.stack[i] = null;

test/queues.js

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
var assert = require('assert');
2+
const { queues } = require('../index');
3+
4+
describe('LinkedList Queue', function() {
5+
it('should make a new queue...', function() {
6+
const queue = new queues.LinkedQueue();
7+
assert.equal(queue.length, 0);
8+
});
9+
10+
it('should enqueue an item onto the queue...', function() {
11+
const queue = new queues.LinkedQueue();
12+
queue.enqueue('item');
13+
assert.equal(queue.length, 1);
14+
assert.equal(queue.peek(), 'item');
15+
});
16+
17+
it('should dequeue an item out of the queue...', function() {
18+
const queue = new queues.LinkedQueue();
19+
queue.enqueue('item');
20+
const item = queue.dequeue();
21+
assert.equal(queue.length, 0);
22+
assert.equal(item, 'item');
23+
});
24+
});
25+
26+
describe('Unbounded Array Queue', function() {
27+
it('should make a new queue...', function() {
28+
const queue = new queues.UArrayQueue();
29+
assert.equal(queue.length, 0);
30+
});
31+
32+
it('should enqueue an item onto the queue...', function() {
33+
const queue = new queues.UArrayQueue();
34+
queue.enqueue('item');
35+
assert.equal(queue.length, 1);
36+
assert.equal(queue.peek(), 'item');
37+
});
38+
39+
it('should dequeue an item out of the queue...', function() {
40+
const queue = new queues.UArrayQueue();
41+
queue.enqueue('item');
42+
const item = queue.dequeue();
43+
assert.equal(queue.length, 0);
44+
assert.equal(item, 'item');
45+
});
46+
});
47+
48+
describe('Bounded Floating Front Array Queue', function() {
49+
it('should make a new queue...', function() {
50+
const queue = new queues.BFltArrayQueue();
51+
assert.equal(queue.length, 0);
52+
});
53+
54+
it('should enqueue an item onto the queue...', function() {
55+
const queue = new queues.BFltArrayQueue();
56+
queue.enqueue('item');
57+
assert.equal(queue.length, 1);
58+
assert.equal(queue.peek(), 'item');
59+
});
60+
61+
it('should dequeue an item out of the queue...', function() {
62+
const queue = new queues.BFltArrayQueue();
63+
queue.enqueue('item');
64+
const item = queue.dequeue();
65+
assert.equal(queue.length, 0);
66+
assert.equal(item, 'item');
67+
});
68+
});
69+
70+
describe('Bounded Fixed Front Array Queue', function() {
71+
it('should make a new queue...', function() {
72+
const queue = new queues.BFixArrayQueue();
73+
assert.equal(queue.length, 0);
74+
});
75+
76+
it('should enqueue an item onto the queue...', function() {
77+
const queue = new queues.BFixArrayQueue();
78+
queue.enqueue('item');
79+
assert.equal(queue.length, 1);
80+
assert.equal(queue.peek(), 'item');
81+
});
82+
83+
it('should dequeue an item out of the queue...', function() {
84+
const queue = new queues.BFixArrayQueue();
85+
queue.enqueue('item');
86+
const item = queue.dequeue();
87+
assert.equal(queue.length, 0);
88+
assert.equal(item, 'item');
89+
});
90+
});

0 commit comments

Comments
 (0)