assertj / assertj/assertj-swing

Stuck waiting for event queue when DialogWrapper is created dynamically

Aperta
#239 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Java
Stelle
121
Fork
52
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

## 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.

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Inizia con il progetto minimo nell’issue, in particolare con DialogTest e il percorso di creazione di DialogWrapper, ed esegui ./gradlew test (oppure gradlew test su Windows). Confronta i ritardi segnalati con il workaround JDialog; il lavoro è completato quando le interazioni con DialogWrapper creati dinamicamente non vengono più bloccate per i ritardi segnalati e il test di riproduzione passa.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
java
Ambito
desktop, testing
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.