Merge pull request #2313 from poolifier/dependabot/npm_and_yarn/eslint-plugin-jsdoc...
[poolifier.git] / tests / circular-buffer.test.mjs
1 import { expect } from 'expect'
2
3 import { CircularBuffer, defaultBufferSize } from '../lib/circular-buffer.cjs'
4
5 describe('Circular buffer test suite', t => {
6 it('Verify that circular buffer can be instantiated', () => {
7 const circularBuffer = new CircularBuffer()
8 expect(circularBuffer).toBeInstanceOf(CircularBuffer)
9 expect(circularBuffer.readIdx).toBe(0)
10 expect(circularBuffer.writeIdx).toBe(0)
11 expect(circularBuffer.maxArrayIdx).toBe(defaultBufferSize - 1)
12 expect(circularBuffer.size).toBe(0)
13 expect(circularBuffer.items).toBeInstanceOf(Array)
14 expect(circularBuffer.items.length).toBe(defaultBufferSize)
15 })
16
17 it('Verify that circular buffer size can be set at instance creation', () => {
18 const size = 1000
19 const circularBuffer = new CircularBuffer(size)
20 expect(circularBuffer.maxArrayIdx).toBe(size - 1)
21 expect(circularBuffer.items).toBeInstanceOf(Array)
22 expect(circularBuffer.items.length).toBe(size)
23 })
24
25 it('Verify that circular buffer size is valid at instance creation', () => {
26 expect(() => new CircularBuffer(0.25)).toThrow(
27 new TypeError('Invalid circular buffer size: 0.25 is not an integer')
28 )
29 expect(() => new CircularBuffer(-1)).toThrow(
30 new RangeError('Invalid circular buffer size: -1 < 0')
31 )
32 expect(() => new CircularBuffer(Number.MAX_SAFE_INTEGER + 1)).toThrow(
33 new TypeError(
34 `Invalid circular buffer size: ${
35 Number.MAX_SAFE_INTEGER + 1
36 } is not an integer`
37 )
38 )
39 })
40
41 it('Verify that circular buffer put() works as intended', () => {
42 const circularBuffer = new CircularBuffer(4)
43 circularBuffer.put(1)
44 expect(circularBuffer.items).toMatchObject([1])
45 expect(circularBuffer.writeIdx).toBe(1)
46 expect(circularBuffer.size).toBe(1)
47 circularBuffer.put(2)
48 expect(circularBuffer.items).toMatchObject([1, 2])
49 expect(circularBuffer.writeIdx).toBe(2)
50 expect(circularBuffer.size).toBe(2)
51 circularBuffer.put(3)
52 expect(circularBuffer.items).toMatchObject([1, 2, 3])
53 expect(circularBuffer.writeIdx).toBe(3)
54 expect(circularBuffer.size).toBe(3)
55 circularBuffer.put(4)
56 expect(circularBuffer.items).toMatchObject([1, 2, 3, 4])
57 expect(circularBuffer.writeIdx).toBe(0)
58 expect(circularBuffer.size).toBe(4)
59 circularBuffer.put(5)
60 expect(circularBuffer.items).toMatchObject([5, 2, 3, 4])
61 expect(circularBuffer.writeIdx).toBe(1)
62 expect(circularBuffer.size).toBe(4)
63 circularBuffer.put(6)
64 expect(circularBuffer.items).toMatchObject([5, 6, 3, 4])
65 expect(circularBuffer.writeIdx).toBe(2)
66 expect(circularBuffer.size).toBe(4)
67 })
68
69 it('Verify that circular buffer get() works as intended', () => {
70 const circularBuffer = new CircularBuffer(4)
71 circularBuffer.put(1)
72 circularBuffer.put(2)
73 circularBuffer.put(3)
74 circularBuffer.put(4)
75 expect(circularBuffer.get()).toBe(1)
76 expect(circularBuffer.readIdx).toBe(1)
77 expect(circularBuffer.size).toBe(3)
78 expect(circularBuffer.get()).toBe(2)
79 expect(circularBuffer.readIdx).toBe(2)
80 expect(circularBuffer.size).toBe(2)
81 circularBuffer.put(5)
82 circularBuffer.put(6)
83 expect(circularBuffer.get()).toBe(3)
84 expect(circularBuffer.readIdx).toBe(3)
85 expect(circularBuffer.size).toBe(3)
86 expect(circularBuffer.get()).toBe(4)
87 expect(circularBuffer.readIdx).toBe(0)
88 expect(circularBuffer.size).toBe(2)
89 expect(circularBuffer.get()).toBe(5)
90 expect(circularBuffer.readIdx).toBe(1)
91 expect(circularBuffer.size).toBe(1)
92 expect(circularBuffer.get()).toBe(6)
93 expect(circularBuffer.readIdx).toBe(2)
94 expect(circularBuffer.size).toBe(0)
95 expect(circularBuffer.get()).toBe(undefined)
96 expect(circularBuffer.readIdx).toBe(2)
97 expect(circularBuffer.size).toBe(0)
98 })
99
100 it('Verify that circular buffer empty() works as intended', () => {
101 const circularBuffer = new CircularBuffer(4)
102 expect(circularBuffer.empty()).toBe(true)
103 circularBuffer.put(1)
104 expect(circularBuffer.empty()).toBe(false)
105 circularBuffer.put(2)
106 expect(circularBuffer.empty()).toBe(false)
107 circularBuffer.put(3)
108 expect(circularBuffer.empty()).toBe(false)
109 circularBuffer.put(4)
110 expect(circularBuffer.empty()).toBe(false)
111 circularBuffer.get()
112 expect(circularBuffer.empty()).toBe(false)
113 circularBuffer.get()
114 expect(circularBuffer.empty()).toBe(false)
115 circularBuffer.get()
116 expect(circularBuffer.empty()).toBe(false)
117 circularBuffer.get()
118 expect(circularBuffer.empty()).toBe(true)
119 })
120
121 it('Verify that circular buffer full() works as intended', () => {
122 const circularBuffer = new CircularBuffer(4)
123 expect(circularBuffer.full()).toBe(false)
124 circularBuffer.put(1)
125 expect(circularBuffer.full()).toBe(false)
126 circularBuffer.put(2)
127 expect(circularBuffer.full()).toBe(false)
128 circularBuffer.put(3)
129 expect(circularBuffer.full()).toBe(false)
130 circularBuffer.put(4)
131 expect(circularBuffer.full()).toBe(true)
132 circularBuffer.get()
133 expect(circularBuffer.full()).toBe(false)
134 circularBuffer.put(5)
135 expect(circularBuffer.full()).toBe(true)
136 circularBuffer.get()
137 expect(circularBuffer.full()).toBe(false)
138 circularBuffer.get()
139 expect(circularBuffer.full()).toBe(false)
140 circularBuffer.get()
141 expect(circularBuffer.full()).toBe(false)
142 circularBuffer.get()
143 expect(circularBuffer.full()).toBe(false)
144 expect(circularBuffer.empty()).toBe(true)
145 })
146
147 it('Verify that circular buffer toArray() works as intended', () => {
148 const circularBuffer = new CircularBuffer(4)
149 circularBuffer.put(1)
150 circularBuffer.put(2)
151 circularBuffer.put(3)
152 circularBuffer.put(4)
153 circularBuffer.put(5)
154 circularBuffer.put(6)
155 expect(circularBuffer.toArray()).toStrictEqual([5, 6, 3, 4])
156 })
157 })