+const { expect } = require('expect')
+const { Deque } = require('../lib/deque')
+
+describe('Deque test suite', () => {
+ it('Verify push() behavior', () => {
+ const deque = new Deque()
+ let rtSize = deque.push(1)
+ expect(deque.size).toBe(1)
+ expect(deque.maxSize).toBe(1)
+ expect(rtSize).toBe(deque.size)
+ expect(deque.head).toMatchObject({ value: 1 })
+ expect(deque.tail).toMatchObject({ value: 1 })
+ rtSize = deque.push(2)
+ expect(deque.size).toBe(2)
+ expect(deque.maxSize).toBe(2)
+ expect(rtSize).toBe(deque.size)
+ expect(deque.head).toMatchObject({ value: 1 })
+ expect(deque.tail).toMatchObject({ value: 2 })
+ rtSize = deque.push(3)
+ expect(deque.size).toBe(3)
+ expect(deque.maxSize).toBe(3)
+ expect(rtSize).toBe(deque.size)
+ expect(deque.head).toMatchObject({ value: 1 })
+ expect(deque.tail).toMatchObject({ value: 3 })
+ })
+
+ it('Verify unshift() behavior', () => {
+ const deque = new Deque()
+ let rtSize = deque.unshift(1)
+ expect(deque.size).toBe(1)
+ expect(deque.maxSize).toBe(1)
+ expect(rtSize).toBe(deque.size)
+ expect(deque.head).toMatchObject({ value: 1 })
+ expect(deque.tail).toMatchObject({ value: 1 })
+ rtSize = deque.unshift(2)
+ expect(deque.size).toBe(2)
+ expect(deque.maxSize).toBe(2)
+ expect(rtSize).toBe(deque.size)
+ expect(deque.head).toMatchObject({ value: 2 })
+ expect(deque.tail).toMatchObject({ value: 1 })
+ rtSize = deque.unshift(3)
+ expect(deque.size).toBe(3)
+ expect(deque.maxSize).toBe(3)
+ expect(rtSize).toBe(deque.size)
+ expect(deque.head).toMatchObject({ value: 3 })
+ expect(deque.tail).toMatchObject({ value: 1 })
+ })
+
+ it('Verify pop() behavior', () => {
+ const deque = new Deque()
+ deque.push(1)
+ deque.push(2)
+ deque.push(3)
+ let rtItem = deque.pop()
+ expect(deque.size).toBe(2)
+ expect(deque.maxSize).toBe(3)
+ expect(rtItem).toBe(3)
+ expect(deque.head).toMatchObject({ value: 1 })
+ expect(deque.tail).toMatchObject({ value: 2 })
+ rtItem = deque.pop()
+ expect(deque.size).toBe(1)
+ expect(deque.maxSize).toBe(3)
+ expect(rtItem).toBe(2)
+ expect(deque.head).toMatchObject({ value: 1 })
+ expect(deque.tail).toMatchObject({ value: 1 })
+ rtItem = deque.pop()
+ expect(deque.size).toBe(0)
+ expect(deque.maxSize).toBe(3)
+ expect(rtItem).toBe(1)
+ expect(deque.head).toBeUndefined()
+ expect(deque.tail).toBeUndefined()
+ })
+
+ it('Verify shift() behavior', () => {
+ const deque = new Deque()
+ deque.push(1)
+ deque.push(2)
+ deque.push(3)
+ let rtItem = deque.shift()
+ expect(deque.size).toBe(2)
+ expect(deque.maxSize).toBe(3)
+ expect(rtItem).toBe(1)
+ expect(deque.head).toMatchObject({ value: 2 })
+ expect(deque.tail).toMatchObject({ value: 3 })
+ rtItem = deque.shift()
+ expect(deque.size).toBe(1)
+ expect(deque.maxSize).toBe(3)
+ expect(rtItem).toBe(2)
+ expect(deque.head).toMatchObject({ value: 3 })
+ expect(deque.tail).toMatchObject({ value: 3 })
+ rtItem = deque.shift()
+ expect(deque.size).toBe(0)
+ expect(deque.maxSize).toBe(3)
+ expect(rtItem).toBe(3)
+ expect(deque.head).toBeUndefined()
+ expect(deque.tail).toBeUndefined()
+ })
+
+ it('Verify clear() behavior', () => {
+ const deque = new Deque()
+ deque.push(1)
+ deque.push(2)
+ deque.push(3)
+ expect(deque.size).toBe(3)
+ expect(deque.maxSize).toBe(3)
+ expect(deque.head).toMatchObject({ value: 1 })
+ expect(deque.tail).toMatchObject({ value: 3 })
+ deque.clear()
+ expect(deque.size).toBe(0)
+ expect(deque.maxSize).toBe(0)
+ expect(deque.head).toBeUndefined()
+ expect(deque.tail).toBeUndefined()
+ })
+
+ it('Verify iterator behavior', () => {
+ const deque = new Deque()
+ deque.push(1)
+ deque.push(2)
+ deque.push(3)
+ let i = 1
+ for (const value of deque) {
+ expect(value).toBe(i)
+ ++i
+ }
+ })
+})