test: add priority queue dequeue() with defined k
[poolifier.git] / tests / priority-queue.test.mjs
CommitLineData
bd8b441c
JB
1import { expect } from 'expect'
2
bd8b441c
JB
3import { PriorityQueue } from '../lib/priority-queue.cjs'
4
95d1a734 5describe('Priority queue test suite', () => {
e41b0271
JB
6 it('Verify constructor() behavior', () => {
7 expect(() => new PriorityQueue('')).toThrow(
8 new TypeError('k must be an integer')
9 )
10 expect(() => new PriorityQueue(-1)).toThrow(
11 new RangeError('k must be greater than or equal to 1')
12 )
13 expect(() => new PriorityQueue(0)).toThrow(
14 new RangeError('k must be greater than or equal to 1')
15 )
16 let priorityQueue = new PriorityQueue()
17 expect(priorityQueue.k).toBe(Infinity)
18 expect(priorityQueue.size).toBe(0)
19 expect(priorityQueue.maxSize).toBe(0)
20 expect(priorityQueue.nodeArray).toStrictEqual([])
21 priorityQueue = new PriorityQueue(2)
22 expect(priorityQueue.k).toBe(2)
23 expect(priorityQueue.size).toBe(0)
24 expect(priorityQueue.maxSize).toBe(0)
25 expect(priorityQueue.nodeArray).toStrictEqual([])
26 })
27
28 it('Verify default k enqueue() behavior', () => {
bd8b441c
JB
29 const priorityQueue = new PriorityQueue()
30 let rtSize = priorityQueue.enqueue(1)
31 expect(priorityQueue.size).toBe(1)
32 expect(priorityQueue.maxSize).toBe(1)
33 expect(rtSize).toBe(priorityQueue.size)
34 expect(priorityQueue.nodeArray).toStrictEqual([{ data: 1, priority: 0 }])
35 rtSize = priorityQueue.enqueue(2)
36 expect(priorityQueue.size).toBe(2)
37 expect(priorityQueue.maxSize).toBe(2)
38 expect(rtSize).toBe(priorityQueue.size)
39 expect(priorityQueue.nodeArray).toStrictEqual([
40 { data: 1, priority: 0 },
41 { data: 2, priority: 0 }
42 ])
43 rtSize = priorityQueue.enqueue(3)
44 expect(priorityQueue.size).toBe(3)
45 expect(priorityQueue.maxSize).toBe(3)
46 expect(rtSize).toBe(priorityQueue.size)
47 expect(priorityQueue.nodeArray).toStrictEqual([
48 { data: 1, priority: 0 },
49 { data: 2, priority: 0 },
50 { data: 3, priority: 0 }
51 ])
52 rtSize = priorityQueue.enqueue(3, -1)
53 expect(priorityQueue.size).toBe(4)
54 expect(priorityQueue.maxSize).toBe(4)
55 expect(rtSize).toBe(priorityQueue.size)
56 expect(priorityQueue.nodeArray).toStrictEqual([
57 { data: 3, priority: -1 },
58 { data: 1, priority: 0 },
59 { data: 2, priority: 0 },
60 { data: 3, priority: 0 }
61 ])
62 rtSize = priorityQueue.enqueue(1, 1)
63 expect(priorityQueue.size).toBe(5)
64 expect(priorityQueue.maxSize).toBe(5)
65 expect(rtSize).toBe(priorityQueue.size)
66 expect(priorityQueue.nodeArray).toStrictEqual([
67 { data: 3, priority: -1 },
68 { data: 1, priority: 0 },
69 { data: 2, priority: 0 },
70 { data: 3, priority: 0 },
71 { data: 1, priority: 1 }
72 ])
73 })
74
e41b0271
JB
75 it('Verify k=2 enqueue() behavior', () => {
76 const priorityQueue = new PriorityQueue(2)
77 let rtSize = priorityQueue.enqueue(1)
78 expect(priorityQueue.size).toBe(1)
79 expect(priorityQueue.maxSize).toBe(1)
80 expect(rtSize).toBe(priorityQueue.size)
81 expect(priorityQueue.nodeArray).toStrictEqual([{ data: 1, priority: 0 }])
82 rtSize = priorityQueue.enqueue(2)
83 expect(priorityQueue.size).toBe(2)
84 expect(priorityQueue.maxSize).toBe(2)
85 expect(rtSize).toBe(priorityQueue.size)
86 expect(priorityQueue.nodeArray).toStrictEqual([
87 { data: 1, priority: 0 },
88 { data: 2, priority: 0 }
89 ])
90 rtSize = priorityQueue.enqueue(3)
91 expect(priorityQueue.size).toBe(3)
92 expect(priorityQueue.maxSize).toBe(3)
93 expect(rtSize).toBe(priorityQueue.size)
94 expect(priorityQueue.nodeArray).toStrictEqual([
95 { data: 1, priority: 0 },
96 { data: 2, priority: 0 },
97 { data: 3, priority: 0 }
98 ])
99 rtSize = priorityQueue.enqueue(3, -1)
100 expect(priorityQueue.size).toBe(4)
101 expect(priorityQueue.maxSize).toBe(4)
102 expect(rtSize).toBe(priorityQueue.size)
103 expect(priorityQueue.nodeArray).toStrictEqual([
104 { data: 1, priority: 0 },
105 { data: 2, priority: 0 },
106 { data: 3, priority: -1 },
107 { data: 3, priority: 0 }
108 ])
109 rtSize = priorityQueue.enqueue(1, 1)
110 expect(priorityQueue.size).toBe(5)
111 expect(priorityQueue.maxSize).toBe(5)
112 expect(rtSize).toBe(priorityQueue.size)
113 expect(priorityQueue.nodeArray).toStrictEqual([
114 { data: 1, priority: 0 },
115 { data: 2, priority: 0 },
116 { data: 3, priority: -1 },
117 { data: 3, priority: 0 },
118 { data: 1, priority: 1 }
119 ])
a4092a15 120 rtSize = priorityQueue.enqueue(3, -2)
e41b0271
JB
121 expect(priorityQueue.size).toBe(6)
122 expect(priorityQueue.maxSize).toBe(6)
123 expect(rtSize).toBe(priorityQueue.size)
124 expect(priorityQueue.nodeArray).toStrictEqual([
125 { data: 1, priority: 0 },
126 { data: 2, priority: 0 },
127 { data: 3, priority: -1 },
128 { data: 3, priority: 0 },
a4092a15 129 { data: 3, priority: -2 },
e41b0271
JB
130 { data: 1, priority: 1 }
131 ])
132 })
133
a4092a15 134 it('Verify default k dequeue() behavior', () => {
bd8b441c
JB
135 const priorityQueue = new PriorityQueue()
136 priorityQueue.enqueue(1)
137 priorityQueue.enqueue(2, -1)
138 priorityQueue.enqueue(3)
139 let rtItem = priorityQueue.dequeue()
140 expect(priorityQueue.size).toBe(2)
141 expect(priorityQueue.maxSize).toBe(3)
142 expect(rtItem).toBe(2)
143 expect(priorityQueue.nodeArray).toStrictEqual([
144 { data: 1, priority: 0 },
145 { data: 3, priority: 0 }
146 ])
147 rtItem = priorityQueue.dequeue()
148 expect(priorityQueue.size).toBe(1)
149 expect(priorityQueue.maxSize).toBe(3)
150 expect(rtItem).toBe(1)
151 expect(priorityQueue.nodeArray).toStrictEqual([{ data: 3, priority: 0 }])
152 rtItem = priorityQueue.dequeue()
153 expect(priorityQueue.size).toBe(0)
154 expect(priorityQueue.maxSize).toBe(3)
155 expect(rtItem).toBe(3)
156 expect(priorityQueue.nodeArray).toStrictEqual([])
157 })
158
a4092a15
JB
159 it('Verify k=2 dequeue() behavior', () => {
160 const priorityQueue = new PriorityQueue(2)
161 priorityQueue.enqueue(1)
162 priorityQueue.enqueue(2)
163 priorityQueue.enqueue(3)
164 priorityQueue.enqueue(3, -1)
165 priorityQueue.enqueue(1, 1)
166 priorityQueue.enqueue(3, -2)
167 let rtItem = priorityQueue.dequeue(3)
168 expect(priorityQueue.size).toBe(5)
169 expect(priorityQueue.maxSize).toBe(6)
170 expect(rtItem).toBe(3)
171 expect(priorityQueue.nodeArray).toStrictEqual([
172 { data: 1, priority: 0 },
173 { data: 2, priority: 0 },
174 { data: 3, priority: -1 },
175 { data: 3, priority: 0 },
176 { data: 1, priority: 1 }
177 ])
178 rtItem = priorityQueue.dequeue()
179 expect(priorityQueue.size).toBe(4)
180 expect(priorityQueue.maxSize).toBe(6)
181 expect(rtItem).toBe(1)
182 expect(priorityQueue.nodeArray).toStrictEqual([
183 { data: 2, priority: 0 },
184 { data: 3, priority: -1 },
185 { data: 3, priority: 0 },
186 { data: 1, priority: 1 }
187 ])
188 rtItem = priorityQueue.dequeue(2)
189 expect(priorityQueue.size).toBe(3)
190 expect(priorityQueue.maxSize).toBe(6)
191 expect(rtItem).toBe(3)
192 expect(priorityQueue.nodeArray).toStrictEqual([
193 { data: 2, priority: 0 },
194 { data: 3, priority: -1 },
195 { data: 1, priority: 1 }
196 ])
197 rtItem = priorityQueue.dequeue(2)
198 expect(priorityQueue.size).toBe(2)
199 expect(priorityQueue.maxSize).toBe(6)
200 expect(rtItem).toBe(1)
201 expect(priorityQueue.nodeArray).toStrictEqual([
202 { data: 2, priority: 0 },
203 { data: 3, priority: -1 }
204 ])
205 rtItem = priorityQueue.dequeue(2)
206 expect(priorityQueue.size).toBe(1)
207 expect(priorityQueue.maxSize).toBe(6)
208 expect(rtItem).toBe(2)
209 expect(priorityQueue.nodeArray).toStrictEqual([{ data: 3, priority: -1 }])
210 rtItem = priorityQueue.dequeue()
211 expect(priorityQueue.size).toBe(0)
212 expect(priorityQueue.maxSize).toBe(6)
213 expect(rtItem).toBe(3)
214 expect(priorityQueue.nodeArray).toStrictEqual([])
215 })
216
bd8b441c
JB
217 it('Verify peekFirst() behavior', () => {
218 const priorityQueue = new PriorityQueue()
219 priorityQueue.enqueue(1)
220 priorityQueue.enqueue(2)
221 priorityQueue.enqueue(3)
222 expect(priorityQueue.size).toBe(3)
223 expect(priorityQueue.peekFirst()).toBe(1)
224 expect(priorityQueue.size).toBe(3)
225 })
226
227 it('Verify peekLast() behavior', () => {
228 const priorityQueue = new PriorityQueue()
229 priorityQueue.enqueue(1)
230 priorityQueue.enqueue(2)
231 priorityQueue.enqueue(3)
232 expect(priorityQueue.size).toBe(3)
233 expect(priorityQueue.peekLast()).toBe(3)
234 expect(priorityQueue.size).toBe(3)
235 })
236
95d1a734
JB
237 it('Verify iterator behavior', () => {
238 const priorityQueue = new PriorityQueue()
239 priorityQueue.enqueue(1)
240 priorityQueue.enqueue(2)
241 priorityQueue.enqueue(3)
242 let i = 1
243 for (const value of priorityQueue) {
244 expect(value).toBe(i)
245 ++i
246 }
247 })
248
bd8b441c
JB
249 it('Verify clear() behavior', () => {
250 const priorityQueue = new PriorityQueue()
251 priorityQueue.enqueue(1)
252 priorityQueue.enqueue(2)
253 priorityQueue.enqueue(3)
254 expect(priorityQueue.size).toBe(3)
255 expect(priorityQueue.maxSize).toBe(3)
256 expect(priorityQueue.nodeArray).toStrictEqual([
257 { data: 1, priority: 0 },
258 { data: 2, priority: 0 },
259 { data: 3, priority: 0 }
260 ])
261 priorityQueue.clear()
262 expect(priorityQueue.size).toBe(0)
263 expect(priorityQueue.maxSize).toBe(0)
264 expect(priorityQueue.nodeArray).toStrictEqual([])
265 })
266})