assertj / assertj/assertj-swing

Stuck waiting for event queue when DialogWrapper is created dynamically

Abierto
#239 0 comentarios 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
Java
Estrellas
121
Forks
52
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

## Issue
I use IntelliJ's [`DialogWrapper`](http://www.jetbrains.org/intellij/sdk/docs/user_interface_components/dialog_wrapper.html) to show dialogs in an IntelliJ plugin. This dialog is opened by a different window. When trying to simulate input events using AssertJ Swing, however, simply changing the text of an input box easily takes 30 seconds. Clicking a button takes 11 seconds.

The issue seems to be that, once the sub-dialog has been opened, the robot gets stuck in `waitForIdle(EventQueue)`. This makes this issue related to #13 and #201. The difference is that I do not use a custom event queue.

## Reproducible example
I have created a minimal reproducible example. The code can be found below.

Java code

```java
package com.fwdekker.assertjswingtest;

import com.intellij.openapi.ui.DialogWrapper;
import org.assertj.swing.edt.GuiActionRunner;
import org.assertj.swing.fixture.FrameFixture;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;

import static org.assertj.swing.fixture.Containers.showInFrame;

// Uses AssertJ Swing to test the interaction between the dialogs.
class DialogTest {
private FrameFixture frame;

@BeforeEach
void beforeEach() {
frame = showInFrame(GuiActionRunner.execute(MainDialog::new).getRootPane());
}

@AfterEach
void afterEach() {
frame.cleanUp();
}

@Test
void myTest() {
// This action takes 10 seconds
frame.button("mainButton").click();
}
}

// The main dialog that opens the sub-dialog.
class MainDialog extends JDialog {
MainDialog() {
JPanel contentPane = new JPanel();
JButton mainButton = new JButton("Open");
mainButton.setName("mainButton");
mainButton.addActionListener(e -> new SubDialog().showAndGet());
contentPane.add(mainButton);

setContentPane(contentPane);
setModal(true);
pack();
}
}

// The sub-dialog using IntelliJ's `DialogWrapper`.
class SubDialog extends DialogWrapper {
private JPanel contentPane = new JPanel();

SubDialog() {
super(null);
init();
}

@Override
protected JPanel createCenterPanel() {
return contentPane;
}
}
```

Gradle build file

```groovy
plugins {
id "java"
id "org.jetbrains.intellij" version "0.4.9"
}

repositories {
mavenCentral()
}

dependencies {
testCompile group: "org.assertj", name: "assertj-core", version: "3.8.0"
testCompile group: "org.assertj", name: "assertj-swing-junit", version: "3.8.0"
testCompile group: "org.junit.jupiter", name: "junit-jupiter-api", version: "5.5.0"
testCompile group: "org.junit.jupiter", name: "junit-jupiter-engine", version: "5.5.0"
}

intellij {
version = "2019.1.1"
}

test {
useJUnitPlatform()
}
```

Alternatively, [download a .zip of the minimal project](https://github.com/joel-costigliola/assertj-swing/files/3436278/assertj-swing-test.zip). You can run the test from the command line with `./gradlew test` (Unix-like) or `gradlew test` (Windows).

## Workarounds
I was able to find two workarounds for this issue. They are suboptimal solutions, but may be useful for others who have this issue:

* Replacing the `DialogWrapper` with a conventional `JDialog` fixes the issue, but is not feasible for my use case.
* Moving the creation of the sub-dialog outside of the button's action listener fixes the issue, but I do not think this is the idiomatic way of creating dialogs.

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

Comienza con el proyecto mínimo del issue, especialmente con DialogTest y la ruta de creación de DialogWrapper, y ejecuta ./gradlew test (o gradlew test en Windows). Compara los retrasos informados con la solución alternativa de JDialog; se considera terminado cuando las interacciones con DialogWrapper creados dinámicamente ya no se bloquean durante los retrasos informados y la prueba de reproducción pasa.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
java
Área
desktop, testing
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.