@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());
 }