@@ -5,25 +5,34 @@ import { Queue } from './queue';
55
66describe ( 'Queue' , ( ) => {
77 it ( 'should initialize an empty queue' , ( ) => {
8- const queue = new Queue < number > ( ) ;
8+ const queue = new Queue < number > ( { size : 5 } ) ;
99 expect ( queue . size ) . toBe ( 0 ) ;
1010 } ) ;
1111
1212 it ( 'should initialize a queue with initial items' , ( ) => {
13- const queue = new Queue < number > ( [ 1 , 2 , 3 ] ) ;
13+ const queue = new Queue < number > ( { initialItems : [ 1 , 2 , 3 ] , size : 3 } ) ;
1414 expect ( queue . size ) . toBe ( 3 ) ;
1515 } ) ;
1616
17- it ( 'should push items to the queue' , ( ) => {
18- const queue = new Queue < string > ( ) ;
17+ it ( 'should throw an error if initial items exceed capacity' , ( ) => {
18+ expect ( ( ) => new Queue < number > ( { initialItems : [ 1 , 2 , 3 , 4 ] , size : 3 } ) ) . toThrow ( 'Initial items exceed queue capacity' ) ;
19+ } ) ;
20+
21+ it ( 'should push items to the queue up to its capacity' , ( ) => {
22+ const queue = new Queue < string > ( { size : 2 } ) ;
1923 queue . push ( 'a' ) ;
2024 expect ( queue . size ) . toBe ( 1 ) ;
2125 queue . push ( 'b' ) ;
2226 expect ( queue . size ) . toBe ( 2 ) ;
2327 } ) ;
2428
29+ it ( 'should throw an error when pushing to a full queue' , ( ) => {
30+ const queue = new Queue < string > ( { initialItems : [ 'a' ] , size : 1 } ) ;
31+ expect ( ( ) => queue . push ( 'b' ) ) . toThrow ( 'Queue is full' ) ;
32+ } ) ;
33+
2534 it ( 'should shift items from the queue in FIFO order' , ( ) => {
26- const queue = new Queue < number > ( [ 1 , 2 , 3 ] ) ;
35+ const queue = new Queue < number > ( { initialItems : [ 1 , 2 , 3 ] , size : 3 } ) ;
2736 expect ( queue . shift ( ) ) . toBe ( 1 ) ;
2837 expect ( queue . size ) . toBe ( 2 ) ;
2938 expect ( queue . shift ( ) ) . toBe ( 2 ) ;
@@ -33,12 +42,12 @@ describe('Queue', () => {
3342 } ) ;
3443
3544 it ( 'should throw an error when shifting from an empty queue' , ( ) => {
36- const queue = new Queue < number > ( ) ;
45+ const queue = new Queue < number > ( { size : 5 } ) ;
3746 expect ( ( ) => queue . shift ( ) ) . toThrow ( 'Queue is empty' ) ;
3847 } ) ;
3948
4049 it ( 'should handle a mix of push and shift operations correctly' , ( ) => {
41- const queue = new Queue < string > ( ) ;
50+ const queue = new Queue < string > ( { size : 2 } ) ;
4251 queue . push ( 'one' ) ;
4352 queue . push ( 'two' ) ;
4453 expect ( queue . shift ( ) ) . toBe ( 'one' ) ;
@@ -50,10 +59,23 @@ describe('Queue', () => {
5059 } ) ;
5160
5261 it ( 'should report correct size after multiple pushes and shifts' , ( ) => {
53- const queue = new Queue < number > ( [ 1 , 2 ] ) ;
62+ const queue = new Queue < number > ( { initialItems : [ 1 , 2 ] , size : 5 } ) ;
5463 queue . push ( 3 ) ;
5564 expect ( queue . size ) . toBe ( 3 ) ;
56- queue . shift ( ) ; // 1
65+ queue . shift ( ) ;
66+ expect ( queue . size ) . toBe ( 2 ) ;
67+ queue . push ( 4 ) ;
68+ expect ( queue . size ) . toBe ( 3 ) ;
69+ expect ( queue . shift ( ) ) . toBe ( 2 ) ;
70+ expect ( queue . shift ( ) ) . toBe ( 3 ) ;
71+ expect ( queue . shift ( ) ) . toBe ( 4 ) ;
72+ expect ( queue . size ) . toBe ( 0 ) ;
73+ } ) ;
74+
75+ it ( 'should allow pushing after shifting from a full queue' , ( ) => {
76+ const queue = new Queue < number > ( { initialItems : [ 1 , 2 , 3 ] , size : 3 } ) ;
77+ expect ( queue . size ) . toBe ( 3 ) ;
78+ expect ( queue . shift ( ) ) . toBe ( 1 ) ;
5779 expect ( queue . size ) . toBe ( 2 ) ;
5880 queue . push ( 4 ) ;
5981 expect ( queue . size ) . toBe ( 3 ) ;
@@ -62,4 +84,59 @@ describe('Queue', () => {
6284 expect ( queue . shift ( ) ) . toBe ( 4 ) ;
6385 expect ( queue . size ) . toBe ( 0 ) ;
6486 } ) ;
87+
88+ it ( 'should throw if initializing with more items than queue size' , ( ) => {
89+ expect ( ( ) => new Queue < number > ( { initialItems : [ 1 , 2 ] , size : 1 } ) ) . toThrow ( 'Initial items exceed queue capacity' ) ;
90+ } ) ;
91+
92+ it ( 'should throw if initializing with non-positive size' , ( ) => {
93+ expect ( ( ) => new Queue < number > ( { size : 0 } ) ) . toThrow ( 'Queue size must be positive' ) ;
94+ } ) ;
95+
96+ it ( 'should handle operations on a queue of size 1' , ( ) => {
97+ const queue = new Queue < number > ( { size : 1 } ) ;
98+ expect ( queue . size ) . toBe ( 0 ) ;
99+
100+ queue . push ( 10 ) ;
101+ expect ( queue . size ) . toBe ( 1 ) ;
102+ expect ( ( ) => queue . push ( 20 ) ) . toThrow ( 'Queue is full' ) ;
103+
104+ expect ( queue . shift ( ) ) . toBe ( 10 ) ;
105+ expect ( queue . size ) . toBe ( 0 ) ;
106+ expect ( ( ) => queue . shift ( ) ) . toThrow ( 'Queue is empty' ) ;
107+
108+ queue . push ( 30 ) ;
109+ expect ( queue . size ) . toBe ( 1 ) ;
110+ expect ( queue . shift ( ) ) . toBe ( 30 ) ;
111+ } ) ;
112+
113+ it ( 'should correctly handle fill-empty-fill-empty cycles (circular buffer integrity)' , ( ) => {
114+ const queue = new Queue < number > ( { size : 3 } ) ;
115+
116+ // Fill 1
117+ queue . push ( 1 ) ;
118+ queue . push ( 2 ) ;
119+ queue . push ( 3 ) ;
120+ expect ( queue . size ) . toBe ( 3 ) ;
121+ expect ( ( ) => queue . push ( 4 ) ) . toThrow ( 'Queue is full' ) ;
122+
123+ // Empty 1
124+ expect ( queue . shift ( ) ) . toBe ( 1 ) ;
125+ expect ( queue . shift ( ) ) . toBe ( 2 ) ;
126+ expect ( queue . shift ( ) ) . toBe ( 3 ) ;
127+ expect ( queue . size ) . toBe ( 0 ) ;
128+ expect ( ( ) => queue . shift ( ) ) . toThrow ( 'Queue is empty' ) ;
129+
130+ // Fill 2 (after wrapping)
131+ queue . push ( 10 ) ;
132+ queue . push ( 20 ) ;
133+ queue . push ( 30 ) ;
134+ expect ( queue . size ) . toBe ( 3 ) ;
135+
136+ // Empty 2
137+ expect ( queue . shift ( ) ) . toBe ( 10 ) ;
138+ expect ( queue . shift ( ) ) . toBe ( 20 ) ;
139+ expect ( queue . shift ( ) ) . toBe ( 30 ) ;
140+ expect ( queue . size ) . toBe ( 0 ) ;
141+ } ) ;
65142} ) ;
0 commit comments