@Override protected S createUpcomingSelection() { // Ideally, this code should have read: // Object entity = entityIterator.next(); // Iterator<Object> valueIterator = valueSelector.iterator(entity); // Object toValue = valueIterator.next(); // But empty selectors and ending selectors (such as non-random or shuffled) make it more // complex if (!entityIterator.hasNext()) { entityIterator = entitySelector.iterator(); if (!entityIterator.hasNext()) { return noUpcomingSelection(); } } Object entity = entityIterator.next(); Iterator<Object> valueIterator = valueSelector.iterator(entity); int entityIteratorCreationCount = 0; // This loop is mostly only relevant when the entityIterator or valueIterator is non-random or // shuffled while (!valueIterator.hasNext()) { // Try the next entity if (!entityIterator.hasNext()) { entityIterator = entitySelector.iterator(); entityIteratorCreationCount++; if (entityIteratorCreationCount >= 2) { // All entity-value combinations have been tried (some even more than once) return noUpcomingSelection(); } } entity = entityIterator.next(); valueIterator = valueSelector.iterator(entity); } Object toValue = valueIterator.next(); return newChangeSelection(entity, toValue); }
public static EntitySelector mockEntitySelector( EntityDescriptor entityDescriptor, Object... entities) { EntitySelector entitySelector = mock(EntitySelector.class); when(entitySelector.getEntityDescriptor()).thenReturn(entityDescriptor); final List<Object> entityList = Arrays.<Object>asList(entities); when(entitySelector.iterator()) .thenAnswer( new Answer<Iterator<Object>>() { @Override public Iterator<Object> answer(InvocationOnMock invocation) throws Throwable { return entityList.iterator(); } }); when(entitySelector.listIterator()) .thenAnswer( new Answer<ListIterator<Object>>() { @Override public ListIterator<Object> answer(InvocationOnMock invocation) throws Throwable { return entityList.listIterator(); } }); for (int i = 0; i < entityList.size(); i++) { final int index = i; when(entitySelector.listIterator(index)) .thenAnswer( new Answer<ListIterator<Object>>() { @Override public ListIterator<Object> answer(InvocationOnMock invocation) throws Throwable { return entityList.listIterator(index); } }); } when(entitySelector.endingIterator()) .thenAnswer( new Answer<Iterator<Object>>() { @Override public Iterator<Object> answer(InvocationOnMock invocation) throws Throwable { return entityList.iterator(); } }); when(entitySelector.isCountable()).thenReturn(true); when(entitySelector.isNeverEnding()).thenReturn(false); when(entitySelector.getSize()).thenReturn((long) entityList.size()); return entitySelector; }
public AbstractRandomChangeIterator(EntitySelector entitySelector, ValueSelector valueSelector) { this.entitySelector = entitySelector; this.valueSelector = valueSelector; entityIterator = entitySelector.iterator(); // Don't do hasNext() in constructor (to avoid upcoming selections breaking mimic recording) }
public Iterator<Placement> iterator() { return new QueuedEntityPlacingIterator(entitySelector.iterator()); }