1 /* 2 * Copyright (c) 2012, 2014, 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.Ignore; 46 import org.junit.Test; 47 48 public class Node_cssStateTransition_Test { 49 50 public Node_cssStateTransition_Test() { 51 } 52 53 @Before 54 public void setUp() { 55 StyleManager sm = StyleManager.getInstance(); 56 sm.userAgentStylesheetContainers.clear(); 57 sm.platformUserAgentStylesheetContainers.clear(); 58 sm.stylesheetContainerMap.clear(); 59 sm.cacheContainerMap.clear(); 60 sm.hasDefaultUserAgentStylesheet = false; 61 } 62 63 @Test 64 public void testPropertiesResetOnStyleclassChange() { 65 66 Rectangle rect = new Rectangle(50,50); 67 Paint defaultFill = rect.getFill(); 68 Paint defaultStroke = rect.getStroke(); 69 Double defaultStrokeWidth = Double.valueOf(rect.getStrokeWidth()); 70 71 CssMetaData metaData = ((StyleableProperty)rect.fillProperty()).getCssMetaData(); 72 assertEquals(defaultFill, metaData.getInitialValue(rect)); 73 metaData = ((StyleableProperty)rect.strokeProperty()).getCssMetaData(); 74 assertEquals(defaultStroke, metaData.getInitialValue(rect)); 75 metaData = ((StyleableProperty)rect.strokeWidthProperty()).getCssMetaData(); 76 assertEquals(defaultStrokeWidth, metaData.getInitialValue(rect)); 77 78 Stylesheet stylesheet = null; 79 try { 80 // Note: setDefaultUserAgentStylesheet in StyleManager won't replace the UA stylesheet unless it has a name, 81 // and that name needs to be different from the current one, if any. This matters when running 82 // these tests from the same VM since StyleManager is a singleton. 83 stylesheet = new CssParser().parse( 84 "testPropertiesResetOnStyleclassChange", 85 ".rect { -fx-fill: red; -fx-stroke: yellow; -fx-stroke-width: 3px; }" + 86 ".rect.green { -fx-fill: green; }" + 87 ".green { -fx-stroke: green; }" 88 89 ); 90 } catch(IOException ioe) { 91 fail(); 92 } 93 94 rect.getStyleClass().add("rect"); 95 96 Group root = new Group(); 97 root.getChildren().add(rect); 98 StyleManager.getInstance().setDefaultUserAgentStylesheet(stylesheet); 99 100 Scene scene = new Scene(root); 101 102 root.applyCss(); 103 104 assertEquals(Color.RED, rect.getFill()); 105 assertEquals(Color.YELLOW, rect.getStroke()); 106 assertEquals(3d, rect.getStrokeWidth(), 1e-6); 107 108 rect.getStyleClass().add("green"); 109 root.applyCss(); 110 111 assertEquals(Color.GREEN, rect.getFill()); 112 assertEquals(Color.GREEN, rect.getStroke()); 113 assertEquals(3d, rect.getStrokeWidth(), 1e-6); 114 115 rect.getStyleClass().remove("rect"); 116 root.applyCss(); 117 118 assertEquals(defaultFill, rect.getFill()); 119 assertEquals(Color.GREEN, rect.getStroke()); 120 assertEquals(defaultStrokeWidth.doubleValue(), rect.getStrokeWidth(), 1e-6); 121 122 rect.getStyleClass().remove("green"); 123 root.applyCss(); 124 125 assertEquals(defaultFill, rect.getFill()); 126 assertEquals(defaultStroke, rect.getStroke()); 127 assertEquals(defaultStrokeWidth.doubleValue(), rect.getStrokeWidth(), 1e-6); 128 } 129 130 @Test 131 public void testPropertiesResetOnPsedudoClassStateChange() { 132 133 Rectangle rect = new Rectangle(50,50); 134 Paint defaultFill = rect.getFill(); 135 Paint defaultStroke = rect.getStroke(); 136 Double defaultStrokeWidth = Double.valueOf(rect.getStrokeWidth()); 137 138 CssMetaData metaData = ((StyleableProperty)rect.fillProperty()).getCssMetaData(); 139 assertEquals(defaultFill, metaData.getInitialValue(rect)); 140 metaData = ((StyleableProperty)rect.strokeProperty()).getCssMetaData(); 141 assertEquals(defaultStroke, metaData.getInitialValue(rect)); 142 metaData = ((StyleableProperty)rect.strokeWidthProperty()).getCssMetaData(); 143 assertEquals(defaultStrokeWidth, metaData.getInitialValue(rect)); 144 145 Stylesheet stylesheet = null; 146 try { 147 // Note: setDefaultUserAgentStylesheet in StyleManager won't replace the UA stylesheet unless it has a name, 148 // and that name needs to be different from the current one, if any. This matters when running 149 // these tests from the same VM since StyleManager is a singleton. 150 stylesheet = new CssParser().parse( 151 "testPropertiesResetOnPsedudoClassStateChange", 152 ".rect:hover { -fx-fill: red; -fx-stroke: yellow; -fx-stroke-width: 3px; }" + 153 ".rect:hover:focused { -fx-fill: green; }" + 154 ".rect:focused { -fx-stroke: green; }" 155 156 ); 157 } catch(IOException ioe) { 158 fail(); 159 } 160 161 rect.getStyleClass().add("rect"); 162 163 Group root = new Group(); 164 root.getChildren().add(rect); 165 StyleManager.getInstance().setDefaultUserAgentStylesheet(stylesheet); 166 167 Scene scene = new Scene(root); 168 169 root.applyCss(); 170 171 assertEquals(defaultFill, rect.getFill()); 172 assertEquals(defaultStroke, rect.getStroke()); 173 assertEquals(defaultStrokeWidth, rect.getStrokeWidth(), 1e-6); 174 175 rect.pseudoClassStateChanged(PseudoClass.getPseudoClass("hover"), true); 176 root.applyCss(); 177 178 assertEquals(Color.RED, rect.getFill()); 179 assertEquals(Color.YELLOW, rect.getStroke()); 180 assertEquals(3d, rect.getStrokeWidth(), 1e-6); 181 182 rect.pseudoClassStateChanged(PseudoClass.getPseudoClass("focused"), true); 183 root.applyCss(); 184 185 assertEquals(Color.GREEN, rect.getFill()); 186 assertEquals(Color.GREEN, rect.getStroke()); 187 assertEquals(3d, rect.getStrokeWidth(), 1e-6); 188 189 rect.pseudoClassStateChanged(PseudoClass.getPseudoClass("hover"), false); 190 root.applyCss(); 191 192 assertEquals(defaultFill, rect.getFill()); 193 assertEquals(Color.GREEN, rect.getStroke()); 194 assertEquals(defaultStrokeWidth.doubleValue(), rect.getStrokeWidth(), 1e-6); 195 196 rect.pseudoClassStateChanged(PseudoClass.getPseudoClass("focused"), false); 197 root.applyCss(); 198 199 assertEquals(defaultFill, rect.getFill()); 200 assertEquals(defaultStroke, rect.getStroke()); 201 assertEquals(defaultStrokeWidth.doubleValue(), rect.getStrokeWidth(), 1e-6); 202 203 } 204 205 }