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 }