@@ -124,4 +124,211 @@ void testQueueCapacityException() {
124
124
Assertions .assertThrows (IllegalArgumentException .class , () -> new Queue <>(0 ));
125
125
Assertions .assertThrows (IllegalArgumentException .class , () -> new Queue <>(-5 ));
126
126
}
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
+ }
127
334
}
0 commit comments