ringBuffer.test.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import { describe, expect, it } from 'vitest'
  2. import { RingBuffer } from './ringBuffer'
  3. describe('RingBuffer', () => {
  4. it('follows FIFO order when popping from the front', () => {
  5. const buffer = new RingBuffer<number>(5)
  6. buffer.pushBack(1)
  7. buffer.pushBack(2)
  8. buffer.pushBack(3)
  9. expect(buffer.popFront()).toBe(1)
  10. expect(buffer.popFront()).toBe(2)
  11. expect(buffer.popFront()).toBe(3)
  12. expect(buffer.popFront()).toBeUndefined()
  13. })
  14. it('supports popping from the back', () => {
  15. const buffer = new RingBuffer<number>(3)
  16. buffer.pushBack(1)
  17. buffer.pushBack(2)
  18. buffer.pushBack(3)
  19. expect(buffer.popBack()).toBe(3)
  20. expect(buffer.popBack()).toBe(2)
  21. expect(buffer.popBack()).toBe(1)
  22. expect(buffer.popBack()).toBeUndefined()
  23. })
  24. it('drops the oldest element when full', () => {
  25. const buffer = new RingBuffer<number>(3)
  26. buffer.pushBack(1)
  27. buffer.pushBack(2)
  28. buffer.pushBack(3)
  29. buffer.pushBack(4)
  30. expect(buffer.length).toBe(3)
  31. expect(buffer.popFront()).toBe(2)
  32. expect(buffer.popFront()).toBe(3)
  33. expect(buffer.popFront()).toBe(4)
  34. })
  35. it('handles mixed operations correctly', () => {
  36. const buffer = new RingBuffer<string>(2)
  37. buffer.pushBack('a')
  38. buffer.pushBack('b')
  39. expect(buffer.popFront()).toBe('a')
  40. buffer.pushBack('c')
  41. buffer.pushBack('d')
  42. expect(buffer.length).toBe(2)
  43. expect(buffer.popBack()).toBe('d')
  44. expect(buffer.popFront()).toBe('c')
  45. expect(buffer.popFront()).toBeUndefined()
  46. })
  47. it('returns undefined when popping from an empty buffer', () => {
  48. const buffer = new RingBuffer<number>(1)
  49. expect(buffer.popFront()).toBeUndefined()
  50. expect(buffer.popBack()).toBeUndefined()
  51. })
  52. it('requires a positive integer capacity', () => {
  53. expect(() => new RingBuffer(0)).toThrow('positive integer')
  54. expect(() => new RingBuffer(-1)).toThrow('positive integer')
  55. expect(() => new RingBuffer(1.5 as unknown as number)).toThrow('positive integer')
  56. })
  57. it('returns the full contents in order via toArray', () => {
  58. const buffer = new RingBuffer<number>(5)
  59. buffer.pushBack(1)
  60. buffer.pushBack(2)
  61. buffer.pushBack(3)
  62. expect(buffer.toArray()).toEqual([1, 2, 3])
  63. })
  64. it('supports slice-style bounds for toArray', () => {
  65. const buffer = new RingBuffer<number>(5)
  66. buffer.pushBack(1)
  67. buffer.pushBack(2)
  68. buffer.pushBack(3)
  69. buffer.pushBack(4)
  70. expect(buffer.toArray(1, 3)).toEqual([2, 3])
  71. expect(buffer.toArray(2)).toEqual([3, 4])
  72. })
  73. it('handles negative and overflowing bounds in toArray', () => {
  74. const buffer = new RingBuffer<number>(4)
  75. buffer.pushBack(10)
  76. buffer.pushBack(20)
  77. buffer.pushBack(30)
  78. buffer.pushBack(40)
  79. expect(buffer.toArray(-2)).toEqual([30, 40])
  80. expect(buffer.toArray(0, -1)).toEqual([10, 20, 30])
  81. expect(buffer.toArray(-5, 10)).toEqual([10, 20, 30, 40])
  82. })
  83. it('returns an empty array when the slice is empty', () => {
  84. const buffer = new RingBuffer<number>(3)
  85. buffer.pushBack(1)
  86. buffer.pushBack(2)
  87. expect(buffer.toArray(5)).toEqual([])
  88. expect(buffer.toArray(2, 2)).toEqual([])
  89. expect(buffer.toArray(2, 1)).toEqual([])
  90. const emptyBuffer = new RingBuffer<number>(3)
  91. expect(emptyBuffer.toArray()).toEqual([])
  92. expect(emptyBuffer.toArray(1)).toEqual([])
  93. })
  94. it('returns entries in order after overwriting oldest values', () => {
  95. const buffer = new RingBuffer<number>(3)
  96. buffer.pushBack(1)
  97. buffer.pushBack(2)
  98. buffer.pushBack(3)
  99. buffer.pushBack(4)
  100. buffer.pushBack(5)
  101. expect(buffer.toArray()).toEqual([3, 4, 5])
  102. expect(buffer.toArray(1)).toEqual([4, 5])
  103. expect(buffer.toArray(-1)).toEqual([5])
  104. })
  105. })