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 com.sun.javafx.scene.control;
  27 
  28 import com.sun.javafx.scene.control.LabeledText;
  29 import javafx.css.CssMetaData;
  30 import javafx.css.Stylesheet;
  31 import javafx.scene.Cursor;
  32 import javafx.scene.Group;
  33 import javafx.scene.Scene;
  34 import javafx.scene.control.Label;
  35 import javafx.scene.control.skin.LabelSkinBaseRetriever;
  36 import javafx.scene.control.skin.LabeledSkinBase;
  37 import javafx.scene.effect.BlendMode;
  38 import javafx.scene.layout.VBox;
  39 import javafx.scene.paint.Color;
  40 import javafx.scene.text.Font;
  41 import javafx.scene.text.TextAlignment;
  42 import javafx.stage.Stage;
  43 import org.junit.*;
  44 import static org.junit.Assert.*;
  45 
  46 /**
  47  *
  48  * @author dgrieve
  49  */
  50 public class LabeledTextTest {
  51     
  52     Label label;
  53     LabeledText labeledText;
  54     Stage stage;
  55     Scene scene;
  56     Stylesheet stylesheet;
  57     
  58     public LabeledTextTest() {
  59     }
  60     
  61     @Before public void setup() {
  62         label = 
  63             new Label("\"A computer once beat me at chess, "
  64                 + "but it was no match for me at kick boxing.\" Emo Philips");
  65         stage = new Stage();
  66         stage.setScene(scene = new Scene(label));
  67         scene.getStylesheets().add(LabeledTextTest.class.getResource("LabeledTextTest.css").toExternalForm());
  68         label.impl_processCSS(true);
  69         labeledText = LabelSkinBaseRetriever.getText(label);
  70     }
  71 
  72     @Test
  73     public void testLabeledTextAlignmentStyleAffectsLabeledText() {
  74         
  75         label.setStyle("-fx-text-alignment: right;");
  76         label.impl_processCSS(true);
  77         assertEquals(TextAlignment.RIGHT, label.getTextAlignment());
  78         assertEquals(TextAlignment.RIGHT, labeledText.getTextAlignment());
  79     
  80     }
  81     
  82     @Test
  83     public void testLabeledTextAlignmentIsBound() {
  84         try {
  85             labeledText.setTextAlignment(TextAlignment.RIGHT);
  86             fail();
  87         } catch (RuntimeException re) {
  88         }
  89     }
  90     
  91 
  92     @Test
  93     public void testLabeledFontStyleAffectsLabeledText() {
  94         
  95         label.setStyle("-fx-font: 10px Amble;");
  96         label.impl_processCSS(true);
  97         Font expected = Font.font("Amble", 10);
  98         assertEquals(expected, label.getFont());
  99         assertEquals(expected, labeledText.getFont());
 100     
 101     }
 102     
 103     @Test
 104     public void testLabeledTextFontIsBound() {
 105         try {
 106             labeledText.setFont(Font.getDefault());
 107             fail();
 108         } catch (RuntimeException re) {
 109         }
 110     }
 111     
 112     
 113     @Test
 114     public void testLabeledTextFillStyleAffectsLabeledText() {
 115         
 116         label.setStyle("-fx-text-fill: rgb(255,0,0);");
 117         label.impl_processCSS(true);
 118         Color expected = Color.rgb(255, 0, 0);
 119         assertEquals(expected, label.getTextFill());
 120         assertEquals(expected, labeledText.getFill());
 121     
 122     }
 123     
 124     @Test
 125     public void testLabeledTextFillIsBound() {
 126         try {
 127             labeledText.setFill(Color.RED);
 128             fail();
 129         } catch (RuntimeException re) {
 130         }
 131     }
 132 
 133     
 134     @Test
 135     public void testLabeledUnderlineStyleAffectsLabeledText() {
 136         
 137         label.setStyle("-fx-underline: true;");
 138         label.impl_processCSS(true);
 139         assert(label.isUnderline() == true);
 140         assert(labeledText.isUnderline() == true);
 141     
 142     }
 143 
 144     @Test
 145     public void testLabeledBlendModeStyleDoesNotAffectLabeledText() {
 146         label.setStyle("-fx-blend-mode: color-burn;");
 147         label.impl_processCSS(true);
 148         assertEquals(BlendMode.COLOR_BURN,label.getBlendMode());
 149         assertFalse(BlendMode.COLOR_BURN.equals(labeledText.getBlendMode())); 
 150     }
 151     
 152     @Test
 153     public void testLabeledCursorStyleDoesNotAffectLabeledText() {
 154         label.setStyle("-fx-cursor: crosshair;");
 155         label.impl_processCSS(true);
 156         assertEquals(Cursor.CROSSHAIR,label.getCursor());
 157         assertFalse(Cursor.CROSSHAIR.equals(labeledText.getCursor()));
 158     }
 159     
 160     @Test
 161     public void testLabeledEffectStyleDoesNotAffectLabeledText() {
 162         label.setStyle("-fx-effect: dropshadow(one-pass-box, red, 64, .5, 2, 3);");
 163         label.impl_processCSS(true);
 164         assertNotNull(label.getEffect());
 165         assertNull(labeledText.getEffect()); 
 166     }
 167     
 168     @Test
 169     public void testLabeledFocusTraversableStyleDoesNotAffectLabeledText() {
 170         label.setStyle("-fx-focus-traversable: true;");
 171         label.impl_processCSS(true);
 172         assert(label.focusTraversableProperty().get() == true);   
 173         assert(labeledText.focusTraversableProperty().get() == false);   
 174     }
 175     
 176     @Test
 177     public void testLabeledOpacityStyleDoesNotAffectLabeledText() {
 178         label.setStyle("-fx-opacity: .5;");
 179         label.impl_processCSS(true);
 180         assertEquals(label.getOpacity(), .5, .0000001);   
 181         assertEquals(labeledText.getOpacity(), 1, .0000001);   
 182     }
 183 
 184     @Test
 185     public void testLabeledRotateStyleDoesNotAffectLabeledText() {
 186         label.setStyle("-fx-rotate: 180;");
 187         label.impl_processCSS(true);
 188         assertEquals(label.getRotate(), 180, .0000001);
 189         assertEquals(labeledText.getRotate(), 0, .0000001);   
 190     }
 191     
 192     @Test
 193     public void testLabeledScaleXStyleDoesNotAffectLabeledText() {
 194         label.setStyle("-fx-scale-x: .5;");
 195         label.impl_processCSS(true);
 196         assertEquals(label.getScaleX(), .5, .0000001);
 197         assertEquals(labeledText.getScaleX(), 1, .0000001);   
 198     }
 199     
 200     @Test
 201     public void testLabeledScaleYStyleDoesNotAffectLabeledText() {
 202         label.setStyle("-fx-scale-y: .5;");
 203         label.impl_processCSS(true);
 204         assertEquals(label.getScaleY(), .5, .0000001);
 205         assertEquals(labeledText.getScaleY(), 1, .0000001);   
 206     }
 207 
 208     @Test
 209     public void testLabeledScaleZStyleDoesNotAffectLabeledText() {
 210         label.setStyle("-fx-scale-z: .5;");
 211         label.impl_processCSS(true);
 212         assertEquals(label.getScaleZ(), .5, .0000001);
 213         assertEquals(labeledText.getScaleZ(), 1, .0000001);   
 214     }
 215     
 216     @Test
 217     public void testLabeledTranslateXStyleDoesNotAffectLabeledText() {
 218         label.setStyle("-fx-translate-x: .5;");
 219         label.impl_processCSS(true);
 220         assertEquals(label.getTranslateX(), .5, .0000001);
 221         assertEquals(labeledText.getTranslateX(), 0, .0000001);   
 222     }
 223     
 224     @Test
 225     public void testLabeledTranslateYStyleDoesNotAffectLabeledText() {
 226         label.setStyle("-fx-translate-y: .5;");
 227         label.impl_processCSS(true);
 228         assertEquals(label.getTranslateY(), .5, .0000001);
 229         assertEquals(labeledText.getTranslateY(), 0, .0000001);   
 230     }
 231     
 232     @Test
 233     public void testLabeledTranslateZStyleDoesNotAffectLabeledText() {
 234         label.setStyle("-fx-translate-z: .5;");
 235         label.impl_processCSS(true);
 236         assertEquals(label.getTranslateZ(), .5, .0000001);
 237         assertEquals(labeledText.getTranslateZ(), 0, .0000001);   
 238     }
 239     
 240     @Test
 241     public void testLabeledVisibilityStyleDoesNotAffectLabeledText() {
 242         label.setStyle("visibility: false;");
 243         label.impl_processCSS(true);
 244         assert(label.visibleProperty().get() == false);   
 245         assert(labeledText.visibleProperty().get() == true);   
 246     }
 247     
 248     private static CssMetaData getCssMetaData(String prop) {
 249         for (CssMetaData styleable : LabeledText.getClassCssMetaData()) {
 250             if (styleable.getProperty().equals(prop)) return styleable;
 251         }
 252         return null;
 253     }
 254     
 255     @Test
 256     public void testLabeledTextFillIsSettableByCss() {
 257         
 258         CssMetaData sp = getCssMetaData("-fx-fill");
 259         assertTrue(sp.isSettable(labeledText));
 260     }
 261     
 262     @Test
 263     public void testCanStyleFillOnLabeledText() {
 264         assertEquals(Color.GREEN, labeledText.getFill());    
 265     }
 266 
 267     
 268     @Test
 269     public void testLabeledTextTextAlignmentIsSettableByCss() {
 270         
 271         CssMetaData sp = getCssMetaData("-fx-text-alignment");
 272         assertTrue(sp.isSettable(labeledText));
 273     }
 274     
 275     @Test
 276     public void testCanStyleTextAlignmentOnLabeledText() {
 277         assertEquals(TextAlignment.RIGHT, labeledText.getTextAlignment());
 278     }
 279     
 280     
 281     @Test
 282     public void testLabeledTextFontIsSettableByCss() {
 283         
 284         CssMetaData sp = getCssMetaData("-fx-font");
 285         assertTrue(sp.isSettable(labeledText));
 286     }
 287     
 288     @Test
 289     public void testCanStyleFontOnLabeledText() {
 290         assertEquals(Font.font("Amble", 10), labeledText.getFont());
 291     }
 292     
 293     
 294     @Test
 295     public void testLabeledTextUnderlineIsSettableByCss() {
 296         
 297         CssMetaData sp = getCssMetaData("-fx-underline");
 298         assertTrue(sp.isSettable(labeledText));
 299     }
 300     
 301     @Test
 302     public void testCanStyleUnderlineOnLabeledText() {
 303         assertTrue(labeledText.isUnderline());
 304     }
 305     
 306     @Test
 307     public void testLabeledSetTextFillNotOverridenByUAStyleOnLabeledText() {
 308         label = 
 309             new Label("\"A computer once beat me at chess, "
 310                 + "but it was no match for me at kick boxing.\" Emo Philips") {
 311                     @Override public String getUserAgentStylesheet() {
 312                         return LabeledTextTest.class.getResource("LabeledTextTest.css").toExternalForm();
 313                     }
 314                 };
 315         label.setTextFill(Color.YELLOW);
 316         stage.setScene(scene = new Scene(label));
 317         stage.show();
 318 //        label.impl_processCSS(true);
 319         labeledText = LabelSkinBaseRetriever.getText(label);
 320         assertEquals(Color.YELLOW, labeledText.getFill());
 321     }
 322     
 323     @Test
 324     public void testLabeledSetFontNotOverridenByUAStyleOnLabeledText() {
 325         label = 
 326             new Label("\"A computer once beat me at chess, "
 327                 + "but it was no match for me at kick boxing.\" Emo Philips") {
 328                     @Override public String getUserAgentStylesheet() {
 329                         return LabeledTextTest.class.getResource("LabeledTextTest.css").toExternalForm();
 330                     }
 331                 };
 332         Font font = Font.font("Amble", 30);
 333         label.setFont(font);
 334         stage.setScene(scene = new Scene(label));
 335         stage.show();
 336 //        label.impl_processCSS(true);
 337         labeledText = LabelSkinBaseRetriever.getText(label);
 338         assertEquals(font, labeledText.getFont());
 339     }
 340     
 341     @Test
 342     public void testLabeledSetTextAlignmentNotOverridenByUAStyleOnLabeledText() {
 343         label = 
 344             new Label("\"A computer once beat me at chess, "
 345                 + "but it was no match for me at kick boxing.\" Emo Philips") {
 346                     @Override public String getUserAgentStylesheet() {
 347                         return LabeledTextTest.class.getResource("LabeledTextTest.css").toExternalForm();
 348                     }
 349                 };
 350         label.setTextAlignment(TextAlignment.JUSTIFY);
 351         stage.setScene(scene = new Scene(label));
 352         stage.show();
 353 //        label.impl_processCSS(true);
 354         labeledText = LabelSkinBaseRetriever.getText(label);
 355         assertEquals(TextAlignment.JUSTIFY, labeledText.getTextAlignment());
 356     }
 357     
 358     @Test
 359     public void testLabeledSetUnderlineNotOverridenByUAStyleOnLabeledText() {
 360         label = 
 361             new Label("\"A computer once beat me at chess, "
 362                 + "but it was no match for me at kick boxing.\" Emo Philips") {
 363                     @Override public String getUserAgentStylesheet() {
 364                         return LabeledTextTest.class.getResource("LabeledTextTest.css").toExternalForm();
 365                     }
 366                 };
 367         label.setUnderline(true);
 368         stage.setScene(scene = new Scene(label));
 369         stage.show();
 370 //        label.impl_processCSS(true);
 371         labeledText = LabelSkinBaseRetriever.getText(label);
 372         assertTrue(labeledText.isUnderline());
 373     }
 374 
 375 
 376     @Test public void test_RT_37787() {
 377 
 378         label = new Label("test_RT_37787");
 379         label.getStyleClass().clear();
 380         label.setId("test-rt-37787");
 381 
 382         scene = new Scene(new Group(label));
 383         String url = getClass().getResource("LabeledTextTest.css").toExternalForm();
 384         scene.getStylesheets().add(url);
 385 
 386         label.setFont(Font.font(10));
 387         assertEquals(10, label.getFont().getSize(), .1);
 388 
 389         stage.setScene(scene);
 390         stage.show();
 391 
 392         // If the actual size is 10 * 1.5 * 1.5 = 22.5, then we've encountered RT-37787!
 393         double expected = Font.getDefault().getSize() * 1.5;
 394         double actual = label.getFont().getSize();
 395         assertEquals(expected, actual, .1);
 396 
 397     }
 398 
 399     @Test public void test_RT_37787_with_inline_style() {
 400 
 401         label = new Label("test_RT_37787_with_inline_style");
 402         label.setStyle("-fx-font-size: 1.231em;");
 403         label.getStyleClass().clear();
 404 
 405         VBox root = new VBox();
 406         root.setStyle("-fx-font-size: 1.5em");
 407         root.getChildren().add(label);
 408 
 409         scene = new Scene(root);
 410         stage.setScene(scene);
 411         stage.show();
 412 
 413         double expected = Font.getDefault().getSize() * 1.5 * 1.231;
 414         double actual = label.getFont().getSize();
 415         assertEquals(expected, actual, .1);
 416 
 417     }
 418 
 419 }