1 /*
   2  * Copyright (c) 2011, 2013, 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 com.sun.javafx.css;
  27 
  28 import static org.junit.Assert.*;
  29 
  30 import javafx.beans.value.ChangeListener;
  31 import javafx.beans.value.ObservableValue;
  32 import javafx.scene.Cursor;
  33 import javafx.scene.Group;
  34 import javafx.scene.Scene;
  35 import javafx.scene.shape.Rectangle;
  36 import javafx.scene.text.Font;
  37 import javafx.scene.text.FontSmoothingType;
  38 import javafx.scene.text.Text;
  39 import javafx.stage.Stage;
  40 import javafx.stage.Window;
  41 
  42 import com.sun.javafx.Logging;
  43 import org.junit.Before;
  44 import org.junit.Test;
  45 import sun.util.logging.PlatformLogger;
  46 
  47 /**
  48  * AKA: RT-7401. Tests that the pattern used works by testing opacity
  49  * specifically. Tests for font and text-fill should be done in the tests
  50  * for Label and Labeled.
  51  */
  52 public class HonorDeveloperSettingsTest {
  53 
  54     private Scene scene;
  55     private Rectangle rect;
  56     private Text text;
  57 
  58     // Scene must have a Window for CSS to load the stylesheet.
  59     // And Window must have a Scene for StyleManager to find the right scene
  60     static class TestWindow extends Window {
  61         @Override public void setScene(Scene value) {
  62             super.setScene(value);
  63         }
  64     }
  65 
  66     @Before
  67     public void setUp() {
  68         rect = new Rectangle();
  69         rect.setId("rectangle");
  70 
  71         text = new Text();
  72         text.setId("text");
  73 
  74         Group group = new Group();
  75         group.getChildren().addAll(rect, text);
  76 
  77         scene = new Scene(group);/* {
  78             TestWindow window;
  79             {
  80                 window = new TestWindow();
  81                 window.setScene(HonorDeveloperSettingsTest.this.scene);
  82                 impl_setWindow(window);
  83             }
  84         };*/
  85         
  86         System.setProperty("binary.css", "false");
  87         String url = getClass().getResource("HonorDeveloperSettingsTest_UA.css").toExternalForm();
  88         StyleManager.getInstance().getInstance().setDefaultUserAgentStylesheet(url);
  89         
  90         Stage stage = new Stage();
  91         stage.setScene(scene);
  92         stage.show();
  93     }
  94 
  95     @Test
  96     public void testOpacityIsSetByCSSByDefault() {
  97         rect.impl_processCSS(true);
  98         assertEquals(.76, rect.getOpacity(), 0.01);
  99     }
 100 
 101     @Test
 102     public void testOpacityWithInitializedValueSameAsDefaultValueIsIgnoredByCSS() {
 103         rect.setOpacity(1.0);
 104         rect.impl_processCSS(true);
 105         assertEquals(1.0, rect.getOpacity(), 0.01);
 106     }
 107 
 108     @Test
 109     public void testOpacityWithInitializedValueIsIgnoredByCSS() {
 110         rect.setOpacity(0.535);
 111         rect.impl_processCSS(true);
 112         assertEquals(0.535, rect.getOpacity(), 0.01);
 113     }
 114 
 115     @Test
 116     public void testOpacityWithManuallyChangedValueIsIgnoredByCSS() {
 117         rect.impl_processCSS(true);
 118         assertEquals(.76, rect.getOpacity(), 0.01);
 119         rect.setOpacity(.873);
 120         rect.impl_processCSS(true);
 121         assertEquals(.873, rect.getOpacity(), 0.01);
 122     }
 123 
 124     @Test
 125     public void testOpacityWithManuallyChangedValueAndInlineStyleIsSetToInlineStyle() {
 126         rect.impl_processCSS(true);
 127         assertEquals(.76, rect.getOpacity(), 0.01);
 128         rect.setStyle("-fx-opacity: 42%;");
 129         rect.setOpacity(.873);
 130         rect.impl_processCSS(true);
 131         assertEquals(.42, rect.getOpacity(), 0.01);
 132     }
 133 
 134     @Test
 135     public void testCursorIsSetByCSSByDefault() {
 136         rect.impl_processCSS(true);
 137         assertEquals(Cursor.HAND, rect.getCursor());
 138     }
 139 
 140     @Test
 141     public void testCursorWithInitializedValueSameAsDefaultValueIsIgnoredByCSS() {
 142         rect.setCursor(null);
 143         rect.impl_processCSS(true);
 144         assertEquals(null, rect.getCursor());
 145     }
 146 
 147     @Test
 148     public void testCursorWithInitializedValueIsIgnoredByCSS() {
 149         rect.setCursor(Cursor.WAIT);
 150         rect.impl_processCSS(true);
 151         assertEquals(Cursor.WAIT, rect.getCursor());
 152     }
 153 
 154     @Test
 155     public void testCursorWithManuallyChangedValueIsIgnoredByCSS() {
 156         rect.impl_processCSS(true);
 157         assertEquals(Cursor.HAND, rect.getCursor());
 158         rect.setCursor(Cursor.WAIT);
 159         rect.impl_processCSS(true);
 160         assertEquals(Cursor.WAIT, rect.getCursor());
 161     }
 162 
 163 //    public void testEffectIsSetByCSSByDefault() {
 164 //        final Rectangle rect = Rectangle { id: "rectangle" }
 165 //        scene.stylesheets = "{__DIR__}HonorDeveloperSettingsTest.css";
 166 //        scene.content = rect;
 167 //        rect.impl_processCSS(true);
 168 //        assertNotNull(rect.effect);
 169 //    }
 170 //
 171 //    public void testEffectWithInitializedValueSameAsDefaultValueIsIgnoredByCSS() {
 172 //        final Rectangle rect = Rectangle {
 173 //            id: "rectangle"
 174 //            effect: null
 175 //        }
 176 //        scene.stylesheets = "{__DIR__}HonorDeveloperSettingsTest.css";
 177 //        scene.content = rect;
 178 //        rect.impl_processCSS(true);
 179 //        assertNull(rect.effect);
 180 //    }
 181 //
 182 //    public void testEffectWithInitializedValueIsIgnoredByCSS() {
 183 //        DropShadow shadow = DropShadow { }
 184 //        final Rectangle rect = Rectangle {
 185 //            id: "rectangle"
 186 //            effect: shadow
 187 //        }
 188 //        scene.stylesheets = "{__DIR__}HonorDeveloperSettingsTest.css";
 189 //        scene.content = rect;
 190 //        rect.impl_processCSS(true);
 191 //        assertSame(shadow, rect.effect);
 192 //    }
 193 //
 194 //    public void testEffectWithManuallyChangedValueIsIgnoredByCSS() {
 195 //        DropShadow shadow = DropShadow { }
 196 //        final Rectangle rect = Rectangle { id: "rectangle" }
 197 //        scene.stylesheets = "{__DIR__}HonorDeveloperSettingsTest.css";
 198 //        scene.content = rect;
 199 //        rect.impl_processCSS(true);
 200 //        assertNotSame(shadow, rect.effect);
 201 //        rect.effect = shadow;
 202 //        rect.impl_processCSS(true);
 203 //        assertSame(shadow, rect.effect);
 204 //    }
 205 
 206     @Test
 207     public void testFontIsSetByCSSByDefault() {
 208         text.impl_processCSS(true);
 209         assertNotSame(Font.getDefault(), text.getFont());
 210     }
 211 
 212     @Test
 213     public void testFontWithInitializedValueSameAsDefaultValueIsIgnoredByCSS() {
 214         text.setFont(Font.getDefault());
 215         text.impl_processCSS(true);
 216         assertSame(Font.getDefault(), text.getFont());
 217     }
 218 
 219     @Test
 220     public void testFontWithInitializedValueIsIgnoredByCSS() {
 221         Font f = Font.font(Font.getDefault().getFamily(), 54.0);
 222         text.setFont(f);
 223         text.impl_processCSS(true);
 224         assertSame(f, text.getFont());
 225     }
 226 
 227     @Test
 228     public void testFontWithManuallyChangedValueIsIgnoredByCSS() {
 229         Font f = Font.font(Font.getDefault().getFamily(), 54.0);
 230         text.impl_processCSS(true);
 231         assertNotSame(f, text.getFont());
 232         text.setFont(f);
 233         text.impl_processCSS(true);
 234         assertSame(f, text.getFont());
 235     }
 236     
 237     @Test
 238     public void testUseInheritedFontSizeFromStylesheetForEmSize() {
 239         
 240         String url = getClass().getResource("HonorDeveloperSettingsTest_AUTHOR.css").toExternalForm();
 241         scene.getStylesheets().add(url);
 242         scene.getRoot().impl_processCSS(true);
 243         assertEquals(20, rect.getStrokeWidth(), 0.00001);
 244         
 245     }
 246     
 247     @Test
 248     public void testInhertWithNoStyleDoesNotOverrideUserSetValue() {
 249         Font font = Font.font("Amble", 14);
 250         text.setFont(font);
 251         
 252         String url = getClass().getResource("HonorDeveloperSettingsTest_AUTHOR.css").toExternalForm();
 253         scene.getStylesheets().add(url);
 254            
 255         scene.getRoot().impl_processCSS(true);
 256         //
 257         // Stroke width is set to 1em in the author stylesheet. If 
 258         // RT-20145 is not working, then the code will pick up the 20px
 259         // font size.
 260         //
 261         assertEquals(14, text.getStrokeWidth(), 0.00001);
 262         
 263     }
 264     
 265     @Test
 266     public void testInlineStyleInheritedFromParentApplies() {
 267 
 268         // Must remove the id so we don't match on the ua style.
 269         text.setId(null);
 270         text.setStyle("-fx-stroke-width: 1em; -fx-stroke: red;");
 271         
 272         scene.getRoot().setStyle("-fx-font: 18 Amble;");
 273        
 274         scene.getRoot().impl_processCSS(true);
 275         
 276         //
 277         // If RT-20513 is not working, then the code will _not_ 
 278         // pick up the inline style
 279         //        
 280         assertEquals(18, text.getStrokeWidth(), 0.00001);
 281         
 282     }
 283     
 284     @Test
 285     public void testInlineStyleNotInheritedFromParentWhenUserSetsFont() {
 286         
 287         text.setStyle("-fx-stroke-width: 1em;");
 288         
 289         Font font = Font.font("Amble", 14);
 290         text.setFont(font);
 291         
 292         scene.getRoot().setStyle("-fx-font: 18 Amble;");
 293         
 294         scene.getRoot().impl_processCSS(true);
 295                 
 296         assertEquals(14, text.getStrokeWidth(), 0.00001);
 297         
 298     }
 299 
 300     
 301     @Test public void test_RT_20686_UAStyleDoesNotOverrideSetFontSmoothingType() {
 302         
 303         text.setId("rt-20686-ua");
 304         text.setFontSmoothingType(FontSmoothingType.LCD);
 305         
 306         scene.getRoot().impl_processCSS(true);
 307          
 308         assertEquals(FontSmoothingType.LCD, text.getFontSmoothingType());
 309         
 310     }
 311     
 312     @Test public void test_RT_20686_AuthorStyleOverridesSetFontSmoothingType() {
 313         
 314         String url = getClass().getResource("HonorDeveloperSettingsTest_AUTHOR.css").toExternalForm();
 315         scene.getStylesheets().add(url);
 316 
 317         text.setId("rt-20686-author");
 318         text.setFontSmoothingType(FontSmoothingType.GRAY);
 319         
 320         scene.getRoot().impl_processCSS(true);
 321                 
 322         assertEquals(FontSmoothingType.LCD, text.getFontSmoothingType());
 323         
 324     }
 325 
 326     // this test is the prerequisite for the inline font style tests
 327     @Test public void test_InlineFontStyleApplies() {
 328         
 329         // text  has id "text". still, inline style should win out. 
 330         text.setStyle("-fx-font-size: 24;");
 331 
 332         scene.getRoot().impl_processCSS(true);
 333 
 334         double size = text.getFont().getSize();
 335         assertEquals(24, size, .0001);
 336         
 337     }
 338     
 339     // this test is the prerequisite for the inline font style tests
 340     @Test public void test_FontInheritsFromDotRootStyle() {
 341         
 342         String url = getClass().getResource("HonorDeveloperSettingsTest_AUTHOR.css").toExternalForm();
 343         scene.getStylesheets().add(url);
 344 
 345         // want text to get font style from .root
 346         text.setId(null);
 347         
 348         scene.getRoot().impl_processCSS(true);
 349                 
 350         double size = text.getFont().getSize();
 351         assertEquals(20, size, .0001);
 352         
 353     }
 354     
 355     @Test public void test_InlineFontStyleOverridesStylesheetStyles() {
 356         
 357         String url = getClass().getResource("HonorDeveloperSettingsTest_AUTHOR.css").toExternalForm();
 358         scene.getStylesheets().add(url);
 359 
 360         // want text to get font style from .root
 361         // assuming here that test_FontInheritsFromDotRootStyle passed
 362         text.setId(null);
 363         text.setStyle("-fx-font-size: 24;");
 364 
 365         scene.getRoot().impl_processCSS(true);
 366                
 367         double size = text.getFont().getSize();
 368         assertEquals(24, size, .0001);
 369         
 370     }
 371     
 372     @Test public void test_InlineFontStyleFromParentOverridesStylesheetStyles() {
 373         
 374         String url = getClass().getResource("HonorDeveloperSettingsTest_AUTHOR.css").toExternalForm();
 375         scene.getStylesheets().add(url);
 376         
 377         // want text to get font style from .root
 378         // assuming here that test_FontInheritsFromDotRootStyle passed
 379         text.setId(null);
 380 
 381         Group g = (Group)scene.getRoot();
 382         g.setStyle("-fx-font-size: 32;");
 383         
 384         g.impl_processCSS(true);
 385                 
 386         double size = text.getFont().getSize();
 387         assertEquals(32, size, .0001);
 388         
 389     }
 390     
 391 }