|
44 | 44 | import test.com.sun.javafx.test.objects.TestStage;
|
45 | 45 | import com.sun.javafx.tk.Toolkit;
|
46 | 46 | import com.sun.javafx.util.Utils;
|
| 47 | +import javafx.beans.InvalidationListener; |
47 | 48 | import javafx.beans.property.*;
|
| 49 | +import javafx.collections.SetChangeListener; |
| 50 | +import javafx.css.PseudoClass; |
48 | 51 | import javafx.geometry.BoundingBox;
|
49 | 52 | import javafx.geometry.Bounds;
|
50 | 53 | import javafx.geometry.NodeOrientation;
|
|
59 | 62 | import org.junit.Test;
|
60 | 63 | import org.junit.rules.ExpectedException;
|
61 | 64 |
|
| 65 | +import java.lang.ref.WeakReference; |
62 | 66 | import java.lang.reflect.Method;
|
63 | 67 | import java.util.Comparator;
|
| 68 | +import java.util.Set; |
| 69 | + |
64 | 70 | import javafx.scene.Group;
|
65 | 71 | import javafx.scene.GroupShim;
|
66 | 72 | import javafx.scene.Node;
|
@@ -161,6 +167,58 @@ public class NodeTest {
|
161 | 167 | * *
|
162 | 168 | **************************************************************************/
|
163 | 169 |
|
| 170 | + @Test |
| 171 | + public void testGetPseudoClassStatesShouldReturnSameSet() { |
| 172 | + Rectangle node = new Rectangle(); |
| 173 | + Set<PseudoClass> set1 = node.getPseudoClassStates(); |
| 174 | + Set<PseudoClass> set2 = node.getPseudoClassStates(); |
| 175 | + assertSame("getPseudoClassStates() should always return the same instance", |
| 176 | + set1, set2); |
| 177 | + } |
| 178 | + |
| 179 | + @Test(expected=UnsupportedOperationException.class) |
| 180 | + public void testPseudoClassStatesIsUnmodifiable() { |
| 181 | + Node node = new Rectangle(); |
| 182 | + node.getPseudoClassStates().add(PseudoClass.getPseudoClass("dummy")); |
| 183 | + } |
| 184 | + |
| 185 | + @Test |
| 186 | + public void testUnmodifiablePseudoClassStatesEqualsBackingStates() { |
| 187 | + Rectangle node = new Rectangle(); |
| 188 | + PseudoClass pseudo = PseudoClass.getPseudoClass("Pseudo"); |
| 189 | + node.pseudoClassStateChanged(pseudo, true); |
| 190 | + assertEquals(1, node.getPseudoClassStates().size()); |
| 191 | + assertEquals(NodeShim.pseudoClassStates(node).size(), node.getPseudoClassStates().size()); |
| 192 | + assertTrue(NodeShim.pseudoClassStates(node).contains(pseudo)); |
| 193 | + assertTrue(node.getPseudoClassStates().contains(pseudo)); |
| 194 | + } |
| 195 | + |
| 196 | + private boolean isInvalidationListenerInvoked; |
| 197 | + private boolean isChangeListenerInvoked; |
| 198 | + @Test |
| 199 | + public void testPseudoClassStatesListenersAreInvoked() { |
| 200 | + Rectangle node = new Rectangle(); |
| 201 | + node.getPseudoClassStates().addListener((InvalidationListener) inv -> { |
| 202 | + isInvalidationListenerInvoked = true; |
| 203 | + }); |
| 204 | + node.getPseudoClassStates().addListener((SetChangeListener<PseudoClass>) c -> { |
| 205 | + isChangeListenerInvoked = true; |
| 206 | + }); |
| 207 | + |
| 208 | + PseudoClass pseudo = PseudoClass.getPseudoClass("Pseudo"); |
| 209 | + node.pseudoClassStateChanged(pseudo, true); |
| 210 | + assertTrue(isInvalidationListenerInvoked); |
| 211 | + assertTrue(isChangeListenerInvoked); |
| 212 | + } |
| 213 | + |
| 214 | + @Test |
| 215 | + public void testPseudoClassStatesNotGCed() { |
| 216 | + Node node = new Rectangle(); |
| 217 | + WeakReference<Set<?>> weakRef = new WeakReference<>(node.getPseudoClassStates()); |
| 218 | + TestUtils.attemptGC(weakRef); |
| 219 | + assertNotNull("pseudoClassStates must not be gc'ed", weakRef.get()); |
| 220 | + } |
| 221 | + |
164 | 222 | // TODO disable this because it depends on TestNode
|
165 | 223 | // @Test public void testPeerNotifiedOfVisibilityChanges() {
|
166 | 224 | // Rectangle rect = new Rectangle();
|
|
0 commit comments