1 /* 2 * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package test.javafx.css; 27 28 29 import com.sun.javafx.css.StyleManager; 30 31 import java.io.IOException; 32 import javafx.css.CssMetaData; 33 import javafx.css.CssParser; 34 import javafx.css.PseudoClass; 35 import javafx.css.StyleableProperty; 36 import javafx.css.Stylesheet; 37 import javafx.scene.Group; 38 import javafx.scene.Scene; 39 import javafx.scene.paint.Color; 40 import javafx.scene.paint.Paint; 41 import javafx.scene.shape.Rectangle; 42 import static org.junit.Assert.*; 43 44 import org.junit.Before; 45 import org.junit.Test; 46 47 public class Node_cssStateTransition_Test { 48 49 public Node_cssStateTransition_Test() { 50 } 51 52 @Before 53 public void setUp() { 54 StyleManager sm = StyleManager.getInstance(); 55 sm.userAgentStylesheetContainers.clear(); 56 sm.platformUserAgentStylesheetContainers.clear(); 57 sm.stylesheetContainerMap.clear(); 58 sm.cacheContainerMap.clear(); 59 sm.hasDefaultUserAgentStylesheet = false; 60 } 61 62 @Test 63 public void testPropertiesResetOnStyleclassChange() { 64 65 Rectangle rect = new Rectangle(50,50); 66 Paint defaultFill = rect.getFill(); 67 Paint defaultStroke = rect.getStroke(); 68 Double defaultStrokeWidth = Double.valueOf(rect.getStrokeWidth()); 69 70 CssMetaData metaData = ((StyleableProperty)rect.fillProperty()).getCssMetaData(); 71 assertEquals(defaultFill, metaData.getInitialValue(rect)); 72 metaData = ((StyleableProperty)rect.strokeProperty()).getCssMetaData(); 73 assertEquals(defaultStroke, metaData.getInitialValue(rect)); 74 metaData = ((StyleableProperty)rect.strokeWidthProperty()).getCssMetaData(); 75 assertEquals(defaultStrokeWidth, metaData.getInitialValue(rect)); 76 77 Stylesheet stylesheet = null; 78 try { 79 // Note: setDefaultUserAgentStylesheet in StyleManager won't replace the UA stylesheet unless it has a name, 80 // and that name needs to be different from the current one, if any. This matters when running 81 // these tests from the same VM since StyleManager is a singleton. 82 stylesheet = new CssParser().parse( 83 "testPropertiesResetOnStyleclassChange", 84 ".rect { -fx-fill: red; -fx-stroke: yellow; -fx-stroke-width: 3px; }" + 85 ".rect.green { -fx-fill: green; }" + 86 ".green { -fx-stroke: green; }" 87 88 ); 89 } catch(IOException ioe) { 90 fail(); 91 } 92 93 rect.getStyleClass().add("rect"); 94 95 Group root = new Group(); 96 root.getChildren().add(rect); 97 StyleManager.getInstance().setDefaultUserAgentStylesheet(stylesheet); 98 99 Scene scene = new Scene(root); 100 101 root.applyCss(); 102 103 assertEquals(Color.RED, rect.getFill()); 104 assertEquals(Color.YELLOW, rect.getStroke()); 105 assertEquals(3d, rect.getStrokeWidth(), 1e-6); 106 107 rect.getStyleClass().add("green"); 108 root.applyCss(); 109 110 assertEquals(Color.GREEN, rect.getFill()); 111 assertEquals(Color.GREEN, rect.getStroke()); 112 assertEquals(3d, rect.getStrokeWidth(), 1e-6); 113 114 rect.getStyleClass().remove("rect"); 115 root.applyCss(); 116 117 assertEquals(defaultFill, rect.getFill()); 118 assertEquals(Color.GREEN, rect.getStroke()); 119 assertEquals(defaultStrokeWidth.doubleValue(), rect.getStrokeWidth(), 1e-6); 120 121 rect.getStyleClass().remove("green"); 122 root.applyCss(); 123 124 assertEquals(defaultFill, rect.getFill()); 125 assertEquals(defaultStroke, rect.getStroke()); 126 assertEquals(defaultStrokeWidth.doubleValue(), rect.getStrokeWidth(), 1e-6); 127 } 128 129 @Test 130 public void testPropertiesResetOnPsedudoClassStateChange() { 131 132 Rectangle rect = new Rectangle(50,50); 133 Paint defaultFill = rect.getFill(); 134 Paint defaultStroke = rect.getStroke(); 135 Double defaultStrokeWidth = Double.valueOf(rect.getStrokeWidth()); 136 137 CssMetaData metaData = ((StyleableProperty)rect.fillProperty()).getCssMetaData(); 138 assertEquals(defaultFill, metaData.getInitialValue(rect)); 139 metaData = ((StyleableProperty)rect.strokeProperty()).getCssMetaData(); 140 assertEquals(defaultStroke, metaData.getInitialValue(rect)); 141 metaData = ((StyleableProperty)rect.strokeWidthProperty()).getCssMetaData(); 142 assertEquals(defaultStrokeWidth, metaData.getInitialValue(rect)); 143 144 Stylesheet stylesheet = null; 145 try { 146 // Note: setDefaultUserAgentStylesheet in StyleManager won't replace the UA stylesheet unless it has a name, 147 // and that name needs to be different from the current one, if any. This matters when running 148 // these tests from the same VM since StyleManager is a singleton. 149 stylesheet = new CssParser().parse( 150 "testPropertiesResetOnPsedudoClassStateChange", 151 ".rect:hover { -fx-fill: red; -fx-stroke: yellow; -fx-stroke-width: 3px; }" + 152 ".rect:hover:focused { -fx-fill: green; }" + 153 ".rect:focused { -fx-stroke: green; }" 154 155 ); 156 } catch(IOException ioe) { 157 fail(); 158 } 159 160 rect.getStyleClass().add("rect"); 161 162 Group root = new Group(); 163 root.getChildren().add(rect); 164 StyleManager.getInstance().setDefaultUserAgentStylesheet(stylesheet); 165 166 Scene scene = new Scene(root); 167 168 root.applyCss(); 169 170 assertEquals(defaultFill, rect.getFill()); 171 assertEquals(defaultStroke, rect.getStroke()); 172 assertEquals(defaultStrokeWidth, rect.getStrokeWidth(), 1e-6); 173 174 rect.pseudoClassStateChanged(PseudoClass.getPseudoClass("hover"), true); 175 root.applyCss(); 176 177 assertEquals(Color.RED, rect.getFill()); 178 assertEquals(Color.YELLOW, rect.getStroke()); 179 assertEquals(3d, rect.getStrokeWidth(), 1e-6); 180 181 rect.pseudoClassStateChanged(PseudoClass.getPseudoClass("focused"), true); 182 root.applyCss(); 183 184 assertEquals(Color.GREEN, rect.getFill()); 185 assertEquals(Color.GREEN, rect.getStroke()); 186 assertEquals(3d, rect.getStrokeWidth(), 1e-6); 187 188 rect.pseudoClassStateChanged(PseudoClass.getPseudoClass("hover"), false); 189 root.applyCss(); 190 191 assertEquals(defaultFill, rect.getFill()); 192 assertEquals(Color.GREEN, rect.getStroke()); 193 assertEquals(defaultStrokeWidth.doubleValue(), rect.getStrokeWidth(), 1e-6); 194 195 rect.pseudoClassStateChanged(PseudoClass.getPseudoClass("focused"), false); 196 root.applyCss(); 197 198 assertEquals(defaultFill, rect.getFill()); 199 assertEquals(defaultStroke, rect.getStroke()); 200 assertEquals(defaultStrokeWidth.doubleValue(), rect.getStrokeWidth(), 1e-6); 201 202 } 203 204 }