@@ -124,4 +124,211 @@ void testQueueCapacityException() {
124124 Assertions .assertThrows (IllegalArgumentException .class , () -> new Queue <>(0 ));
125125 Assertions .assertThrows (IllegalArgumentException .class , () -> new Queue <>(-5 ));
126126 }
127+
128+ @ Test
129+ void testCircularBehavior () {
130+ // Test that queue behaves correctly after multiple insert/remove cycles
131+ queue .insert (1 );
132+ queue .insert (2 );
133+ queue .insert (3 );
134+
135+ // Remove all elements
136+ queue .remove (); // removes 1
137+ queue .remove (); // removes 2
138+ queue .remove (); // removes 3
139+
140+ // Add elements again to test circular behavior
141+ queue .insert (4 );
142+ queue .insert (5 );
143+ queue .insert (6 );
144+
145+ Assertions .assertEquals (4 , queue .peekFront ());
146+ Assertions .assertEquals (6 , queue .peekRear ());
147+ Assertions .assertEquals (3 , queue .getSize ());
148+ Assertions .assertTrue (queue .isFull ());
149+ }
150+
151+ @ Test
152+ void testMixedInsertRemoveOperations () {
153+ // Test interleaved insert and remove operations
154+ queue .insert (1 );
155+ queue .insert (2 );
156+
157+ Assertions .assertEquals (1 , queue .remove ());
158+ queue .insert (3 );
159+ queue .insert (4 );
160+
161+ Assertions .assertEquals (2 , queue .remove ());
162+ Assertions .assertEquals (3 , queue .remove ());
163+
164+ queue .insert (5 );
165+ queue .insert (6 );
166+
167+ Assertions .assertEquals (4 , queue .peekFront ());
168+ Assertions .assertEquals (6 , queue .peekRear ());
169+ Assertions .assertEquals (3 , queue .getSize ());
170+ }
171+
172+ @ Test
173+ void testSingleElementOperations () {
174+ // Test operations with single element
175+ queue .insert (42 );
176+
177+ Assertions .assertEquals (42 , queue .peekFront ());
178+ Assertions .assertEquals (42 , queue .peekRear ());
179+ Assertions .assertEquals (1 , queue .getSize ());
180+ Assertions .assertFalse (queue .isEmpty ());
181+ Assertions .assertFalse (queue .isFull ());
182+
183+ Assertions .assertEquals (42 , queue .remove ());
184+ Assertions .assertTrue (queue .isEmpty ());
185+ Assertions .assertEquals (0 , queue .getSize ());
186+ }
187+
188+ @ Test
189+ void testNullValueHandling () {
190+ // Test queue with null values (if supported)
191+ Queue <String > stringQueue = new Queue <>(3 );
192+
193+ Assertions .assertTrue (stringQueue .insert (null ));
194+ Assertions .assertTrue (stringQueue .insert ("test" ));
195+ Assertions .assertTrue (stringQueue .insert (null ));
196+
197+ Assertions .assertNull (stringQueue .peekFront ());
198+ Assertions .assertNull (stringQueue .peekRear ());
199+ Assertions .assertEquals (3 , stringQueue .getSize ());
200+
201+ Assertions .assertNull (stringQueue .remove ());
202+ Assertions .assertEquals ("test" , stringQueue .peekFront ());
203+ }
204+
205+ @ Test
206+ void testDifferentDataTypes () {
207+ // Test queue with different data types
208+ Queue <String > stringQueue = new Queue <>(2 );
209+ stringQueue .insert ("first" );
210+ stringQueue .insert ("second" );
211+
212+ Assertions .assertEquals ("first" , stringQueue .peekFront ());
213+ Assertions .assertEquals ("second" , stringQueue .peekRear ());
214+
215+ Queue <Double > doubleQueue = new Queue <>(2 );
216+ doubleQueue .insert (3.14 );
217+ doubleQueue .insert (2.71 );
218+
219+ Assertions .assertEquals (3.14 , doubleQueue .peekFront ());
220+ Assertions .assertEquals (2.71 , doubleQueue .peekRear ());
221+ }
222+
223+ @ Test
224+ void testLargerCapacityQueue () {
225+ // Test queue with larger capacity
226+ Queue <Integer > largeQueue = new Queue <>(10 );
227+
228+ // Fill the queue
229+ for (int i = 1 ; i <= 10 ; i ++) {
230+ Assertions .assertTrue (largeQueue .insert (i ));
231+ }
232+
233+ Assertions .assertTrue (largeQueue .isFull ());
234+ Assertions .assertFalse (largeQueue .insert (11 ));
235+
236+ // Remove half the elements
237+ for (int i = 1 ; i <= 5 ; i ++) {
238+ Assertions .assertEquals (i , largeQueue .remove ());
239+ }
240+
241+ Assertions .assertEquals (6 , largeQueue .peekFront ());
242+ Assertions .assertEquals (10 , largeQueue .peekRear ());
243+ Assertions .assertEquals (5 , largeQueue .getSize ());
244+ }
245+
246+ @ Test
247+ void testQueueCapacityOne () {
248+ // Test queue with capacity of 1
249+ Queue <Integer > singleQueue = new Queue <>(1 );
250+
251+ Assertions .assertTrue (singleQueue .isEmpty ());
252+ Assertions .assertFalse (singleQueue .isFull ());
253+
254+ Assertions .assertTrue (singleQueue .insert (100 ));
255+ Assertions .assertTrue (singleQueue .isFull ());
256+ Assertions .assertFalse (singleQueue .isEmpty ());
257+ Assertions .assertFalse (singleQueue .insert (200 ));
258+
259+ Assertions .assertEquals (100 , singleQueue .peekFront ());
260+ Assertions .assertEquals (100 , singleQueue .peekRear ());
261+
262+ Assertions .assertEquals (100 , singleQueue .remove ());
263+ Assertions .assertTrue (singleQueue .isEmpty ());
264+ }
265+
266+ @ Test
267+ void testQueueWraparoundIndexing () {
268+ // Test that internal array indexing wraps around correctly
269+ queue .insert (1 );
270+ queue .insert (2 );
271+ queue .insert (3 ); // Queue full
272+
273+ // Remove one element
274+ queue .remove (); // removes 1
275+
276+ // Add another element (should wrap around)
277+ queue .insert (4 );
278+
279+ Assertions .assertEquals ("[2, 3, 4]" , queue .toString ());
280+ Assertions .assertEquals (2 , queue .peekFront ());
281+ Assertions .assertEquals (4 , queue .peekRear ());
282+
283+ // Continue the pattern
284+ queue .remove (); // removes 2
285+ queue .insert (5 );
286+
287+ Assertions .assertEquals (3 , queue .peekFront ());
288+ Assertions .assertEquals (5 , queue .peekRear ());
289+ }
290+
291+ @ Test
292+ void testQueueStateAfterMultipleCycles () {
293+ // Test queue state after multiple complete fill/empty cycles
294+ for (int cycle = 0 ; cycle < 3 ; cycle ++) {
295+ // Fill the queue
296+ for (int i = 1 ; i <= 3 ; i ++) {
297+ queue .insert (i + cycle * 10 );
298+ }
299+
300+ // Verify state
301+ Assertions .assertTrue (queue .isFull ());
302+ Assertions .assertEquals (3 , queue .getSize ());
303+
304+ // Empty the queue
305+ for (int i = 1 ; i <= 3 ; i ++) {
306+ queue .remove ();
307+ }
308+
309+ // Verify empty state
310+ Assertions .assertTrue (queue .isEmpty ());
311+ Assertions .assertEquals (0 , queue .getSize ());
312+ }
313+ }
314+
315+ @ Test
316+ void testQueueConsistencyAfterOperations () {
317+ // Test that queue maintains consistency after various operations
318+ queue .insert (10 );
319+ queue .insert (20 );
320+
321+ int firstRemoved = queue .remove ();
322+ queue .insert (30 );
323+ queue .insert (40 );
324+
325+ int secondRemoved = queue .remove ();
326+ queue .insert (50 );
327+
328+ // Verify the order is maintained
329+ Assertions .assertEquals (10 , firstRemoved );
330+ Assertions .assertEquals (20 , secondRemoved );
331+ Assertions .assertEquals (30 , queue .peekFront ());
332+ Assertions .assertEquals (50 , queue .peekRear ());
333+ }
127334}
0 commit comments