test: improve addTaskFunction() tests
[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 ])
120 rtSize = priorityQueue.enqueue(2, -2)
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 },
129 { data: 2, priority: -2 },
130 { data: 1, priority: 1 }
131 ])
132 })
133
bd8b441c
JB
134 it('Verify dequeue() behavior', () => {
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
159 it('Verify peekFirst() behavior', () => {
160 const priorityQueue = new PriorityQueue()
161 priorityQueue.enqueue(1)
162 priorityQueue.enqueue(2)
163 priorityQueue.enqueue(3)
164 expect(priorityQueue.size).toBe(3)
165 expect(priorityQueue.peekFirst()).toBe(1)
166 expect(priorityQueue.size).toBe(3)
167 })
168
169 it('Verify peekLast() behavior', () => {
170 const priorityQueue = new PriorityQueue()
171 priorityQueue.enqueue(1)
172 priorityQueue.enqueue(2)
173 priorityQueue.enqueue(3)
174 expect(priorityQueue.size).toBe(3)
175 expect(priorityQueue.peekLast()).toBe(3)
176 expect(priorityQueue.size).toBe(3)
177 })
178
95d1a734
JB
179 it('Verify iterator behavior', () => {
180 const priorityQueue = new PriorityQueue()
181 priorityQueue.enqueue(1)
182 priorityQueue.enqueue(2)
183 priorityQueue.enqueue(3)
184 let i = 1
185 for (const value of priorityQueue) {
186 expect(value).toBe(i)
187 ++i
188 }
189 })
190
bd8b441c
JB
191 it('Verify clear() behavior', () => {
192 const priorityQueue = new PriorityQueue()
193 priorityQueue.enqueue(1)
194 priorityQueue.enqueue(2)
195 priorityQueue.enqueue(3)
196 expect(priorityQueue.size).toBe(3)
197 expect(priorityQueue.maxSize).toBe(3)
198 expect(priorityQueue.nodeArray).toStrictEqual([
199 { data: 1, priority: 0 },
200 { data: 2, priority: 0 },
201 { data: 3, priority: 0 }
202 ])
203 priorityQueue.clear()
204 expect(priorityQueue.size).toBe(0)
205 expect(priorityQueue.maxSize).toBe(0)
206 expect(priorityQueue.nodeArray).toStrictEqual([])
207 })
208})