diff options
author | parentej <parentej@google.com> | 2017-01-19 16:44:19 +0000 |
---|---|---|
committer | parentej <parentej@google.com> | 2017-01-19 16:44:44 +0000 |
commit | 5774220cb6e4cb58fcaa80690cd6275054d2982c (patch) | |
tree | c1d1c0815973d96c16473f968bb9b1392265a0b1 | |
parent | 29f84d38107e0c99c5b83bb333d0c6bbd83d2c0a (diff) | |
download | swing-testing-5774220cb6e4cb58fcaa80690cd6275054d2982c.tar.gz |
WindowChildrenFinder filtering windows ready for Garbage Collection
Window.getOwnedWindows() returns windows that it keeps inside a list
of weak references. Windows that were never set visible or are already
disposed should not be accounted for filtering.
Test: Run WindowFilter_ignore_Test in a loop
Change-Id: I6ffd2bd7066a52cf4db76f50acddc3b7913b9b1b
-rwxr-xr-x[-rw-r--r--] | fest-swing/src/main/java/org/fest/swing/hierarchy/WindowChildrenFinder.java | 15 | ||||
-rwxr-xr-x[-rw-r--r--] | fest-swing/src/test/java/org/fest/swing/hierarchy/WindowFilter_ignore_Test.java | 49 |
2 files changed, 46 insertions, 18 deletions
diff --git a/fest-swing/src/main/java/org/fest/swing/hierarchy/WindowChildrenFinder.java b/fest-swing/src/main/java/org/fest/swing/hierarchy/WindowChildrenFinder.java index 633d7eb8..20c9a38b 100644..100755 --- a/fest-swing/src/main/java/org/fest/swing/hierarchy/WindowChildrenFinder.java +++ b/fest-swing/src/main/java/org/fest/swing/hierarchy/WindowChildrenFinder.java @@ -43,14 +43,17 @@ final class WindowChildrenFinder implements ChildrenFinderStrategy { } @RunsInCurrentThread - private @Nonnull Collection<Component> ownedWindows(Window w) { - return windows(w.getOwnedWindows()); - } - - private @Nonnull Collection<Component> windows(@Nonnull Component[] windows) { + private @Nonnull Collection<Component> ownedWindows(@Nonnull Window w) { + Component[] windows = w.getOwnedWindows(); if (isNullOrEmpty(windows)) { return emptyList(); } - return newArrayList(windows); + Collection<Component> windowsList = newArrayList(); + for (Component c : windows) { + if (c.isDisplayable()) { + windowsList.add(c); + } + } + return windowsList; } } diff --git a/fest-swing/src/test/java/org/fest/swing/hierarchy/WindowFilter_ignore_Test.java b/fest-swing/src/test/java/org/fest/swing/hierarchy/WindowFilter_ignore_Test.java index d1450c59..46e6de24 100644..100755 --- a/fest-swing/src/test/java/org/fest/swing/hierarchy/WindowFilter_ignore_Test.java +++ b/fest-swing/src/test/java/org/fest/swing/hierarchy/WindowFilter_ignore_Test.java @@ -15,11 +15,10 @@ package org.fest.swing.hierarchy; import static org.fest.assertions.Assertions.assertThat; -import static org.fest.swing.edt.GuiActionRunner.execute; import static org.fest.swing.test.builder.JButtons.button; import static org.fest.swing.test.builder.JDialogs.dialog; -import java.awt.Component; +import java.awt.*; import javax.swing.JDialog; @@ -27,6 +26,7 @@ import org.fest.swing.annotation.RunsInEDT; import org.fest.swing.edt.GuiTask; import org.fest.swing.test.swing.TestDialog; import org.fest.swing.test.swing.TestWindow; +import org.junit.Assert; import org.junit.Test; /** @@ -56,20 +56,45 @@ public class WindowFilter_ignore_Test extends WindowFilter_TestCase { @Test public void should_ignore_children_of_shared_invisible_Frame() { - JDialog dialog = dialog().createNew(); - addToImplicitlyIgnoredMap(dialog); - ignore(filter, dialog.getOwner()); - assertThat(allIgnored()).containsOnly(dialog); + JDialog dialog1 = dialog().createNew(); + addToImplicitlyIgnoredMap(dialog1); + + JDialog dialog2 = dialog().createNew(); + addToImplicitlyIgnoredMap(dialog2); + + try { + Window ownerWindow = dialog1.getOwner(); + Assert.assertEquals(ownerWindow, dialog2.getOwner()); + + ignore(filter, ownerWindow); + assertThat(allIgnored()).isEmpty(); + + dialog1.setVisible(true); + dialog2.setVisible(true); + + ignore(filter, ownerWindow); + assertThat(allIgnored()).containsOnly(dialog1, dialog2); + + dialog1.dispose(); + filter.ignored.clear(); + ignore(filter, ownerWindow); + assertThat(allIgnored()).containsOnly(dialog2); + + dialog2.dispose(); + filter.ignored.clear(); + ignore(filter, ownerWindow); + assertThat(allIgnored()).isEmpty(); + } + finally { + dialog1.dispose(); + dialog2.dispose(); + } + assertThatNoComponentsAreImplicitlyIgnored(); } @RunsInEDT private static void ignore(final WindowFilter filter, final Component c) { - execute(new GuiTask() { - @Override - protected void executeInEDT() { - filter.ignore(c); - } - }); + GuiTask.execute(() -> filter.ignore(c)); } } |