22
33import static org .junit .jupiter .api .Assertions .assertEquals ;
44import static org .junit .jupiter .api .Assertions .assertNull ;
5- import static org .junit .jupiter .api .Assertions .assertThrows ;
65import static org .junit .jupiter .api .Assertions .assertTrue ;
76
87import org .junit .jupiter .api .Test ;
@@ -68,11 +67,11 @@ void testFullBuffer() {
6867
6968 @ Test
7069 void testIllegalArguments () {
71- assertThrows (IllegalArgumentException .class , () -> new CircularBuffer <>(0 ));
72- assertThrows (IllegalArgumentException .class , () -> new CircularBuffer <>(-1 ));
70+ org . junit . jupiter . api . Assertions . assertThrows (IllegalArgumentException .class , () -> new CircularBuffer <>(0 ));
71+ org . junit . jupiter . api . Assertions . assertThrows (IllegalArgumentException .class , () -> new CircularBuffer <>(-1 ));
7372
7473 CircularBuffer <String > buffer = new CircularBuffer <>(1 );
75- assertThrows (IllegalArgumentException .class , () -> buffer .put (null ));
74+ org . junit . jupiter . api . Assertions . assertThrows (IllegalArgumentException .class , () -> buffer .put (null ));
7675 }
7776
7877 @ Test
@@ -85,4 +84,149 @@ void testLargeBuffer() {
8584 buffer .put (1000 ); // This should overwrite 0
8685 assertEquals (1 , buffer .get ());
8786 }
87+
88+ @ Test
89+ void testPutAfterGet () {
90+ CircularBuffer <Integer > buffer = new CircularBuffer <>(2 );
91+ buffer .put (10 );
92+ buffer .put (20 );
93+ assertEquals (10 , buffer .get ());
94+ buffer .put (30 );
95+ assertEquals (20 , buffer .get ());
96+ assertEquals (30 , buffer .get ());
97+ assertNull (buffer .get ());
98+ }
99+
100+ @ Test
101+ void testMultipleWrapArounds () {
102+ CircularBuffer <Integer > buffer = new CircularBuffer <>(3 );
103+ for (int i = 1 ; i <= 6 ; i ++) {
104+ buffer .put (i );
105+ buffer .get (); // add and immediately remove
106+ }
107+ assertTrue (buffer .isEmpty ());
108+ assertNull (buffer .get ());
109+ }
110+
111+ @ Test
112+ void testOverwriteMultipleTimes () {
113+ CircularBuffer <String > buffer = new CircularBuffer <>(2 );
114+ buffer .put ("X" );
115+ buffer .put ("Y" );
116+ buffer .put ("Z" ); // overwrites "X"
117+ buffer .put ("W" ); // overwrites "Y"
118+ assertEquals ("Z" , buffer .get ());
119+ assertEquals ("W" , buffer .get ());
120+ assertNull (buffer .get ());
121+ }
122+
123+ @ Test
124+ void testIsEmptyAndIsFullTransitions () {
125+ CircularBuffer <Integer > buffer = new CircularBuffer <>(2 );
126+ assertTrue (buffer .isEmpty ());
127+ org .junit .jupiter .api .Assertions .assertFalse (buffer .isFull ());
128+
129+ buffer .put (1 );
130+ org .junit .jupiter .api .Assertions .assertFalse (buffer .isEmpty ());
131+ org .junit .jupiter .api .Assertions .assertFalse (buffer .isFull ());
132+
133+ buffer .put (2 );
134+ assertTrue (buffer .isFull ());
135+
136+ buffer .get ();
137+ org .junit .jupiter .api .Assertions .assertFalse (buffer .isFull ());
138+
139+ buffer .get ();
140+ assertTrue (buffer .isEmpty ());
141+ }
142+
143+ @ Test
144+ void testInterleavedPutAndGet () {
145+ CircularBuffer <String > buffer = new CircularBuffer <>(3 );
146+ buffer .put ("A" );
147+ buffer .put ("B" );
148+ assertEquals ("A" , buffer .get ());
149+ buffer .put ("C" );
150+ assertEquals ("B" , buffer .get ());
151+ assertEquals ("C" , buffer .get ());
152+ assertNull (buffer .get ());
153+ }
154+
155+ @ Test
156+ void testRepeatedNullInsertionThrows () {
157+ CircularBuffer <Object > buffer = new CircularBuffer <>(5 );
158+ for (int i = 0 ; i < 3 ; i ++) {
159+ int finalI = i ;
160+ org .junit .jupiter .api .Assertions .assertThrows (IllegalArgumentException .class , () -> buffer .put (null ), "Iteration: " + finalI );
161+ }
162+ }
163+ @ Test
164+ void testFillThenEmptyThenReuseBuffer () {
165+ CircularBuffer <Integer > buffer = new CircularBuffer <>(3 );
166+
167+ buffer .put (1 );
168+ buffer .put (2 );
169+ buffer .put (3 );
170+ assertTrue (buffer .isFull ());
171+
172+ assertEquals (1 , buffer .get ());
173+ assertEquals (2 , buffer .get ());
174+ assertEquals (3 , buffer .get ());
175+
176+ assertTrue (buffer .isEmpty ());
177+
178+ buffer .put (4 );
179+ buffer .put (5 );
180+ assertEquals (4 , buffer .get ());
181+ assertEquals (5 , buffer .get ());
182+ assertTrue (buffer .isEmpty ());
183+ }
184+
185+ @ Test
186+ void testPutReturnsTrueOnlyIfPreviouslyEmpty () {
187+ CircularBuffer <String > buffer = new CircularBuffer <>(2 );
188+
189+ assertTrue (buffer .put ("one" )); // was empty
190+ org .junit .jupiter .api .Assertions .assertFalse (buffer .put ("two" )); // not empty
191+ org .junit .jupiter .api .Assertions .assertFalse (buffer .put ("three" )); // overwrite
192+ }
193+
194+ @ Test
195+ void testOverwriteAndGetAllElementsCorrectly () {
196+ CircularBuffer <Integer > buffer = new CircularBuffer <>(3 );
197+
198+ buffer .put (1 );
199+ buffer .put (2 );
200+ buffer .put (3 );
201+ buffer .put (4 ); // Overwrites 1
202+ buffer .put (5 ); // Overwrites 2
203+
204+ assertEquals (3 , buffer .get ());
205+ assertEquals (4 , buffer .get ());
206+ assertEquals (5 , buffer .get ());
207+ assertNull (buffer .get ());
208+ }
209+
210+ @ Test
211+ void testBufferWithOneElementCapacity () {
212+ CircularBuffer <String > buffer = new CircularBuffer <>(1 );
213+
214+ assertTrue (buffer .put ("first" ));
215+ assertEquals ("first" , buffer .get ());
216+ assertNull (buffer .get ());
217+
218+ assertTrue (buffer .put ("second" ));
219+ assertEquals ("second" , buffer .get ());
220+ }
221+
222+ @ Test
223+ void testPointerWraparoundWithExactMultipleOfCapacity () {
224+ CircularBuffer <Integer > buffer = new CircularBuffer <>(3 );
225+ for (int i = 0 ; i < 6 ; i ++) {
226+ buffer .put (i );
227+ buffer .get (); // keep buffer size at 0
228+ }
229+ assertTrue (buffer .isEmpty ());
230+ assertNull (buffer .get ());
231+ }
88232}
0 commit comments