On Sat, 21 Dec 2019 15:36:14 GMT, Oliver Kopp 
<github.com+1366654+kop...@openjdk.org> wrote:

> This is a WIP PR. Requesting for comments.
> 
> I could not replicate the test given at 
> https://bugs.openjdk.java.net/browse/JDK-8176270 without TestFX. I 
> nevertheless let my try to replicate the @Test things in here.
> 
> The fix is just a wild guess without really understanding the side effects of 
> `.addListener`.

I left comments inline. This will need changes. Also, you will need to provide 
a test that fails without the fix and passes with the fix.

modules/javafx.controls/src/main/java/javafx/scene/control/TextInputControl.java
 line 168:

> 167:                 // Ensure that the last character to get is within the 
> bounds of the txt string
> 168:                 if (end >= start + length) end = length-1;
> 169:                 // In case the start is after the whole txt, nothing 
> valid is selected. Thus, return the default.

First, I think the existing test is simply wrong: Why should the `start` value 
matter when checking whether the `end` value needs to be clamped -- it's an 
`end` point not a number of characters. I think the entire problem might be the 
fact that it is comparing against `start + length`. Second, the value to be 
clamped to was correct before your change. The `substring` method to which 
`end` is passed is documented as subtracting 1.

I think the test should be something like:

    if (end > length) end = length;

modules/javafx.controls/src/main/java/javafx/scene/control/TextInputControl.java
 line 170:

> 169:                 // In case the start is after the whole txt, nothing 
> valid is selected. Thus, return the default.
> 170:                 if (start >= length) return "";
> 171:                 return txt.substring(start, end);

This change seems OK, and might be clearer and the existing code, but the 
existing code is correct, and produces the same effect.

modules/javafx.controls/src/test/java/test/javafx/scene/control/TextInputControlTest.java
 line 2088:

> 2087:         Semaphore semaphore = new Semaphore(0);
> 2088:         Platform.runLater(semaphore::release);
> 2089:         semaphore.acquire();

Since controls tests run using the StubToolkit, `Platform.runLater` does not do 
what you expect. If you need to run a pulse to get some code to run that 
normally would run as part of pulse, you can call that method directly. See 
other controls tests for how this is done.

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

Changes requested by kcr (Lead).

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

Reply via email to