@Test
  public void testCustomRunnable() throws Exception {
    ActivityHint activityHint = new ActivityHint(DatasourceActivity.class);
    controller.startOrResume(activityHint);

    CountDownLatch latch = new CountDownLatch(1);

    Runnable runner =
        () -> {
          try {
            latch.await(60, TimeUnit.SECONDS);
          } catch (InterruptedException e) {
            //
          }
        };
    assertFalse(store.loadingProperty().get());

    store.executeCustomRunnable(runner);
    FXPlatform.waitForFX();
    assertTrue(store.loadingProperty().get());

    latch.countDown();
    controller.waitForDataSource();
    FXPlatform.waitForFX();
    assertFalse(store.loadingProperty().get());
  }
  @Test
  public void testSearching() throws Exception {
    FXPlatform.invokeLater(
        () -> {
          adocEditor.searchField.setText("b");
          adocEditor.setText("a\na\na\nb\nb\na\nb");
          adocEditor.searchForText();
        });
    activityController.waitForTasks();
    FXPlatform.waitForFX();
    assertEquals(6, adocEditor.editor.getCaretPosition());

    FXPlatform.invokeLater(() -> adocEditor.searchForText());
    activityController.waitForTasks();
    FXPlatform.waitForFX();
    assertEquals(8, adocEditor.editor.getCaretPosition());

    FXPlatform.invokeLater(() -> adocEditor.searchForText());
    activityController.waitForTasks();
    FXPlatform.waitForFX();
    assertEquals(12, adocEditor.editor.getCaretPosition());

    FXPlatform.invokeLater(() -> adocEditor.searchForText());
    activityController.waitForTasks();
    FXPlatform.waitForFX();
    assertEquals(6, adocEditor.editor.getCaretPosition());
  }
  @Test
  public void testImageInsertion() throws Exception {
    imageProvider.addImage(new ImageData("test", "/de/ks/images/keymap.jpg"));

    InsertImage command = adocEditor.getCommand(InsertImage.class);
    command.collectImages();
    SelectImageController selectImageController = command.getSelectImageController();
    for (Future<?> future : selectImageController.getLoadingFutures()) {
      future.get();
    }
    activityController.waitForTasks();
    FXPlatform.waitForFX();
    assertEquals(1, selectImageController.getImagePane().getChildren().size());

    FXPlatform.invokeLater(
        () -> {
          GridPane grid =
              (GridPane) command.getSelectImageController().getImagePane().getChildren().get(0);
          Button node = (Button) grid.getChildren().get(0);
          node.getOnAction().handle(null);
        });

    assertThat(
        adocEditor.editor.getText(),
        Matchers.containsString("image::file:////de/ks/images/keymap.jpg"));
  }
  @Test
  public void testAdocParsing() throws Exception {
    FXPlatform.invokeLater(() -> adocEditor.editor.setText("= Title\n== more"));
    FXPlatform.invokeLater(() -> adocEditor.tabPane.getSelectionModel().select(1));
    JunitMatchers.withRetry(() -> adocEditor.preview.getCurrentHtml() != null);
    assertNotNull("preview string is null", adocEditor.preview.getCurrentHtml());

    WebEngine engine = adocEditor.preview.getWebView().getEngine();
    JunitMatchers.withRetry(() -> adocEditor.preview.getWebView().getEngine() != null);
    Condition.waitFor5s(() -> engine.getDocument(), Matchers.nullValue());

    FXPlatform.invokeLater(() -> adocEditor.tabPane.getSelectionModel().select(1));
    JunitMatchers.withRetry(() -> engine.getDocument() != null);
    assertNotNull("document did not load, is still null", engine.getDocument());

    FXPlatform.invokeLater(() -> adocEditor.tabPane.getSelectionModel().select(0));
    FXPlatform.waitForFX();
    //    assertTrue(adocEditor.editor.isFocused()); FIXME doesn't work in jdk8u11 but jdk8u20
  }