On Fri, 23 Oct 2020 15:44:43 GMT, Jeanette Winzenburg <faste...@openjdk.org> 
wrote:

>> This is a test fix.
>> 
>> Root cause:
>> - For ButtonTest - Incorrect use of MouseEventFirer - which puts Button on 
>> to the stage and shows it before firing mouse event
>> - For ComboBoxTest - adding ComboBox to a Stage, not showing the Stage but 
>> trying to show the ComboBox
>> 
>> 
>> Fix :
>> - For ButtonTest - Moved MouseEventFirer usage from test class to the 2 
>> tests that need it
>> - For ComboBoxTest - Started using StageLoader (which adds comboBox to the 
>> stage and shows it) instead of separate Scene and Stage creation.
>> 
>> 
>> I have attached the logs captured before and after this fix to the JBS.
>
> modules/javafx.controls/src/test/java/test/javafx/scene/control/ButtonTest.java
>  line 425:
> 
>> 423: 
>> 424:         mouse.dispose();
>> 425:     }
> 
> just curious: do we have to dispose the mouseFirer? If so, that pattern isn't 
> safe because it will not happen if the test fails.

Hmm.. very good point. I believe, we should use dispose mechanism whenever 
available for a readable cleanup. Both classes MouseEventFirer & StageLoader 
provide dispose method and the user of these classes should use it.
Now, this can be handled in two ways -
1) Keep a reference at test class level - it will be null by default - 
individual tests will create the object and update the class reference - we can 
dispose in cleanup method after the test
2) Use Try blocks in tests that use MouseEventFirerer or StageLoader objects 
and dispose them in finally{} blocks.

We can use (1) if many tests in a test class use MouseEventFirerer or 
StageLoader objects - for example ComboBoxTest and use approach (2) if very few 
tests use these classes - for example ButtonTest.

> modules/javafx.controls/src/test/java/test/javafx/scene/control/ComboBoxTest.java
>  line 658:
> 
>> 656:         StageLoader sl = new StageLoader(comboBox);
>> 657: 
>> 658: 
> 
> good catch :) But wouldn't show the stage have the same effect? (It's just me 
> having a personal dislike of stageloader :)

stage.show() has the same effect of fixing the bug. In fact, I fixed it 
initially with exact this fix.

When I looked at the other tests in ComboBoxTest class, I saw that there is a 
pattern of creating a Stage, creating a Scene with ComboBox and then adding 
Scene to the Stage. What was missed was stage.show(). The StageLoader does 
exactly these steps (including the missed stage.show()).
StageLoader might be a misfit at some of the other places in our tests (I 
believe that is the reason for your dislike), but I feel using StageLoader is a 
better fit in ComboBoxTest.

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

PR: https://git.openjdk.java.net/jfx/pull/337

Reply via email to