Hi Ryan,

I've created an issue for that.
https://github.com/TestFX/TestFX/issues/231

Will try you example out.

--Benjamin

On Tue, Sep 29, 2015 at 2:58 AM, Ryan Jaeb <r...@jaeb.ca> wrote:

> Hi Benjamin,
>
> Yes, it's a NoNodesFoundException using TestFX 3.1.2.
>
> As far as I know, using firePulse() is the only way to guarantee all
> previous model changes are rendered in the scene.  I've created an example
> to show what I mean:
>
> https://gist.github.com/ryanjaeb/74685a002e2b402e7fac
>
> It's a small example, so I'll post it inline too:
>
> ...
> public class FirePulseApplication extends Application {
>     @Override
>     public void start(Stage primaryStage) throws Exception {
>         printEnv();
>
>         ListView<String> listView = new ListView<>();
>
>         Scene scene = new Scene(listView, 200, 400);
>         primaryStage.setScene(scene);
>         primaryStage.show();
>
>         for (int i = 1; i < 6; i++) {
>             listView.getItems().add("list-item-" + i);
>         }
>
>         System.out.println("Before firePulse():");
>         printVisibleRowInfo(listView);
>
>         Toolkit.getToolkit().firePulse();
>
>         System.out.println("After firePulse():");
>         printVisibleRowInfo(listView);
>
>         Platform.exit();
>     }
>
>     private void printVisibleRowInfo(ListView<?> listView) {
>         // Item count according to the list model
>         System.out.println("  Item count: " + listView.getItems().size());
>
>         // Extract the VirtualFlow so it can be used to determine which
>         // list items are rendered in the scene.
>         ObservableList<Node> children = listView.getChildrenUnmodifiable();
>         VirtualFlow<?> flow = (VirtualFlow<?>) children.get(0);
>
>         IndexedCell<?> firstCell = flow.getFirstVisibleCell();
>         System.out.println("  First visible cell: " + firstCell);
>
>         IndexedCell<?> lastCell = flow.getLastVisibleCell();
>         System.out.println("  Last visible cell: " + lastCell);
>     }
>
>     private void printEnv() {
>         String osName = System.getProperty("os.name");
>         String jvm = System.getProperty("java.version") +
>                 " (" + System.getProperty("java.vm.version") +
>                 " - " + System.getProperty("os.arch") + ")";
>
>         System.out.println("OS: " + osName);
>         System.out.println("JVM: " + jvm);
>         System.out.println("");
>     }
> }
> ...
>
> The output I get when running the example:
>
> ...
> OS: Windows 8.1
> JVM: 1.8.0_40 (25.40-b25 - amd64)
>
> Before firePulse():
>   Item count: 5
>   First visible cell: null
>   Last visible cell: null
> After firePulse():
>   Item count: 5
>   First visible cell: ListViewSkin$2@7820053f[styleClass=cell
> indexed-cell list-cell]'list-item-1'
>   Last visible cell: ListViewSkin$2@8be9262[styleClass=cell indexed-cell
> list-cell]'list-item-5'
> ...
>
> Until there's a pulse, the nodes that represent the list items don't
> exist, so the NoNodesFoundException is expected.
>
> Ryan
>
> On Sun, Sep 27, 2015 at 12:40 AM, Benjamin Gudehus <hasteb...@gmail.com>
> wrote:
>
>> Hi Ryan!
>>
>> >Otherwise the drag(...) command will throw an exception because it
>> can't find the node for "list-item-name" (it doesn't exist yet).
>>
>> Well, this is very interesting. This must be a NoNodesFoundException in
>> TestFX 3.
>>
>> >I don't actually needto call firePulse().  I just need a way to know the
>> scene is up to date with a re-validated model.  Is there a better way of
>> accomplishing that right now?
>>
>> TestFX should try to find the Node within the JavaFX Application Thread
>> using Platform.runLater(...). Maybe this is a better way than to call
>> firePulse(),
>>
>> --Benjamin
>>
>> On Thu, Sep 24, 2015 at 12:49 PM, Ryan Jaeb <r...@jaeb.ca> wrote:
>>
>>> I use firePulse() in GUI test code.  I'm using TestFX (v3) for testing.
>>> Is
>>> there a way to ensure model updates are reflected in the scene without
>>> using firePulse()?  Consider something like this:
>>>
>>> ...
>>> // TestFX starts us on the main thread.  Maybe I'm using it wrong?
>>>
>>> CountDownLatch latch = new CountDownLatch(1);
>>>
>>> Platform.runLater(() -> {
>>>     // Add "list-item-name" to an empty list that's used as the model for
>>>     // a ListView.
>>>     Toolkit.getToolkit().firePulse();
>>>     latch.countDown();
>>> });
>>>
>>> try {
>>>     latch.await(1, TimeUnit.SECONDS);
>>> }
>>> catch (InterruptedException e) {
>>>     throw new RuntimeException(e);
>>> }
>>>
>>> // TestFX runs this on the application thread.
>>> drag("list-item-name").to("trash");
>>>
>>> assertTrue(list.isEmpty);
>>> ...
>>>
>>> In a case like the above, firePulse() is used to ensure a node (ListCell)
>>> for "list-item-name" is added to the scene before continuing with the
>>> test.  Otherwise the drag(...) command will throw an exception because it
>>> can't find the node for "list-item-name" (it doesn't exist yet).
>>>
>>> I don't actually needto call firePulse().  I just need a way to know the
>>> scene is up to date with a re-validated model.  Is there a better way of
>>> accomplishing that right now?
>>>
>>> Ryan
>>>
>>>
>>> On Wed, Sep 23, 2015 at 5:49 PM, Jonathan Giles <
>>> jonathan.gi...@oracle.com>
>>> wrote:
>>>
>>> > Hi all,
>>> >
>>> > Today I am keen to get your help on understanding use of the
>>> > Toolkit.getToolkit().firePulse() private API. If you could spare a few
>>> > minutes to grep your source directory for any usage of 'firePulse', and
>>> > email me your findings, that would be really interesting.
>>> >
>>> > As a gentle motivational tool I'll conclude by saying that,
>>> surprisingly,
>>> > this private API is barely used inside the openjfx production code. If
>>> you
>>> > look at the openjfx unit tests, it is used massively. The question is
>>> - how
>>> > much is this being used by other community members. If the answer is
>>> 'not
>>> > much' or less, then this private API may not be made public in JDK 9.
>>> Your
>>> > feedback therefore is critical!
>>> >
>>> > Thanks,
>>> > -- Jonathan
>>> >
>>>
>>
>>
>

Reply via email to