On Mon, 22 Aug 2022 21:08:39 GMT, Andy Goryachev <ango...@openjdk.org> wrote:

>> The issue is caused by TreeTableRow incorrectly selected when cell selection 
>> mode is enabled.
>> 
>> Changes:
>> - modified TreeTableRow.updateSelection()
>
> Andy Goryachev has updated the pull request incrementally with two additional 
> commits since the last revision:
> 
>  - 8292353: typo
>  - 8292353: typo

Fix looks good (left a minor inline comment which you might follow or not :)

The tests, though, ... need some love:

As a general rule, it's preferred to assert a single state per test method 
instead of changing the state repeatedly inside the same method. We can see 
that something is wrong when having code comments like: 

    line 240:         assertFalse(row.isSelected()); // JDK-8292353 failure

    line 249:         assertFalse(row.isSelected()); // JDK-8292353 failure

running the test before the fix and the second failure is never reached. We 
_want_ to see the failures, all of them :)

Write a test as near to the cause as possible: here the cause is an incorrect 
selection state of the TreeTableRow under certain conditions. That's unrelated 
to any user interaction, so a setup faking such an interaction is a detour 
which might (or not) bring in their own trouble (aside: I do see the css parser 
warnings when running TreeAndTableViewTest inside Eclipse - that is 
[JDK-8291853](https://bugs.openjdk.org/browse/JDK-8291853) which we don't yet 
understand, except that something fishy might be going on ;) Best to use the 
most simple setup to test that exact state, here that would be an isolated 
Tree/TableRow thats configured with a Tree/TableView at some index and setup 
the view's selection state as needed, for examples see TreeTableRowTest or 
something like the following

    @Test
    public void testRowSelectionStateOnCellSelectionEnabledMultiple() {
        // configure view
        addColumns();
        tree.getSelectionModel().setCellSelectionEnabled(true);
        tree.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
        // configure tableRow        
        int selected = 1;
        cell.updateTreeTableView(tree);
        cell.updateIndex(selected);

        // select all columns if possible
        tree.getSelectionModel().select(selected, null);
        assertEquals("sanity: all columns selected", tree.getColumns().size(),
                tree.getSelectionModel().getSelectedCells().size());
        assertFalse("row must not be selected in cell selection mode", 
cell.isSelected());
    }

and one for the second failure before the fix plus (for coverage) the other 
combinations of cell selection enablement/selection mode :) These should reside 
in TreeTableRowTest, IMO, to be "near" the other row state tests.

For coverage, we should also have the corresponding tests for TableRow (also 
isolated, not wrapped into faked user interaction). They should reside in 
TableRowTest. Which we don't have yet, time to add it :)

My suggestions: 

- convert the monolithic test methods into separate tests, each without 
changing the state you want to test
- configure and test the selection state of an isolated row (without faking 
user interaction, similar to the example above)
- for TreeTableRow, add the tests to TreeTableRowTest
- for TableRow, add TableRowTest and add analogue methods as those you added 
for TreeTableRow
- remove TreeAndTableViewTest

modules/javafx.controls/src/main/java/javafx/scene/control/TreeTableRow.java 
line 450:

> 448:         boolean isSelected = !sm.isCellSelectionEnabled() && 
> sm.isSelected(index);
> 449:         if (isSelected() != isSelected) {
> 450:             updateSelected(isSelected);

looks good now - we might consider to copy the code comment from TableRow 
updateSelection for emphasis of the implementation intention. But then, it 
might be considered clutter, with tests in place. Leaving it to you to decide :)

-------------

Changes requested by fastegal (Reviewer).

PR: https://git.openjdk.org/jfx/pull/875

Reply via email to