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 }