feat: add O(1) deque
[poolifier.git] / tests / deque.test.js
1 const { expect } = require('expect')
2 const { Deque } = require('../lib/deque')
3
4 describe('Deque test suite', () => {
5 it('Verify push() behavior', () => {
6 const deque = new Deque()
7 let rtSize = deque.push(1)
8 expect(deque.size).toBe(1)
9 expect(deque.maxSize).toBe(1)
10 expect(rtSize).toBe(deque.size)
11 expect(deque.head).toMatchObject({ value: 1 })
12 expect(deque.tail).toMatchObject({ value: 1 })
13 rtSize = deque.push(2)
14 expect(deque.size).toBe(2)
15 expect(deque.maxSize).toBe(2)
16 expect(rtSize).toBe(deque.size)
17 expect(deque.head).toMatchObject({ value: 1 })
18 expect(deque.tail).toMatchObject({ value: 2 })
19 rtSize = deque.push(3)
20 expect(deque.size).toBe(3)
21 expect(deque.maxSize).toBe(3)
22 expect(rtSize).toBe(deque.size)
23 expect(deque.head).toMatchObject({ value: 1 })
24 expect(deque.tail).toMatchObject({ value: 3 })
25 })
26
27 it('Verify unshift() behavior', () => {
28 const deque = new Deque()
29 let rtSize = deque.unshift(1)
30 expect(deque.size).toBe(1)
31 expect(deque.maxSize).toBe(1)
32 expect(rtSize).toBe(deque.size)
33 expect(deque.head).toMatchObject({ value: 1 })
34 expect(deque.tail).toMatchObject({ value: 1 })
35 rtSize = deque.unshift(2)
36 expect(deque.size).toBe(2)
37 expect(deque.maxSize).toBe(2)
38 expect(rtSize).toBe(deque.size)
39 expect(deque.head).toMatchObject({ value: 2 })
40 expect(deque.tail).toMatchObject({ value: 1 })
41 rtSize = deque.unshift(3)
42 expect(deque.size).toBe(3)
43 expect(deque.maxSize).toBe(3)
44 expect(rtSize).toBe(deque.size)
45 expect(deque.head).toMatchObject({ value: 3 })
46 expect(deque.tail).toMatchObject({ value: 1 })
47 })
48
49 it('Verify pop() behavior', () => {
50 const deque = new Deque()
51 deque.push(1)
52 deque.push(2)
53 deque.push(3)
54 let rtItem = deque.pop()
55 expect(deque.size).toBe(2)
56 expect(deque.maxSize).toBe(3)
57 expect(rtItem).toBe(3)
58 expect(deque.head).toMatchObject({ value: 1 })
59 expect(deque.tail).toMatchObject({ value: 2 })
60 rtItem = deque.pop()
61 expect(deque.size).toBe(1)
62 expect(deque.maxSize).toBe(3)
63 expect(rtItem).toBe(2)
64 expect(deque.head).toMatchObject({ value: 1 })
65 expect(deque.tail).toMatchObject({ value: 1 })
66 rtItem = deque.pop()
67 expect(deque.size).toBe(0)
68 expect(deque.maxSize).toBe(3)
69 expect(rtItem).toBe(1)
70 expect(deque.head).toBeUndefined()
71 expect(deque.tail).toBeUndefined()
72 })
73
74 it('Verify shift() behavior', () => {
75 const deque = new Deque()
76 deque.push(1)
77 deque.push(2)
78 deque.push(3)
79 let rtItem = deque.shift()
80 expect(deque.size).toBe(2)
81 expect(deque.maxSize).toBe(3)
82 expect(rtItem).toBe(1)
83 expect(deque.head).toMatchObject({ value: 2 })
84 expect(deque.tail).toMatchObject({ value: 3 })
85 rtItem = deque.shift()
86 expect(deque.size).toBe(1)
87 expect(deque.maxSize).toBe(3)
88 expect(rtItem).toBe(2)
89 expect(deque.head).toMatchObject({ value: 3 })
90 expect(deque.tail).toMatchObject({ value: 3 })
91 rtItem = deque.shift()
92 expect(deque.size).toBe(0)
93 expect(deque.maxSize).toBe(3)
94 expect(rtItem).toBe(3)
95 expect(deque.head).toBeUndefined()
96 expect(deque.tail).toBeUndefined()
97 })
98
99 it('Verify clear() behavior', () => {
100 const deque = new Deque()
101 deque.push(1)
102 deque.push(2)
103 deque.push(3)
104 expect(deque.size).toBe(3)
105 expect(deque.maxSize).toBe(3)
106 expect(deque.head).toMatchObject({ value: 1 })
107 expect(deque.tail).toMatchObject({ value: 3 })
108 deque.clear()
109 expect(deque.size).toBe(0)
110 expect(deque.maxSize).toBe(0)
111 expect(deque.head).toBeUndefined()
112 expect(deque.tail).toBeUndefined()
113 })
114
115 it('Verify iterator behavior', () => {
116 const deque = new Deque()
117 deque.push(1)
118 deque.push(2)
119 deque.push(3)
120 let i = 1
121 for (const value of deque) {
122 expect(value).toBe(i)
123 ++i
124 }
125 })
126 })