|
6 | 6 | import static org.junit.jupiter.api.Assertions.assertTrue;
|
7 | 7 |
|
8 | 8 | import com.thealgorithms.datastructures.bags.Bag;
|
| 9 | +import java.util.ArrayList; |
9 | 10 | import java.util.Iterator;
|
| 11 | +import java.util.List; |
| 12 | +import java.util.NoSuchElementException; |
10 | 13 | import org.junit.jupiter.api.Test;
|
11 | 14 |
|
12 | 15 | class BagTest {
|
@@ -156,4 +159,116 @@ void testIteratorWithDuplicates() {
|
156 | 159 | }
|
157 | 160 | assertEquals(3, count, "Iterator should traverse all 3 items including duplicates");
|
158 | 161 | }
|
| 162 | + |
| 163 | + @Test |
| 164 | + void testCollectionElements() { |
| 165 | + Bag<List<String>> bag = new Bag<>(); |
| 166 | + List<String> list1 = new ArrayList<>(); |
| 167 | + list1.add("a"); |
| 168 | + list1.add("b"); |
| 169 | + |
| 170 | + List<String> list2 = new ArrayList<>(); |
| 171 | + list2.add("c"); |
| 172 | + |
| 173 | + List<String> emptyList = new ArrayList<>(); |
| 174 | + |
| 175 | + bag.add(list1); |
| 176 | + bag.add(list2); |
| 177 | + bag.add(emptyList); |
| 178 | + bag.add(list1); // Duplicate |
| 179 | + |
| 180 | + assertEquals(4, bag.size(), "Bag should contain 4 list elements"); |
| 181 | + assertTrue(bag.contains(list1), "Bag should contain list1"); |
| 182 | + assertTrue(bag.contains(list2), "Bag should contain list2"); |
| 183 | + assertTrue(bag.contains(emptyList), "Bag should contain empty list"); |
| 184 | + } |
| 185 | + |
| 186 | + @Test |
| 187 | + void testIteratorConsistency() { |
| 188 | + Bag<String> bag = new Bag<>(); |
| 189 | + bag.add("first"); |
| 190 | + bag.add("second"); |
| 191 | + bag.add("third"); |
| 192 | + |
| 193 | + // Multiple iterations should return same elements |
| 194 | + List<String> firstIteration = new ArrayList<>(); |
| 195 | + for (String item : bag) { |
| 196 | + firstIteration.add(item); |
| 197 | + } |
| 198 | + |
| 199 | + List<String> secondIteration = new ArrayList<>(); |
| 200 | + for (String item : bag) { |
| 201 | + secondIteration.add(item); |
| 202 | + } |
| 203 | + |
| 204 | + assertEquals(firstIteration.size(), secondIteration.size(), "Both iterations should have same size"); |
| 205 | + assertEquals(3, firstIteration.size(), "First iteration should have 3 elements"); |
| 206 | + assertEquals(3, secondIteration.size(), "Second iteration should have 3 elements"); |
| 207 | + } |
| 208 | + |
| 209 | + @Test |
| 210 | + void testMultipleIterators() { |
| 211 | + Bag<String> bag = new Bag<>(); |
| 212 | + bag.add("item1"); |
| 213 | + bag.add("item2"); |
| 214 | + |
| 215 | + Iterator<String> iter1 = bag.iterator(); |
| 216 | + Iterator<String> iter2 = bag.iterator(); |
| 217 | + |
| 218 | + assertTrue(iter1.hasNext(), "First iterator should have next element"); |
| 219 | + assertTrue(iter2.hasNext(), "Second iterator should have next element"); |
| 220 | + |
| 221 | + String first1 = iter1.next(); |
| 222 | + String first2 = iter2.next(); |
| 223 | + |
| 224 | + org.junit.jupiter.api.Assertions.assertNotNull(first1, "First iterator should return non-null element"); |
| 225 | + org.junit.jupiter.api.Assertions.assertNotNull(first2, "Second iterator should return non-null element"); |
| 226 | + } |
| 227 | + |
| 228 | + @Test |
| 229 | + void testIteratorHasNextConsistency() { |
| 230 | + Bag<String> bag = new Bag<>(); |
| 231 | + bag.add("single"); |
| 232 | + |
| 233 | + Iterator<String> iter = bag.iterator(); |
| 234 | + assertTrue(iter.hasNext(), "hasNext should return true"); |
| 235 | + assertTrue(iter.hasNext(), "hasNext should still return true after multiple calls"); |
| 236 | + |
| 237 | + String item = iter.next(); |
| 238 | + assertEquals("single", item, "Next should return the single item"); |
| 239 | + |
| 240 | + assertFalse(iter.hasNext(), "hasNext should return false after consuming element"); |
| 241 | + assertFalse(iter.hasNext(), "hasNext should still return false"); |
| 242 | + } |
| 243 | + |
| 244 | + @Test |
| 245 | + void testIteratorNextOnEmptyBag() { |
| 246 | + Bag<String> bag = new Bag<>(); |
| 247 | + Iterator<String> iter = bag.iterator(); |
| 248 | + |
| 249 | + assertFalse(iter.hasNext(), "hasNext should return false for empty bag"); |
| 250 | + assertThrows(NoSuchElementException.class, iter::next, "next() should throw NoSuchElementException on empty bag"); |
| 251 | + } |
| 252 | + |
| 253 | + @Test |
| 254 | + void testBagOrderIndependence() { |
| 255 | + Bag<String> bag1 = new Bag<>(); |
| 256 | + Bag<String> bag2 = new Bag<>(); |
| 257 | + |
| 258 | + // Add same elements in different order |
| 259 | + bag1.add("first"); |
| 260 | + bag1.add("second"); |
| 261 | + bag1.add("third"); |
| 262 | + |
| 263 | + bag2.add("third"); |
| 264 | + bag2.add("first"); |
| 265 | + bag2.add("second"); |
| 266 | + |
| 267 | + assertEquals(bag1.size(), bag2.size(), "Bags should have same size"); |
| 268 | + |
| 269 | + // Both bags should contain all elements |
| 270 | + assertTrue(bag1.contains("first") && bag2.contains("first")); |
| 271 | + assertTrue(bag1.contains("second") && bag2.contains("second")); |
| 272 | + assertTrue(bag1.contains("third") && bag2.contains("third")); |
| 273 | + } |
159 | 274 | }
|
0 commit comments