History { public boolean redo() { LOGGER.trace("redo, before, size: " + changes.size() + " pos: " + position.get() + " validPos: " + validPosition.get()); Change nextChange = next(); if (nextChange != null) { doWithoutListeners(nextChange.getSetting(), nextChange::redo); LOGGER.trace("redo, after, size: " + changes.size() + " pos: " + position.get() + " validPos: " + validPosition.get()); return true; } return false; } History(); void attachChangeListener(Setting setting); void doWithoutListeners(Setting setting, Runnable action); boolean undo(); void undoAll(); boolean redo(); void redoAll(); void clear(boolean undoAll); boolean isUndoAvailable(); BooleanProperty undoAvailableProperty(); boolean isRedoAvailable(); BooleanProperty redoAvailableProperty(); ObservableList<Change> getChanges(); ReadOnlyObjectProperty<Change> currentChangeProperty(); boolean isListenerActive(); ReadOnlyBooleanProperty listenerActiveProperty(); void setListenerActive(boolean listenerActive);  }
@Test public void redo() throws Exception { }