Testing an Iterator
Here is the Set interface. It extends Iterable<T>, so every set has an iterator() method:
public interface Set<T> extends Iterable<T> {
boolean add(T item); // adds item if it is absent; returns true if the set changed
boolean remove(T item); // removes item if it is present; returns true if the set changed
boolean contains(T item); // returns true if item is in the set
int size(); // returns the number of items in the set
// inherited from Iterable<T>:
// Iterator<T> iterator(); returns an iterator over the items, in no promised order
}
SetTest is an abstract JUnit test class. Its tests run against every implementation of Set. Before each test, its field set holds a new, empty Set<Integer>:
public abstract class SetTest {
protected Set<Integer> set;
protected abstract Set<Integer> createSet();
@BeforeEach
public void setup() {
set = createSet();
}
}
Solution
@Test
public void iteratorVisitsEveryElement() {
set.add(4);
set.add(9);
set.add(15);
List<Integer> seen = new ArrayList<>();
for (Integer x : set) {
seen.add(x);
}
assertEquals(3, seen.size());
assertTrue(seen.contains(4));
assertTrue(seen.contains(9));
assertTrue(seen.contains(15));
}