-
Bug
-
Resolution: Cannot Reproduce
-
P4
-
8u40
-
8u40b12
While doing regression testing (of my own implementations) against the fix of RT-37360, I noticed that ListView's selectionModel fires list changes for selectedIndices/items on select(selectedIndex). As nothing changed, it must not do so, IMO. TableView is behaving as expected. Failing tests below.
/**
* Issue: ListView must not fire on re-select already selected.
*/
@Test
public void testSelectedIndicesReselect() {
ListView<String> stringListView = new ListView<>();
stringListView.getItems().addAll("a", "b");
MultipleSelectionModel<String> sm = stringListView.getSelectionModel();
sm.setSelectionMode(SelectionMode.MULTIPLE);
IntegerProperty counter = new SimpleIntegerProperty();
sm.selectAll();
String selected = sm.getSelectedItem();
int selectedIndex = sm.getSelectedIndex();
List<String> selectedItems = new ArrayList(sm.getSelectedItems());
List<Integer> selectedIndices = new ArrayList(sm.getSelectedIndices());
sm.getSelectedIndices().addListener((ListChangeListener<Integer>) c -> {
counter.set(counter.get() +1);
});
// add selectedIndex - changes nothing as it is already selected
sm.select(selectedIndex);
assertSame("sanity: state unchanged", selected, sm.getSelectedItems().get(1));
assertEquals("sanity: state unchanged", 1, selectedIndex);
assertEquals("sanity: state unchanged", selectedItems, sm.getSelectedItems());
assertEquals("sanity: state unchanged", selectedIndices, sm.getSelectedIndices());
assertEquals("must not fire if nothing changed", 0, counter.get());
}
@Test
public void testSelectedItemsReselect() {
ListView<String> stringListView = new ListView<>();
stringListView.getItems().addAll("a", "b");
MultipleSelectionModel<String> sm = stringListView.getSelectionModel();
sm.setSelectionMode(SelectionMode.MULTIPLE);
IntegerProperty counter = new SimpleIntegerProperty();
sm.selectAll();
String selected = sm.getSelectedItem();
int selectedIndex = sm.getSelectedIndex();
List<String> selectedItems = new ArrayList(sm.getSelectedItems());
List<Integer> selectedIndices = new ArrayList(sm.getSelectedIndices());
sm.getSelectedItems().addListener((ListChangeListener<String>) c -> {
counter.set(counter.get() +1);
});
// add selectedIndex - changes nothing as it is already selected
sm.select(selectedIndex);
assertSame("sanity: state unchanged", selected, sm.getSelectedItems().get(1));
assertEquals("sanity: state unchanged", 1, selectedIndex);
assertEquals("sanity: state unchanged", selectedItems, sm.getSelectedItems());
assertEquals("sanity: state unchanged", selectedIndices, sm.getSelectedIndices());
assertEquals("must not fire if nothing changed", 0, counter.get());
}
/**
* Issue: ListView must not fire on re-select already selected.
*/
@Test
public void testSelectedIndicesReselect() {
ListView<String> stringListView = new ListView<>();
stringListView.getItems().addAll("a", "b");
MultipleSelectionModel<String> sm = stringListView.getSelectionModel();
sm.setSelectionMode(SelectionMode.MULTIPLE);
IntegerProperty counter = new SimpleIntegerProperty();
sm.selectAll();
String selected = sm.getSelectedItem();
int selectedIndex = sm.getSelectedIndex();
List<String> selectedItems = new ArrayList(sm.getSelectedItems());
List<Integer> selectedIndices = new ArrayList(sm.getSelectedIndices());
sm.getSelectedIndices().addListener((ListChangeListener<Integer>) c -> {
counter.set(counter.get() +1);
});
// add selectedIndex - changes nothing as it is already selected
sm.select(selectedIndex);
assertSame("sanity: state unchanged", selected, sm.getSelectedItems().get(1));
assertEquals("sanity: state unchanged", 1, selectedIndex);
assertEquals("sanity: state unchanged", selectedItems, sm.getSelectedItems());
assertEquals("sanity: state unchanged", selectedIndices, sm.getSelectedIndices());
assertEquals("must not fire if nothing changed", 0, counter.get());
}
@Test
public void testSelectedItemsReselect() {
ListView<String> stringListView = new ListView<>();
stringListView.getItems().addAll("a", "b");
MultipleSelectionModel<String> sm = stringListView.getSelectionModel();
sm.setSelectionMode(SelectionMode.MULTIPLE);
IntegerProperty counter = new SimpleIntegerProperty();
sm.selectAll();
String selected = sm.getSelectedItem();
int selectedIndex = sm.getSelectedIndex();
List<String> selectedItems = new ArrayList(sm.getSelectedItems());
List<Integer> selectedIndices = new ArrayList(sm.getSelectedIndices());
sm.getSelectedItems().addListener((ListChangeListener<String>) c -> {
counter.set(counter.get() +1);
});
// add selectedIndex - changes nothing as it is already selected
sm.select(selectedIndex);
assertSame("sanity: state unchanged", selected, sm.getSelectedItems().get(1));
assertEquals("sanity: state unchanged", 1, selectedIndex);
assertEquals("sanity: state unchanged", selectedItems, sm.getSelectedItems());
assertEquals("sanity: state unchanged", selectedIndices, sm.getSelectedIndices());
assertEquals("must not fire if nothing changed", 0, counter.get());
}