1 /*
   2  * Copyright (c) 2012, 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 javafx.scene.layout;
  27 
  28 import com.sun.javafx.pgstub.StubImageLoaderFactory;
  29 import com.sun.javafx.pgstub.StubPlatformImageInfo;
  30 import com.sun.javafx.pgstub.StubToolkit;
  31 import com.sun.javafx.tk.Toolkit;
  32 import javafx.geometry.Insets;
  33 import javafx.geometry.Side;
  34 import javafx.scene.Scene;
  35 import javafx.scene.paint.Color;
  36 import org.junit.Before;
  37 import org.junit.Ignore;
  38 import org.junit.Test;
  39 
  40 import java.net.MalformedURLException;
  41 import java.net.URI;
  42 import java.net.URISyntaxException;
  43 import java.net.URL;
  44 
  45 import static javafx.scene.layout.BackgroundSize.*;
  46 import static org.junit.Assert.*;
  47 
  48 /**
  49  * All of these tests are based on information contained in the CSS 3 borders
  50  * and backgrounds specification: http://www.w3.org/TR/css3-background/
  51  *
  52  * The "Example" tests are pulled directly from one of the examples in the
  53  * spec, and is numbered such as example1_3, meaning "Example 1" in the spec
  54  * which is a box with multiple declarations, so declaration 3 (or whatnot).
  55  */
  56 public class RegionCSSTest {
  57     // The color is drawn behind any background images.
  58     // The background color is clipped according to the ???background-clip??? value associated with the bottom-most background image.
  59     // Background images are drawn such that the first specified is on "top", closer to the user. But our BackgroundFill's are completely backwards from that!
  60 
  61     // Test "none" in terms of supplying an insets to the first and third but not specifying the second?
  62     // Failures to load images should result in "none" equivalence, not in exceptions
  63     //
  64     private Region region;
  65     private Scene scene;
  66     private static final String NL = System.getProperty("line.separator");
  67 
  68     private void processCSS() {
  69         scene.getRoot().impl_processCSS(true);
  70     }
  71 
  72     private static void installImage(final String str) {
  73 
  74         if (str == null || str.trim().isEmpty()) return;
  75 
  76         URL imageUrl = null;
  77 
  78         try {
  79 
  80             URI uri =  new URI(str.trim());
  81 
  82             // if url doesn't have a scheme
  83             if (uri.isAbsolute() == false) {
  84 
  85                 final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
  86                 final String path = uri.getPath();
  87 
  88                 URL resource = null;
  89 
  90                 if (path.startsWith("/")) {
  91                     resource = contextClassLoader.getResource(path.substring(1));
  92                 } else {
  93                     resource = contextClassLoader.getResource(path);
  94                 }
  95 
  96                 imageUrl = resource;
  97 
  98             } else {
  99                 // else, url does have a scheme
 100                 imageUrl = uri.toURL();
 101             }
 102 
 103         } catch (MalformedURLException malf) {
 104 
 105         } catch (URISyntaxException urise) {
 106         }
 107 
 108         if (imageUrl != null) {
 109 
 110             StubImageLoaderFactory imageLoaderFactory =
 111                     ((StubToolkit) Toolkit.getToolkit()).getImageLoaderFactory();
 112 
 113             imageLoaderFactory.registerImage(
 114                     imageUrl.toExternalForm(), new StubPlatformImageInfo(100, 100));
 115         }
 116 
 117     }
 118     
 119     @Before public void setUp() {
 120         region = new Region();
 121         scene = new Scene(region);
 122 
 123         installImage("javafx/scene/layout/red.png");
 124         installImage("javafx/scene/layout/green.png");
 125         installImage("javafx/scene/layout/blue.png");
 126         installImage("javafx/scene/layout/center-btn.png");
 127     }
 128 
 129     /**************************************************************************
 130      *                                                                        *
 131      * Basic tests                                                            *
 132      *                                                                        *
 133      *************************************************************************/
 134 
 135     @Test public void nothingSpecified() {
 136         region.setStyle("-fx-padding: 1;");
 137         processCSS();
 138 
 139         assertEquals(new Insets(1), region.getPadding());
 140         assertNull(region.getBackground());
 141         assertNull(region.getBorder());
 142     }
 143 
 144     /**************************************************************************
 145      *                                                                        *
 146      * Background Color tests                                                 *
 147      *                                                                        *
 148      *  These include -fx-background-color, -fx-background-radius, and        *
 149      *  -fx-background-insets.                                                *
 150      *                                                                        *
 151      *************************************************************************/
 152 
 153     @Test public void fillIsNull() {
 154         region.setStyle("-fx-background-color: null;");
 155         processCSS();
 156 
 157         assertEquals(new Insets(0), region.getPadding());
 158         assertNull(region.getBackground());
 159         assertNull(region.getBorder());
 160     }
 161 
 162     @Test public void fillIsTransparent() {
 163         region.setStyle("-fx-background-color: transparent;");
 164         processCSS();
 165 
 166         assertNull(region.getBorder());
 167         assertEquals(1, region.getBackground().getFills().size(), 0);
 168 
 169         BackgroundFill fill = region.getBackground().getFills().get(0);
 170         BackgroundFill expected = new BackgroundFill(Color.TRANSPARENT, null, null);
 171         assertEquals(expected, fill);
 172     }
 173 
 174     @Test public void fillIsSpecifiedOnly() {
 175         region.setStyle("-fx-background-color: purple;");
 176         processCSS();
 177 
 178         assertNull(region.getBorder());
 179         assertEquals(1, region.getBackground().getFills().size(), 0);
 180 
 181         BackgroundFill fill = region.getBackground().getFills().get(0);
 182         BackgroundFill expected = new BackgroundFill(Color.PURPLE, null, null);
 183         assertEquals(expected, fill);
 184     }
 185 
 186     @Test public void insetsIsSpecifiedOnly() {
 187         region.setStyle("-fx-background-insets: 1;");
 188         processCSS();
 189 
 190         assertNull(region.getBackground());
 191         assertNull(region.getBorder());
 192     }
 193 
 194     @Test public void radiusIsSpecifiedOnly() {
 195         region.setStyle("-fx-background-radius: 1;");
 196         processCSS();
 197 
 198         assertNull(region.getBackground());
 199         assertNull(region.getBorder());
 200     }
 201 
 202     @Test public void testWithExcessInsets() {
 203         region.setStyle(
 204                 "-fx-background-color: red;" +
 205                 "-fx-background-insets: 0 0 -1 0, 0, 1, 2;");
 206         processCSS();
 207 
 208         assertEquals(1, region.getBackground().getFills().size(), 0);
 209         assertEquals(0, region.getBackground().getImages().size(), 0);
 210         assertNull(region.getBorder());
 211 
 212         BackgroundFill fill = region.getBackground().getFills().get(0);
 213         BackgroundFill expected = new BackgroundFill(Color.RED, null, new Insets(0, 0, -1, 0));
 214         assertEquals(expected, fill);
 215     }
 216 
 217     @Test public void testWithExcessRadius() {
 218         region.setStyle(
 219                 "-fx-background-color: red;" +
 220                 "-fx-background-radius: 0 0 0 0, 0, 1, 2;");
 221         processCSS();
 222 
 223         assertEquals(1, region.getBackground().getFills().size(), 0);
 224         assertEquals(0, region.getBackground().getImages().size(), 0);
 225         assertNull(region.getBorder());
 226 
 227         BackgroundFill fill = region.getBackground().getFills().get(0);
 228         BackgroundFill expected = new BackgroundFill(Color.RED, new CornerRadii(0), null);
 229         assertEquals(expected, fill);
 230     }
 231 
 232     @Test public void backgroundScenario1() {
 233         region.setStyle(
 234                 "-fx-background-color: red;" +
 235                 "-fx-background-insets: 0 0 -1 0, 0, 1, 2;" +
 236                 "-fx-background-radius: 1 2 3 4;" +
 237                 "-fx-padding: 10 20 30 40;");
 238         processCSS();
 239 
 240         assertEquals(new Insets(10, 20, 30, 40), region.getPadding());
 241         assertEquals(1, region.getBackground().getFills().size(), 0);
 242         assertEquals(0, region.getBackground().getImages().size(), 0);
 243         assertNull(region.getBorder());
 244 
 245         BackgroundFill fill = region.getBackground().getFills().get(0);
 246         BackgroundFill expected = new BackgroundFill(Color.RED, new CornerRadii(1, 2, 3, 4, false), new Insets(0, 0, -1, 0));
 247         assertEquals(expected, fill);
 248     }
 249 
 250     @Test public void backgroundScenario2() {
 251         region.setStyle(
 252                 "-fx-background-color: red, green, blue, yellow;" +
 253                 "-fx-background-insets: 0 0 -1 0, 1;" +
 254                 "-fx-background-radius: 1 2 3 4, 5, 6 7 8 9;" +
 255                 "-fx-padding: 10 20 30 40;");
 256         processCSS();
 257 
 258         assertEquals(new Insets(10, 20, 30, 40), region.getPadding());
 259         assertEquals(4, region.getBackground().getFills().size(), 0);
 260         assertEquals(0, region.getBackground().getImages().size(), 0);
 261         assertNull(region.getBorder());
 262 
 263         BackgroundFill fill = region.getBackground().getFills().get(0);
 264         BackgroundFill expected = new BackgroundFill(Color.RED, new CornerRadii(1, 2, 3, 4, false), new Insets(0, 0, -1, 0));
 265         assertEquals(expected, fill);
 266 
 267         fill = region.getBackground().getFills().get(1);
 268         expected = new BackgroundFill(Color.GREEN, new CornerRadii(5), new Insets(1));
 269         assertEquals(expected, fill);
 270 
 271         fill = region.getBackground().getFills().get(2);
 272         expected = new BackgroundFill(Color.BLUE, new CornerRadii(6, 7, 8, 9, false), new Insets(1));
 273         assertEquals(expected, fill);
 274 
 275         fill = region.getBackground().getFills().get(3);
 276         expected = new BackgroundFill(Color.YELLOW, new CornerRadii(6, 7, 8, 9, false), new Insets(1));
 277         assertEquals(expected, fill);
 278     }
 279 
 280     @Test public void backgroundScenario3() {
 281         region.setStyle(
 282                 "-fx-background-color: red, green, blue, yellow;" +
 283                 "-fx-background-insets: 0 0 -1 0, 0, 1, 2;" +
 284                 "-fx-background-radius: 1 2 3 4;" +
 285                 "-fx-padding: 10 20 30 40;");
 286         processCSS();
 287 
 288         assertEquals(new Insets(10, 20, 30, 40), region.getPadding());
 289         assertEquals(4, region.getBackground().getFills().size(), 0);
 290 
 291         BackgroundFill fill = region.getBackground().getFills().get(0);
 292         BackgroundFill expected = new BackgroundFill(Color.RED,  new CornerRadii(1, 2, 3, 4, false), new Insets(0, 0, -1, 0));
 293         assertEquals(expected, fill);
 294 
 295         fill = region.getBackground().getFills().get(1);
 296         expected = new BackgroundFill(Color.GREEN,  new CornerRadii(1, 2, 3, 4, false), new Insets(0));
 297         assertEquals(expected, fill);
 298 
 299         fill = region.getBackground().getFills().get(2);
 300         expected = new BackgroundFill(Color.BLUE,  new CornerRadii(1, 2, 3, 4, false), new Insets(1));
 301         assertEquals(expected, fill);
 302 
 303         fill = region.getBackground().getFills().get(3);
 304         expected = new BackgroundFill(Color.YELLOW,  new CornerRadii(1, 2, 3, 4, false), new Insets(2));
 305         assertEquals(expected, fill);
 306     }
 307 
 308     /**
 309      * From the specification: http://www.w3.org/TR/css3-background/
 310      * This is "Example 1", except modified for multiple background fills
 311      */
 312     @Test public void specExample1_ModifiedForBackgroundFill() {
 313         region.setStyle(
 314                 "-fx-background-color: red, green, blue;" +
 315                 "-fx-background-insets: 1, 2, 3, 4;" + // An extra value here, which should be ignored
 316                 "-fx-background-radius: 1;");
 317         processCSS();
 318 
 319         assertEquals(3, region.getBackground().getFills().size());
 320 
 321         BackgroundFill fill = region.getBackground().getFills().get(0);
 322         BackgroundFill expected = new BackgroundFill(Color.RED,  new CornerRadii(1), new Insets(1));
 323         assertEquals(expected, fill);
 324 
 325         fill = region.getBackground().getFills().get(1);
 326         expected = new BackgroundFill(Color.GREEN,  new CornerRadii(1), new Insets(2));
 327         assertEquals(expected, fill);
 328 
 329         fill = region.getBackground().getFills().get(2);
 330         expected = new BackgroundFill(Color.BLUE,  new CornerRadii(1), new Insets(3));
 331         assertEquals(expected, fill);
 332     }
 333 
 334     // See example 23 in http://www.w3.org/TR/css3-background/#the-border-radius
 335     @Test public void testBackgroundRadiusWithHorizontalAndVerticalRadii() {
 336 
 337         region.setStyle("-fx-background-color: black; -fx-background-radius: 2px 1px 4px / 0.5px 3px;");
 338         processCSS();
 339 
 340         assertNull(region.getBorder());
 341         assertEquals(1, region.getBackground().getFills().size(), 0);
 342         assertEquals(0, region.getBackground().getImages().size(), 0);
 343 
 344         BackgroundFill fill = region.getBackground().getFills().get(0);
 345         BackgroundFill expected = new BackgroundFill(Color.BLACK,
 346                 new CornerRadii(2, .5, 3, 1, 4, .5, 3, 1, false, false, false, false, false, false, false, false),
 347                 Insets.EMPTY);
 348 
 349         assertEquals(expected, fill);
 350 
 351     }
 352 
 353 
 354     /**************************************************************************
 355      *                                                                        *
 356      * Background Image tests                                                 *
 357      *                                                                        *
 358      *  These include -fx-background-image, -fx-background-repeat,            *
 359      *  -fx-background-position, -fx-background-clip, -fx-background-origin,  *
 360      *  and -fx-background-size. -fx-background-attachment does not yet exist *
 361      *  and is not supported.                                                 *
 362      *                                                                        *
 363      *************************************************************************/
 364 
 365 
 366     /**
 367      * From the specification: http://www.w3.org/TR/css3-background/.
 368      *
 369      * This is something of a comprehensive test, whereas most of the unit tests
 370      * in this file are checking one specific aspect of the functionality tested
 371      * herein.
 372      */
 373     @Test public void specExample1() {
 374         region.setStyle(
 375                 "-fx-background-image: url(javafx/scene/layout/red.png), url(javafx/scene/layout/green.png), url(javafx/scene/layout/blue.png);" +
 376                 "-fx-background-position: center center, 20% 80%, top left, bottom right;" +
 377                 // TODO re-enable once I know how to test for background-origin
 378                 //"-fx-background-origin: border-box, content-box;" +
 379                 "-fx-background-repeat: no-repeat;");
 380         processCSS();
 381 
 382         assertEquals(0, region.getBackground().getFills().size(), 0);
 383         assertEquals(3, region.getBackground().getImages().size(), 0);
 384         assertNull(region.getBorder());
 385 
 386         BackgroundImage image = region.getBackground().getImages().get(0);
 387         BackgroundImage expected = new BackgroundImage(image.getImage(),
 388                 BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
 389                 new BackgroundPosition(Side.LEFT, .5, true, Side.TOP, .5, true),
 390                 BackgroundSize.DEFAULT);
 391         assertEquals(expected, image);
 392 
 393         image = region.getBackground().getImages().get(1);
 394         expected = new BackgroundImage(image.getImage(),
 395                 BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
 396                 new BackgroundPosition(Side.LEFT, .2, true, Side.TOP, .8, true),
 397                 BackgroundSize.DEFAULT);
 398         assertEquals(expected, image);
 399 
 400         image = region.getBackground().getImages().get(2);
 401         expected = new BackgroundImage(image.getImage(),
 402                 BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
 403                 BackgroundPosition.DEFAULT,
 404                 BackgroundSize.DEFAULT);
 405         assertEquals(expected, image);
 406     }
 407 
 408     @Test public void backgroundImageRepeat_repeatX() {
 409         region.setStyle(
 410                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 411                 "-fx-background-repeat: repeat-x;");
 412         processCSS();
 413 
 414         assertEquals(0, region.getBackground().getFills().size(), 0);
 415         assertEquals(1, region.getBackground().getImages().size(), 0);
 416         assertNull(region.getBorder());
 417 
 418         BackgroundImage image = region.getBackground().getImages().get(0);
 419         BackgroundImage expected = new BackgroundImage(image.getImage(),
 420                 BackgroundRepeat.REPEAT, BackgroundRepeat.NO_REPEAT,
 421                 BackgroundPosition.DEFAULT,
 422                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 423         assertEquals(expected, image);
 424     }
 425 
 426     @Test public void backgroundImageRepeat_repeatY() {
 427         region.setStyle(
 428                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 429                 "-fx-background-repeat: repeat-y;");
 430         processCSS();
 431 
 432         assertEquals(0, region.getBackground().getFills().size(), 0);
 433         assertEquals(1, region.getBackground().getImages().size(), 0);
 434         assertNull(region.getBorder());
 435 
 436         BackgroundImage image = region.getBackground().getImages().get(0);
 437         BackgroundImage expected = new BackgroundImage(image.getImage(),
 438                 BackgroundRepeat.NO_REPEAT, BackgroundRepeat.REPEAT,
 439                 BackgroundPosition.DEFAULT,
 440                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 441         assertEquals(expected, image);
 442     }
 443 
 444     @Test public void backgroundImageRepeat_repeat() {
 445         region.setStyle(
 446                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 447                 "-fx-background-repeat: repeat;");
 448         processCSS();
 449 
 450         assertEquals(0, region.getBackground().getFills().size(), 0);
 451         assertEquals(1, region.getBackground().getImages().size(), 0);
 452         assertNull(region.getBorder());
 453 
 454         BackgroundImage image = region.getBackground().getImages().get(0);
 455         BackgroundImage expected = new BackgroundImage(image.getImage(),
 456                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 457                 BackgroundPosition.DEFAULT,
 458                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 459         assertEquals(expected, image);
 460     }
 461 
 462     @Test public void backgroundImageRepeat_space() {
 463         region.setStyle(
 464                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 465                 "-fx-background-repeat: space;");
 466         processCSS();
 467 
 468         assertEquals(0, region.getBackground().getFills().size(), 0);
 469         assertEquals(1, region.getBackground().getImages().size(), 0);
 470         assertNull(region.getBorder());
 471 
 472         BackgroundImage image = region.getBackground().getImages().get(0);
 473         BackgroundImage expected = new BackgroundImage(image.getImage(),
 474                 BackgroundRepeat.SPACE, BackgroundRepeat.SPACE,
 475                 BackgroundPosition.DEFAULT,
 476                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 477         assertEquals(expected, image);
 478     }
 479 
 480     @Test public void backgroundImageRepeat_round() {
 481         region.setStyle(
 482                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 483                 "-fx-background-repeat: round;");
 484         processCSS();
 485 
 486         assertEquals(0, region.getBackground().getFills().size(), 0);
 487         assertEquals(1, region.getBackground().getImages().size(), 0);
 488         assertNull(region.getBorder());
 489 
 490         BackgroundImage image = region.getBackground().getImages().get(0);
 491         BackgroundImage expected = new BackgroundImage(image.getImage(),
 492                 BackgroundRepeat.ROUND, BackgroundRepeat.ROUND,
 493                 BackgroundPosition.DEFAULT,
 494                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 495         assertEquals(expected, image);
 496     }
 497 
 498     @Test public void backgroundImageRepeat_noRepeat() {
 499         region.setStyle(
 500                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 501                 "-fx-background-repeat: no-repeat;");
 502         processCSS();
 503 
 504         assertEquals(0, region.getBackground().getFills().size(), 0);
 505         assertEquals(1, region.getBackground().getImages().size(), 0);
 506         assertNull(region.getBorder());
 507 
 508         BackgroundImage image = region.getBackground().getImages().get(0);
 509         BackgroundImage expected = new BackgroundImage(image.getImage(),
 510                 BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
 511                 BackgroundPosition.DEFAULT,
 512                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 513         assertEquals(expected, image);
 514     }
 515 
 516     @Test public void backgroundImageRepeat_repeat_space() {
 517         region.setStyle(
 518                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 519                 "-fx-background-repeat: repeat space;");
 520         processCSS();
 521 
 522         assertEquals(0, region.getBackground().getFills().size(), 0);
 523         assertEquals(1, region.getBackground().getImages().size(), 0);
 524         assertNull(region.getBorder());
 525 
 526         BackgroundImage image = region.getBackground().getImages().get(0);
 527         BackgroundImage expected = new BackgroundImage(image.getImage(),
 528                 BackgroundRepeat.REPEAT, BackgroundRepeat.SPACE,
 529                 BackgroundPosition.DEFAULT,
 530                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 531         assertEquals(expected, image);
 532     }
 533 
 534     @Test public void backgroundImageRepeat_round_noRepeat() {
 535         region.setStyle(
 536                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 537                 "-fx-background-repeat: round no-repeat;");
 538         processCSS();
 539 
 540         assertEquals(0, region.getBackground().getFills().size(), 0);
 541         assertEquals(1, region.getBackground().getImages().size(), 0);
 542         assertNull(region.getBorder());
 543 
 544         BackgroundImage image = region.getBackground().getImages().get(0);
 545         BackgroundImage expected = new BackgroundImage(image.getImage(),
 546                 BackgroundRepeat.ROUND, BackgroundRepeat.NO_REPEAT,
 547                 BackgroundPosition.DEFAULT,
 548                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 549         assertEquals(expected, image);
 550     }
 551 
 552     // try "center left"
 553     // try "50% left" -- shouldn't work
 554     // try 3 values... remaining one should be 0
 555     // If only one value is specified, the second value is assumed to be ???center??? -- whatever this means...
 556     @Test public void backgroundImagePosition_right_bottom() {
 557         region.setStyle(
 558                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 559                 "-fx-background-position: right 20px bottom 10px;");
 560         processCSS();
 561 
 562         assertEquals(0, region.getBackground().getFills().size(), 0);
 563         assertEquals(1, region.getBackground().getImages().size(), 0);
 564         assertNull(region.getBorder());
 565 
 566         BackgroundImage image = region.getBackground().getImages().get(0);
 567         BackgroundImage expected = new BackgroundImage(image.getImage(),
 568                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 569                 new BackgroundPosition(Side.RIGHT, 20, false, Side.BOTTOM, 10, false),
 570                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 571         assertEquals(expected, image);
 572     }
 573 
 574     private static String dump(BackgroundImage image) {
 575         StringBuilder b = new StringBuilder("BackgroundImage[");
 576         b.append(NL + "  image: " + image.getImage());
 577         b.append(NL + "  position: " + dump(image.getPosition()));
 578         b.append(NL + "  repeat-x: " + image.getRepeatX());
 579         b.append(NL + "  repeat-y: " + image.getRepeatY());
 580         b.append(NL + "  size: " + dump(image.getSize()));
 581         b.append(NL + "]");
 582         return b.toString();
 583     }
 584     
 585     private static String dump(BackgroundSize size) {
 586         StringBuilder b = new StringBuilder("BackgroundSize[");
 587         b.append(NL + "    width: " + size.getWidth());
 588         b.append(NL + "    height: " + size.getHeight());
 589         b.append(NL + "    widthAsPercentage: " + size.isHeightAsPercentage());
 590         b.append(NL + "    heightAsPercentage: " + size.isWidthAsPercentage());
 591         b.append(NL + "    contain: " + size.isContain());
 592         b.append(NL + "    cover: " + size.isCover());
 593         b.append(NL + "  ]");
 594         return b.toString();
 595     }
 596     
 597     private static String dump(BackgroundPosition position) {
 598         StringBuilder b = new StringBuilder("BackgroundPosition[");
 599         b.append(NL + "    hSide: " + position.getHorizontalSide());
 600         b.append(NL + "    hPosition: " + position.getHorizontalPosition());
 601         b.append(NL + "    hAsPercentage: " + position.isHorizontalAsPercentage());
 602         b.append(NL + "    vSide: " + position.getVerticalSide());
 603         b.append(NL + "    vPosition: " + position.getVerticalPosition());
 604         b.append(NL + "    vAsPercentage: " + position.isVerticalAsPercentage());
 605         b.append(NL + "  ]");
 606         return b.toString();
 607     }
 608     
 609     @Test public void backgroundImagePosition_bottom_right() {
 610         region.setStyle(
 611                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 612                 "-fx-background-position: bottom 10px right 20px;");
 613         processCSS();
 614 
 615         assertEquals(0, region.getBackground().getFills().size(), 0);
 616         assertEquals(1, region.getBackground().getImages().size(), 0);
 617         assertNull(region.getBorder());
 618 
 619         BackgroundImage image = region.getBackground().getImages().get(0);
 620         BackgroundImage expected = new BackgroundImage(image.getImage(),
 621                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 622                 new BackgroundPosition(Side.RIGHT, 20, false, Side.BOTTOM, 10, false),
 623                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 624         assertEquals(expected, image);
 625     }
 626 
 627     @Test public void backgroundImagePosition_top() {
 628         region.setStyle(
 629                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 630                 "-fx-background-position: top;");
 631         processCSS();
 632 
 633         assertEquals(0, region.getBackground().getFills().size(), 0);
 634         assertEquals(1, region.getBackground().getImages().size(), 0);
 635         assertNull(region.getBorder());
 636 
 637         BackgroundImage image = region.getBackground().getImages().get(0);
 638         BackgroundImage expected = new BackgroundImage(image.getImage(),
 639                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 640                 new BackgroundPosition(Side.LEFT, .5, true, Side.TOP, 0, true),
 641                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 642         assertEquals(expected, image);
 643     }
 644 
 645     @Test  public void backgroundImagePosition_left() {
 646         region.setStyle(
 647                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 648                 "-fx-background-position: left;");
 649         processCSS();
 650 
 651         assertEquals(0, region.getBackground().getFills().size(), 0);
 652         assertEquals(1, region.getBackground().getImages().size(), 0);
 653         assertNull(region.getBorder());
 654 
 655         BackgroundImage image = region.getBackground().getImages().get(0);
 656         BackgroundImage expected = new BackgroundImage(image.getImage(),
 657                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 658                 new BackgroundPosition(Side.LEFT, 0, true, Side.TOP, .5, true),
 659                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 660         assertEquals(expected, image);
 661     }
 662 
 663     @Test public void backgroundImagePosition_center() {
 664         region.setStyle(
 665                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 666                 "-fx-background-position: center;");
 667         processCSS();
 668 
 669         assertEquals(0, region.getBackground().getFills().size(), 0);
 670         assertEquals(1, region.getBackground().getImages().size(), 0);
 671         assertNull(region.getBorder());
 672 
 673         BackgroundImage image = region.getBackground().getImages().get(0);
 674         BackgroundImage expected = new BackgroundImage(image.getImage(),
 675                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 676                 new BackgroundPosition(Side.LEFT, .5, true, Side.TOP, .5, true),
 677                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 678         assertEquals(expected, image);
 679     }
 680 
 681     @Test public void backgroundImagePosition_right() {
 682         region.setStyle(
 683                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 684                 "-fx-background-position: right;");
 685         processCSS();
 686 
 687         assertEquals(0, region.getBackground().getFills().size(), 0);
 688         assertEquals(1, region.getBackground().getImages().size(), 0);
 689         assertNull(region.getBorder());
 690 
 691         BackgroundImage image = region.getBackground().getImages().get(0);
 692         BackgroundImage expected = new BackgroundImage(image.getImage(),
 693                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 694                 new BackgroundPosition(Side.LEFT, 1, true, Side.TOP, .5, true),
 695                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 696         assertEquals(expected, image);
 697     }
 698 
 699     @Test public void backgroundImagePosition_bottom() {
 700         region.setStyle(
 701                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 702                 "-fx-background-position: bottom;");
 703         processCSS();
 704 
 705         assertEquals(0, region.getBackground().getFills().size(), 0);
 706         assertEquals(1, region.getBackground().getImages().size(), 0);
 707         assertNull(region.getBorder());
 708 
 709         BackgroundImage image = region.getBackground().getImages().get(0);
 710         BackgroundImage expected = new BackgroundImage(image.getImage(),
 711                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 712                 new BackgroundPosition(Side.LEFT, .5, true, Side.TOP, 1, true),
 713                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 714         assertEquals(expected, image);
 715     }
 716 
 717     @Test public void backgroundImagePosition_center_top() {
 718         region.setStyle(
 719                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 720                 "-fx-background-position: center top;");
 721         processCSS();
 722 
 723         assertEquals(0, region.getBackground().getFills().size(), 0);
 724         assertEquals(1, region.getBackground().getImages().size(), 0);
 725         assertNull(region.getBorder());
 726 
 727         BackgroundImage image = region.getBackground().getImages().get(0);
 728         BackgroundImage expected = new BackgroundImage(image.getImage(),
 729                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 730                 new BackgroundPosition(Side.LEFT, .5, true, Side.TOP, 0, true),
 731                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 732         assertEquals(expected, image);
 733     }
 734 
 735     @Test public void backgroundImagePosition_Example8_1() {
 736         region.setStyle(
 737                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 738                 "-fx-background-position: left 10px top 15px;");
 739         processCSS();
 740 
 741         assertEquals(0, region.getBackground().getFills().size(), 0);
 742         assertEquals(1, region.getBackground().getImages().size(), 0);
 743         assertNull(region.getBorder());
 744 
 745         BackgroundImage image = region.getBackground().getImages().get(0);
 746         BackgroundImage expected = new BackgroundImage(image.getImage(),
 747                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 748                 new BackgroundPosition(Side.LEFT, 10, false, Side.TOP, 15, false),
 749                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 750         assertEquals(expected, image);
 751     }
 752 
 753     @Test public void backgroundImagePosition_Example8_2() {
 754         region.setStyle(
 755                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 756                 "-fx-background-position: left top;");
 757         processCSS();
 758 
 759         assertEquals(0, region.getBackground().getFills().size(), 0);
 760         assertEquals(1, region.getBackground().getImages().size(), 0);
 761         assertNull(region.getBorder());
 762 
 763         BackgroundImage image = region.getBackground().getImages().get(0);
 764         BackgroundImage expected = new BackgroundImage(image.getImage(),
 765                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 766                 BackgroundPosition.DEFAULT,
 767                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 768         assertEquals(expected, image);
 769     }
 770 
 771     @Test public void backgroundImagePosition_Example8_3() {
 772         region.setStyle(
 773                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 774                 "-fx-background-position: 10px 15px;");
 775         processCSS();
 776 
 777         assertEquals(0, region.getBackground().getFills().size(), 0);
 778         assertEquals(1, region.getBackground().getImages().size(), 0);
 779         assertNull(region.getBorder());
 780 
 781         BackgroundImage image = region.getBackground().getImages().get(0);
 782         BackgroundImage expected = new BackgroundImage(image.getImage(),
 783                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 784                 new BackgroundPosition(Side.LEFT, 10, false, Side.TOP, 15, false),
 785                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 786         assertEquals(expected, image);
 787     }
 788 
 789     @Test public void backgroundImagePosition_Example8_4() {
 790         region.setStyle(
 791                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 792                 "-fx-background-position: left 15px;");
 793         processCSS();
 794 
 795         assertEquals(0, region.getBackground().getFills().size(), 0);
 796         assertEquals(1, region.getBackground().getImages().size(), 0);
 797         assertNull(region.getBorder());
 798 
 799         BackgroundImage image = region.getBackground().getImages().get(0);
 800         BackgroundImage expected = new BackgroundImage(image.getImage(),
 801                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 802                 new BackgroundPosition(Side.LEFT, 0, true, Side.TOP, 15, false),
 803                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 804         assertEquals(expected, image);
 805     }
 806 
 807     @Test public void backgroundImagePosition_Example8_5() {
 808         region.setStyle(
 809                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 810                 "-fx-background-position: 10px top;");
 811         processCSS();
 812 
 813         assertEquals(0, region.getBackground().getFills().size(), 0);
 814         assertEquals(1, region.getBackground().getImages().size(), 0);
 815         assertNull(region.getBorder());
 816 
 817         BackgroundImage image = region.getBackground().getImages().get(0);
 818         BackgroundImage expected = new BackgroundImage(image.getImage(),
 819                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 820                 new BackgroundPosition(Side.LEFT, 10, false, Side.TOP, 0, true),
 821                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 822         assertEquals(expected, image);
 823     }
 824 
 825     @Test public void backgroundImagePosition_Example8_6() {
 826         region.setStyle(
 827                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 828                 "-fx-background-position: left top 15px;");
 829         processCSS();
 830 
 831         assertEquals(0, region.getBackground().getFills().size(), 0);
 832         assertEquals(1, region.getBackground().getImages().size(), 0);
 833         assertNull(region.getBorder());
 834 
 835         BackgroundImage image = region.getBackground().getImages().get(0);
 836         BackgroundImage expected = new BackgroundImage(image.getImage(),
 837                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 838                 new BackgroundPosition(Side.LEFT, 0, true, Side.TOP, 15, false),
 839                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 840         assertEquals(expected, image);
 841     }
 842 
 843     @Test public void backgroundImagePosition_Example8_7() {
 844         region.setStyle(
 845                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 846                 "-fx-background-position: left 10px top;");
 847         processCSS();
 848 
 849         assertEquals(0, region.getBackground().getFills().size(), 0);
 850         assertEquals(1, region.getBackground().getImages().size(), 0);
 851         assertNull(region.getBorder());
 852 
 853         BackgroundImage image = region.getBackground().getImages().get(0);
 854         BackgroundImage expected = new BackgroundImage(image.getImage(),
 855                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 856                 new BackgroundPosition(Side.LEFT, 10, false, Side.TOP, 0, true),
 857                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 858         assertEquals(expected, image);
 859     }
 860 
 861     @Test public void backgroundImagePosition_Example10_1() {
 862         region.setStyle(
 863                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 864                 "-fx-background-position: right top;");
 865         processCSS();
 866 
 867         assertEquals(0, region.getBackground().getFills().size(), 0);
 868         assertEquals(1, region.getBackground().getImages().size(), 0);
 869         assertNull(region.getBorder());
 870 
 871         BackgroundImage image = region.getBackground().getImages().get(0);
 872         BackgroundImage expected = new BackgroundImage(image.getImage(),
 873                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 874                 new BackgroundPosition(Side.LEFT, 1, true, Side.TOP, 0, true),
 875                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 876         assertEquals(expected, image);
 877     }
 878 
 879     @Test public void backgroundImagePosition_Example10_2() {
 880         region.setStyle(
 881                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 882                 "-fx-background-position: top center;");
 883         processCSS();
 884 
 885         assertEquals(0, region.getBackground().getFills().size(), 0);
 886         assertEquals(1, region.getBackground().getImages().size(), 0);
 887         assertNull(region.getBorder());
 888 
 889         BackgroundImage image = region.getBackground().getImages().get(0);
 890         BackgroundImage expected = new BackgroundImage(image.getImage(),
 891                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 892                 new BackgroundPosition(Side.LEFT, .5, true, Side.TOP, 0, true),
 893                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 894         assertEquals(expected, image);
 895     }
 896 
 897     @Test public void backgroundImagePosition_Example11() {
 898         region.setStyle(
 899                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 900                 "-fx-background-position: 100% 100%;");
 901         processCSS();
 902 
 903         assertEquals(0, region.getBackground().getFills().size(), 0);
 904         assertEquals(1, region.getBackground().getImages().size(), 0);
 905         assertNull(region.getBorder());
 906 
 907         BackgroundImage image = region.getBackground().getImages().get(0);
 908         BackgroundImage expected = new BackgroundImage(image.getImage(),
 909                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 910                 new BackgroundPosition(Side.LEFT, 1, true, Side.TOP, 1, true),
 911                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 912         assertEquals(expected, image);
 913     }
 914 
 915     @Test public void backgroundImagePosition_75Percent() {
 916         region.setStyle(
 917                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 918                 "-fx-background-position: 75% 75%;");
 919         processCSS();
 920 
 921         assertEquals(0, region.getBackground().getFills().size(), 0);
 922         assertEquals(1, region.getBackground().getImages().size(), 0);
 923         assertNull(region.getBorder());
 924 
 925         BackgroundImage image = region.getBackground().getImages().get(0);
 926         BackgroundImage expected = new BackgroundImage(image.getImage(),
 927                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 928                 new BackgroundPosition(Side.LEFT, .75, true, Side.TOP, .75, true),
 929                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 930         assertEquals(expected, image);
 931     }
 932 
 933     @Test public void backgroundImagePosition_Example12() {
 934         region.setStyle(
 935                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 936                 "-fx-background-position: right 10% bottom 10%;");
 937         processCSS();
 938 
 939         assertEquals(0, region.getBackground().getFills().size(), 0);
 940         assertEquals(1, region.getBackground().getImages().size(), 0);
 941         assertNull(region.getBorder());
 942 
 943         BackgroundImage image = region.getBackground().getImages().get(0);
 944         BackgroundImage expected = new BackgroundImage(image.getImage(),
 945                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
 946                 new BackgroundPosition(Side.RIGHT, .1, true, Side.BOTTOM, .1, true),
 947                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
 948         assertEquals(expected, image);
 949     }
 950 
 951     @Ignore("We do not presently implement -fx-background-clip")
 952     @Test public void backgroundClip_defaultValue() {
 953         region.setStyle(
 954                 "-fx-background-image: url('javafx/scene/layout/red.png');");
 955         processCSS();
 956 
 957         assertEquals(0, region.getBackground().getFills().size(), 0);
 958         assertEquals(1, region.getBackground().getImages().size(), 0);
 959         assertNull(region.getBorder());
 960 
 961 //        BackgroundImage image = region.getBackground().getImages().get(0);
 962         // TODO backgroundClip needs to be set to border-box by default
 963 //        BackgroundImage expected = new BackgroundImage(image.getImage(), BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
 964 //                0, .1, .1, 0, // top, right, bottom, left
 965 //                1, 1,
 966 //                true, true, // asHorizontalPercentage, asVerticalPercentage
 967 //                true, true,
 968 //                false, false);
 969 //        assertEquals(expected, image);
 970     }
 971 
 972     @Ignore("We do not presently implement -fx-background-clip")
 973     @Test public void backgroundClip_BorderBox() {
 974         region.setStyle(
 975                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 976                 "-fx-background-clip: border-box");
 977         processCSS();
 978 
 979         assertEquals(0, region.getBackground().getFills().size(), 0);
 980         assertEquals(1, region.getBackground().getImages().size(), 0);
 981         assertNull(region.getBorder());
 982 
 983 //        BackgroundImage image = region.getBackground().getImages().get(0);
 984 //        BackgroundImage expected = new BackgroundImage(image.getImage(), BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
 985 //                0, .1, .1, 0, // top, right, bottom, left
 986 //                1, 1,
 987 //                true, true, // asHorizontalPercentage, asVerticalPercentage
 988 //                true, true,
 989 //                false, false);
 990 //        assertEquals(expected, image);
 991     }
 992 
 993     @Ignore("We do not presently implement -fx-background-clip")
 994     @Test public void backgroundClip_PaddingBox() {
 995         region.setStyle(
 996                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
 997                 "-fx-background-clip: padding-box");
 998         processCSS();
 999 
1000         assertEquals(0, region.getBackground().getFills().size(), 0);
1001         assertEquals(1, region.getBackground().getImages().size(), 0);
1002         assertNull(region.getBorder());
1003 
1004 //        BackgroundImage image = region.getBackground().getImages().get(0);
1005 //        BackgroundImage expected = new BackgroundImage(image.getImage(), BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
1006 //                0, .1, .1, 0, // top, right, bottom, left
1007 //                1, 1,
1008 //                true, true, // asHorizontalPercentage, asVerticalPercentage
1009 //                true, true,
1010 //                false, false);
1011 //        assertEquals(expected, image);
1012     }
1013 
1014     @Ignore("We do not presently implement -fx-background-clip")
1015     @Test public void backgroundClip_ContentBox() {
1016         region.setStyle(
1017                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1018                 "-fx-background-clip: content-box");
1019         processCSS();
1020 
1021         assertEquals(0, region.getBackground().getFills().size(), 0);
1022         assertEquals(1, region.getBackground().getImages().size(), 0);
1023         assertNull(region.getBorder());
1024 
1025 //        BackgroundImage image = region.getBackground().getImages().get(0);
1026 //        BackgroundImage expected = new BackgroundImage(image.getImage(), BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
1027 //                0, .1, .1, 0, // top, right, bottom, left
1028 //                1, 1,
1029 //                true, true, // asHorizontalPercentage, asVerticalPercentage
1030 //                true, true,
1031 //                false, false);
1032 //        assertEquals(expected, image);
1033     }
1034 
1035     @Ignore("We do not presently implement -fx-background-origin")
1036     @Test public void backgroundOrigin_defaultValue() {
1037         region.setStyle(
1038                 "-fx-background-image: url('javafx/scene/layout/red.png');");
1039         processCSS();
1040 
1041         assertEquals(0, region.getBackground().getFills().size(), 0);
1042         assertEquals(1, region.getBackground().getImages().size(), 0);
1043         assertNull(region.getBorder());
1044 
1045 //        BackgroundImage image = region.getBackground().getImages().get(0);
1046         // TODO backgroundOrigin needs to be set to padding-box by default
1047 //        BackgroundImage expected = new BackgroundImage(image.getImage(), BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
1048 //                0, .1, .1, 0, // top, right, bottom, left
1049 //                1, 1,
1050 //                true, true, // asHorizontalPercentage, asVerticalPercentage
1051 //                true, true,
1052 //                false, false);
1053 //        assertEquals(expected, image);
1054     }
1055 
1056     @Ignore("We do not presently implement -fx-background-origin")
1057     @Test public void backgroundOrigin_BorderBox() {
1058         region.setStyle(
1059                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1060                 "-fx-background-origin: border-box");
1061         processCSS();
1062 
1063 //        assertEquals(0, region.getBackground().getFills().size(), 0);
1064 //        assertEquals(1, region.getBackground().getImages().size(), 0);
1065 //        assertEquals(0, region.getImageBorders().size(), 0);
1066 //        assertEquals(0, region.getStrokeBorders().size(), 0);
1067 
1068 //        BackgroundImage image = region.getBackground().getImages().get(0);
1069 //        BackgroundImage expected = new BackgroundImage(image.getImage(), BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
1070 //                0, .1, .1, 0, // top, right, bottom, left
1071 //                1, 1,
1072 //                true, true, // asHorizontalPercentage, asVerticalPercentage
1073 //                true, true,
1074 //                false, false);
1075 //        assertEquals(expected, image);
1076     }
1077 
1078     @Ignore("We do not presently implement -fx-background-origin")
1079     @Test public void backgroundOrigin_PaddingBox() {
1080         region.setStyle(
1081                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1082                 "-fx-background-origin: padding-box");
1083         processCSS();
1084 
1085         assertEquals(0, region.getBackground().getFills().size(), 0);
1086         assertEquals(1, region.getBackground().getImages().size(), 0);
1087         assertNull(region.getBorder());
1088 
1089 //        BackgroundImage image = region.getBackground().getImages().get(0);
1090 //        BackgroundImage expected = new BackgroundImage(image.getImage(), BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
1091 //                0, .1, .1, 0, // top, right, bottom, left
1092 //                1, 1,
1093 //                true, true, // asHorizontalPercentage, asVerticalPercentage
1094 //                true, true,
1095 //                false, false);
1096 //        assertEquals(expected, image);
1097     }
1098 
1099     @Ignore("We do not presently implement -fx-background-origin")
1100     @Test public void backgroundOrigin_ContentBox() {
1101         region.setStyle(
1102                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1103                 "-fx-background-origin: content-box");
1104         processCSS();
1105 
1106         assertEquals(0, region.getBackground().getFills().size(), 0);
1107         assertEquals(1, region.getBackground().getImages().size(), 0);
1108         assertNull(region.getBorder());
1109 
1110 //        BackgroundImage image = region.getBackground().getImages().get(0);
1111 //        BackgroundImage expected = new BackgroundImage(image.getImage(), BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
1112 //                0, .1, .1, 0, // top, right, bottom, left
1113 //                1, 1,
1114 //                true, true, // asHorizontalPercentage, asVerticalPercentage
1115 //                true, true,
1116 //                false, false);
1117 //        assertEquals(expected, image);
1118     }
1119 
1120     @Test public void backgroundSize_defaultValue() {
1121         region.setStyle("-fx-background-image: url('javafx/scene/layout/red.png');");
1122         processCSS();
1123 
1124         assertEquals(0, region.getBackground().getFills().size(), 0);
1125         assertEquals(1, region.getBackground().getImages().size(), 0);
1126         assertNull(region.getBorder());
1127 
1128         BackgroundImage image = region.getBackground().getImages().get(0);
1129         BackgroundImage expected = new BackgroundImage(image.getImage(),
1130                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
1131                 BackgroundPosition.DEFAULT,
1132                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
1133         assertEquals(expected, image);
1134     }
1135 
1136     @Test public void backgroundSize_cover() {
1137         region.setStyle(
1138                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1139                 "-fx-background-size: cover;");
1140         processCSS();
1141 
1142         assertEquals(0, region.getBackground().getFills().size(), 0);
1143         assertEquals(1, region.getBackground().getImages().size(), 0);
1144         assertNull(region.getBorder());
1145 
1146         BackgroundImage image = region.getBackground().getImages().get(0);
1147         BackgroundImage expected = new BackgroundImage(image.getImage(),
1148                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
1149                 BackgroundPosition.DEFAULT,
1150                 new BackgroundSize(AUTO, AUTO, true, true, false, true));
1151         assertEquals(expected, image);
1152     }
1153 
1154     @Test public void backgroundSize_contain() {
1155         region.setStyle(
1156                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1157                 "-fx-background-size: contain;");
1158         processCSS();
1159 
1160         assertEquals(0, region.getBackground().getFills().size(), 0);
1161         assertEquals(1, region.getBackground().getImages().size(), 0);
1162         assertNull(region.getBorder());
1163 
1164         BackgroundImage image = region.getBackground().getImages().get(0);
1165         BackgroundImage expected = new BackgroundImage(image.getImage(),
1166                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
1167                 BackgroundPosition.DEFAULT,
1168                 new BackgroundSize(AUTO, AUTO, true, true, true, false));
1169         assertEquals(expected, image);
1170     }
1171 
1172     @Test public void backgroundSize_length() {
1173         region.setStyle(
1174                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1175                 "-fx-background-size: 170px;");
1176         processCSS();
1177 
1178         assertEquals(0, region.getBackground().getFills().size(), 0);
1179         assertEquals(1, region.getBackground().getImages().size(), 0);
1180         assertNull(region.getBorder());
1181 
1182         BackgroundImage image = region.getBackground().getImages().get(0);
1183         BackgroundImage expected = new BackgroundImage(image.getImage(),
1184                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
1185                 BackgroundPosition.DEFAULT,
1186                 new BackgroundSize(170, AUTO, false, true, false, false));
1187         assertEquals(expected, image);
1188     }
1189 
1190     @Test public void backgroundSize_percent() {
1191         region.setStyle(
1192                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1193                 "-fx-background-size: 65%;");
1194         processCSS();
1195 
1196         assertEquals(0, region.getBackground().getFills().size(), 0);
1197         assertEquals(1, region.getBackground().getImages().size(), 0);
1198         assertNull(region.getBorder());
1199 
1200         BackgroundImage image = region.getBackground().getImages().get(0);
1201         BackgroundImage expected = new BackgroundImage(image.getImage(),
1202                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
1203                 BackgroundPosition.DEFAULT,
1204                 new BackgroundSize(.65, AUTO, true, true, false, false));
1205         assertEquals(expected, image);
1206     }
1207 
1208     @Test public void backgroundSize_auto() {
1209         region.setStyle(
1210                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1211                 "-fx-background-size: auto;");
1212         processCSS();
1213 
1214         assertEquals(0, region.getBackground().getFills().size(), 0);
1215         assertEquals(1, region.getBackground().getImages().size(), 0);
1216         assertNull(region.getBorder());
1217 
1218         BackgroundImage image = region.getBackground().getImages().get(0);
1219         BackgroundImage expected = new BackgroundImage(image.getImage(),
1220                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
1221                 BackgroundPosition.DEFAULT,
1222                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
1223         assertEquals(expected, image);
1224     }
1225 
1226     @Test public void backgroundSize_length_length() {
1227         region.setStyle(
1228                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1229                 "-fx-background-size: 10px 20px;");
1230         processCSS();
1231 
1232         assertEquals(0, region.getBackground().getFills().size(), 0);
1233         assertEquals(1, region.getBackground().getImages().size(), 0);
1234         assertNull(region.getBorder());
1235 
1236         BackgroundImage image = region.getBackground().getImages().get(0);
1237         BackgroundImage expected = new BackgroundImage(image.getImage(),
1238                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
1239                 BackgroundPosition.DEFAULT,
1240                 new BackgroundSize(10, 20, false, false, false, false));
1241         assertEquals(expected, image);
1242     }
1243 
1244     @Test public void backgroundSize_length_percent() {
1245         region.setStyle(
1246                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1247                 "-fx-background-size: 50px 25%;");
1248         processCSS();
1249 
1250         assertEquals(0, region.getBackground().getFills().size(), 0);
1251         assertEquals(1, region.getBackground().getImages().size(), 0);
1252         assertNull(region.getBorder());
1253 
1254         BackgroundImage image = region.getBackground().getImages().get(0);
1255         BackgroundImage expected = new BackgroundImage(image.getImage(),
1256                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
1257                 BackgroundPosition.DEFAULT,
1258                 new BackgroundSize(50, .25, false, true, false, false));
1259         assertEquals(expected, image);
1260     }
1261 
1262     @Test public void backgroundSize_length_auto() {
1263         region.setStyle(
1264                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1265                 "-fx-background-size: 40px auto;");
1266         processCSS();
1267 
1268         assertEquals(0, region.getBackground().getFills().size(), 0);
1269         assertEquals(1, region.getBackground().getImages().size(), 0);
1270         assertNull(region.getBorder());
1271 
1272         BackgroundImage image = region.getBackground().getImages().get(0);
1273         BackgroundImage expected = new BackgroundImage(image.getImage(),
1274                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
1275                 BackgroundPosition.DEFAULT,
1276                 new BackgroundSize(40, AUTO, false, true, false, false));
1277         assertEquals(expected, image);
1278     }
1279 
1280     @Test public void backgroundSize_percent_length() {
1281         region.setStyle(
1282                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1283                 "-fx-background-size: 25% 30px;");
1284         processCSS();
1285 
1286         assertEquals(0, region.getBackground().getFills().size(), 0);
1287         assertEquals(1, region.getBackground().getImages().size(), 0);
1288         assertNull(region.getBorder());
1289 
1290         BackgroundImage image = region.getBackground().getImages().get(0);
1291         BackgroundImage expected = new BackgroundImage(image.getImage(),
1292                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
1293                 BackgroundPosition.DEFAULT,
1294                 new BackgroundSize(.25, 30, true, false, false, false));
1295         assertEquals(expected, image);
1296     }
1297 
1298     @Test public void backgroundSize_percent_percent() {
1299         region.setStyle(
1300                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1301                 "-fx-background-size: 25% 75%;");
1302         processCSS();
1303 
1304         assertEquals(0, region.getBackground().getFills().size(), 0);
1305         assertEquals(1, region.getBackground().getImages().size(), 0);
1306         assertNull(region.getBorder());
1307 
1308         BackgroundImage image = region.getBackground().getImages().get(0);
1309         BackgroundImage expected = new BackgroundImage(image.getImage(),
1310                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
1311                 BackgroundPosition.DEFAULT,
1312                 new BackgroundSize(.25, .75, true, true, false, false));
1313         assertEquals(expected, image);
1314     }
1315 
1316     @Test public void backgroundSize_percent_auto() {
1317         region.setStyle(
1318                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1319                 "-fx-background-size: 25% auto;");
1320         processCSS();
1321 
1322         assertEquals(0, region.getBackground().getFills().size(), 0);
1323         assertEquals(1, region.getBackground().getImages().size(), 0);
1324         assertNull(region.getBorder());
1325 
1326         BackgroundImage image = region.getBackground().getImages().get(0);
1327         BackgroundImage expected = new BackgroundImage(image.getImage(),
1328                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
1329                 BackgroundPosition.DEFAULT,
1330                 new BackgroundSize(.25, AUTO, true, true, false, false));
1331         assertEquals(expected, image);
1332     }
1333 
1334     @Test public void backgroundSize_auto_length() {
1335         region.setStyle(
1336                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1337                 "-fx-background-size: auto 25px;");
1338         processCSS();
1339 
1340         assertEquals(0, region.getBackground().getFills().size(), 0);
1341         assertEquals(1, region.getBackground().getImages().size(), 0);
1342         assertNull(region.getBorder());
1343 
1344         BackgroundImage image = region.getBackground().getImages().get(0);
1345         BackgroundImage expected = new BackgroundImage(image.getImage(),
1346                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
1347                 BackgroundPosition.DEFAULT,
1348                 new BackgroundSize(AUTO, 25, true, false, false, false));
1349         assertEquals(expected, image);
1350     }
1351 
1352     @Test public void backgroundSize_auto_percent() {
1353         region.setStyle(
1354                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1355                 "-fx-background-size: auto 50%;");
1356         processCSS();
1357 
1358         assertEquals(0, region.getBackground().getFills().size(), 0);
1359         assertEquals(1, region.getBackground().getImages().size(), 0);
1360         assertNull(region.getBorder());
1361 
1362         BackgroundImage image = region.getBackground().getImages().get(0);
1363         BackgroundImage expected = new BackgroundImage(image.getImage(),
1364                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
1365                 BackgroundPosition.DEFAULT,
1366                 new BackgroundSize(AUTO, .5, true, true, false, false));
1367         assertEquals(expected, image);
1368     }
1369 
1370     @Test public void backgroundSize_auto_auto() {
1371         region.setStyle(
1372                 "-fx-background-image: url('javafx/scene/layout/red.png');" +
1373                 "-fx-background-size: auto auto;");
1374         processCSS();
1375 
1376         assertEquals(0, region.getBackground().getFills().size(), 0);
1377         assertEquals(1, region.getBackground().getImages().size(), 0);
1378         assertNull(region.getBorder());
1379 
1380         BackgroundImage image = region.getBackground().getImages().get(0);
1381         BackgroundImage expected = new BackgroundImage(image.getImage(),
1382                 BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT,
1383                 BackgroundPosition.DEFAULT,
1384                 new BackgroundSize(AUTO, AUTO, true, true, false, false));
1385         assertEquals(expected, image);
1386     }
1387 
1388 
1389     /**************************************************************************
1390      *                                                                        *
1391      * Stroke Border tests                                                    *
1392      *                                                                        *
1393      *  These include -fx-border-color, -fx-border-style, and                 *
1394      *  -fx-border-width properties.                                          *
1395      *                                                                        *
1396      *************************************************************************/
1397 
1398     @Test public void borderStrokeStyleIsNull() {
1399         region.setStyle("-fx-border-style: null;");
1400         processCSS();
1401 
1402         assertEquals(new Insets(0), region.getPadding());
1403         assertNull(region.getBackground());
1404         assertNull(region.getBorder());
1405     }
1406 
1407     @Ignore("-fx-border-style-top is not supported")
1408     @Test public void borderStyle_top() {
1409         region.setStyle("-fx-border-style-top: solid;");
1410         processCSS();
1411 
1412         assertEquals(0, region.getBackground().getFills().size(), 0);
1413         assertEquals(0, region.getBackground().getImages().size(), 0);
1414         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1415         assertEquals(0, region.getBorder().getImages().size(), 0);
1416 
1417         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1418         BorderStroke expected = new BorderStroke(
1419                 Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK,
1420                 BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID,
1421                 null, null, Insets.EMPTY);
1422         assertEquals(expected, stroke);
1423     }
1424 
1425     @Ignore("-fx-border-style-right is not supported")
1426     @Test public void borderStyle_right() {
1427         region.setStyle("-fx-border-style-right: solid;");
1428         processCSS();
1429 
1430         assertEquals(0, region.getBackground().getFills().size(), 0);
1431         assertEquals(0, region.getBackground().getImages().size(), 0);
1432         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1433         assertEquals(0, region.getBorder().getImages().size(), 0);
1434 
1435         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1436         BorderStroke expected = new BorderStroke(
1437                 Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK,
1438                 BorderStrokeStyle.NONE, BorderStrokeStyle.SOLID, BorderStrokeStyle.NONE, BorderStrokeStyle.SOLID,
1439                 null, null, Insets.EMPTY);
1440         assertEquals(expected, stroke);
1441     }
1442 
1443     @Ignore("-fx-border-style-bottom is not supported")
1444     @Test public void borderStyle_bottom() {
1445         region.setStyle("-fx-border-style-bottom: solid;");
1446         processCSS();
1447 
1448         assertEquals(0, region.getBackground().getFills().size(), 0);
1449         assertEquals(0, region.getBackground().getImages().size(), 0);
1450         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1451         assertEquals(0, region.getBorder().getImages().size(), 0);
1452 
1453         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1454         BorderStroke expected = new BorderStroke(
1455                 Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK,
1456                 BorderStrokeStyle.NONE, BorderStrokeStyle.NONE, BorderStrokeStyle.SOLID, BorderStrokeStyle.NONE,
1457                 null, null, Insets.EMPTY);
1458         assertEquals(expected, stroke);
1459     }
1460 
1461     @Ignore("-fx-border-style-left is not supported")
1462     @Test public void borderStyle_left() {
1463         region.setStyle("-fx-border-style-left: solid;");
1464         processCSS();
1465 
1466         assertEquals(0, region.getBackground().getFills().size(), 0);
1467         assertEquals(0, region.getBackground().getImages().size(), 0);
1468         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1469         assertEquals(0, region.getBorder().getImages().size(), 0);
1470 
1471         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1472         BorderStroke expected = new BorderStroke(
1473                 Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK,
1474                 BorderStrokeStyle.NONE, BorderStrokeStyle.NONE, BorderStrokeStyle.NONE, BorderStrokeStyle.SOLID,
1475                 null, null, Insets.EMPTY);
1476         assertEquals(expected, stroke);
1477     }
1478 
1479     @Ignore("-fx-border-style-top and -fx-border-style-right are not supported")
1480     @Test public void borderStyle_top_right() {
1481         region.setStyle(
1482                 "-fx-border-style-top: solid;" +
1483                 "-fx-border-style-right: dashed;");
1484         processCSS();
1485 
1486         assertEquals(0, region.getBackground().getFills().size(), 0);
1487         assertEquals(0, region.getBackground().getImages().size(), 0);
1488         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1489         assertEquals(0, region.getBorder().getImages().size(), 0);
1490 
1491         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1492         BorderStroke expected = new BorderStroke(
1493                 Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK,
1494                 BorderStrokeStyle.SOLID, BorderStrokeStyle.DASHED, BorderStrokeStyle.SOLID, BorderStrokeStyle.DASHED,
1495                 null, null, Insets.EMPTY);
1496         assertEquals(expected, stroke);
1497     }
1498 
1499     @Ignore("-fx-border-style-top and -fx-border-style-bottom are not supported")
1500     @Test public void borderStyle_bottom_top() {
1501         region.setStyle(
1502                 "-fx-border-style-top: solid;" +
1503                 "-fx-border-style-bottom: dashed;");
1504         processCSS();
1505 
1506         assertEquals(0, region.getBackground().getFills().size(), 0);
1507         assertEquals(0, region.getBackground().getImages().size(), 0);
1508         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1509         assertEquals(0, region.getBorder().getImages().size(), 0);
1510 
1511         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1512         BorderStroke expected = new BorderStroke(
1513                 Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK,
1514                 BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.DASHED, BorderStrokeStyle.SOLID,
1515                 null, null, Insets.EMPTY);
1516         assertEquals(expected, stroke);
1517     }
1518 
1519     @Ignore("-fx-border-style-bottom and -fx-border-style-left are not supported")
1520     @Test public void borderStyle_left_bottom() {
1521         region.setStyle(
1522                 "-fx-border-style-bottom: solid;" +
1523                 "-fx-border-style-left: dashed;");
1524         processCSS();
1525 
1526         assertEquals(0, region.getBackground().getFills().size(), 0);
1527         assertEquals(0, region.getBackground().getImages().size(), 0);
1528         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1529         assertEquals(0, region.getBorder().getImages().size(), 0);
1530 
1531         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1532         BorderStroke expected = new BorderStroke(
1533                 Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK,
1534                 BorderStrokeStyle.NONE, BorderStrokeStyle.NONE, BorderStrokeStyle.SOLID, BorderStrokeStyle.DASHED,
1535                 null, null, Insets.EMPTY);
1536         assertEquals(expected, stroke);
1537     }
1538 
1539     @Test public void borderStyle_none() {
1540         region.setStyle("-fx-border-style: none;");
1541         processCSS();
1542 
1543         assertEquals(new Insets(0), region.getPadding());
1544         assertNull(region.getBackground());
1545         assertNull(region.getBorder());
1546     }
1547 
1548     @Test public void borderStyle_hidden() {
1549         region.setStyle("-fx-border-style: hidden;");
1550         processCSS();
1551 
1552         assertEquals(new Insets(0), region.getPadding());
1553         assertNull(region.getBackground());
1554         assertNull(region.getBorder());
1555     }
1556 
1557     @Test public void borderStyle_dotted() {
1558         region.setStyle("-fx-border-color: black; -fx-border-style: dotted;");
1559         processCSS();
1560 
1561         assertNull(region.getBackground());
1562         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1563         assertEquals(0, region.getBorder().getImages().size(), 0);
1564 
1565         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1566         BorderStroke expected = new BorderStroke(
1567                 Color.BLACK, BorderStrokeStyle.DOTTED,
1568                 null, null);
1569         assertEquals(expected, stroke);
1570     }
1571 
1572     // border-style: dashed
1573     @Test public void borderStyle_dashed() {
1574         region.setStyle("-fx-border-color: black; -fx-border-style: dashed;");
1575         processCSS();
1576 
1577         assertNull(region.getBackground());
1578         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1579         assertEquals(0, region.getBorder().getImages().size(), 0);
1580 
1581         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1582         BorderStroke expected = new BorderStroke(
1583                 Color.BLACK, BorderStrokeStyle.DASHED,
1584                 null, null);
1585         assertEquals(expected, stroke);
1586     }
1587 
1588     @Test public void borderStyle_solid() {
1589         region.setStyle("-fx-border-color: black; -fx-border-style: solid;");
1590         processCSS();
1591 
1592         assertNull(region.getBackground());
1593         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1594         assertEquals(0, region.getBorder().getImages().size(), 0);
1595 
1596         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1597         BorderStroke expected = new BorderStroke(
1598                 Color.BLACK, BorderStrokeStyle.SOLID,
1599                 null, null);
1600         assertEquals(expected, stroke);
1601     }
1602 
1603     @Ignore ("double not supported yet")
1604     @Test public void borderStyle_double() {
1605         region.setStyle("-fx-border-color: black; -fx-border-style: double;");
1606         processCSS();
1607 
1608         assertEquals(0, region.getBackground().getFills().size(), 0);
1609         assertEquals(0, region.getBackground().getImages().size(), 0);
1610         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1611         assertEquals(0, region.getBorder().getImages().size(), 0);
1612 
1613         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1614 //        BorderStroke expected = new BorderStroke(
1615 //                Color.BLACK, BorderStrokeStyle.DOUBLE,
1616 //                null, null);
1617 //        assertEquals(expected, stroke);
1618     }
1619 
1620     @Ignore ("groove not supported yet")
1621     @Test public void borderStyle_groove() {
1622         region.setStyle("-fx-border-color: black; -fx-border-style: groove;");
1623         processCSS();
1624 
1625         assertEquals(0, region.getBackground().getFills().size(), 0);
1626         assertEquals(0, region.getBackground().getImages().size(), 0);
1627         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1628         assertEquals(0, region.getBorder().getImages().size(), 0);
1629 
1630         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1631 //        BorderStroke expected = new BorderStroke(
1632 //                Color.BLACK, BorderStrokeStyle.GROOVE,
1633 //                null, null);
1634 //        assertEquals(expected, stroke);
1635     }
1636 
1637     @Ignore ("ridge not supported yet")
1638     @Test public void borderStyle_ridge() {
1639         region.setStyle("-fx-border-color: black; -fx-border-style: ridge;");
1640         processCSS();
1641 
1642         assertEquals(0, region.getBackground().getFills().size(), 0);
1643         assertEquals(0, region.getBackground().getImages().size(), 0);
1644         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1645         assertEquals(0, region.getBorder().getImages().size(), 0);
1646 
1647         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1648 //        BorderStroke expected = new BorderStroke(
1649 //                Color.BLACK, BorderStrokeStyle.RIDGE,
1650 //                null, null);
1651 //        assertEquals(expected, stroke);
1652     }
1653 
1654     @Ignore ("inset not supported yet")
1655     @Test public void borderStyle_inset() {
1656         region.setStyle("-fx-border-color: black; -fx-border-style: inset;");
1657         processCSS();
1658 
1659         assertEquals(0, region.getBackground().getFills().size(), 0);
1660         assertEquals(0, region.getBackground().getImages().size(), 0);
1661         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1662         assertEquals(0, region.getBorder().getImages().size(), 0);
1663 
1664         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1665 //        BorderStroke expected = new BorderStroke(
1666 //                Color.BLACK, BorderStrokeStyle.INSET,
1667 //                null, null);
1668 //        assertEquals(expected, stroke);
1669     }
1670 
1671     @Ignore ("outset not supported yet")
1672     @Test public void borderStyle_outset() {
1673         region.setStyle("-fx-border-color: black; -fx-border-style: outset;");
1674         processCSS();
1675 
1676         assertEquals(0, region.getBackground().getFills().size(), 0);
1677         assertEquals(0, region.getBackground().getImages().size(), 0);
1678         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1679         assertEquals(0, region.getBorder().getImages().size(), 0);
1680 
1681         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1682 //        BorderStroke expected = new BorderStroke(
1683 //                Color.BLACK, BorderStrokeStyle.OUTSET,
1684 //                null, null);
1685 //        assertEquals(expected, stroke);
1686     }
1687 
1688     @Test public void borderStyle_solid_dotted() {
1689         region.setStyle("-fx-border-color: black; -fx-border-style: solid dotted;");
1690         processCSS();
1691 
1692         assertNull(region.getBackground());
1693         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1694         assertEquals(0, region.getBorder().getImages().size(), 0);
1695 
1696         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1697         BorderStroke expected = new BorderStroke(
1698                 Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK,
1699                 BorderStrokeStyle.SOLID, BorderStrokeStyle.DOTTED, BorderStrokeStyle.SOLID, BorderStrokeStyle.DOTTED,
1700                 null, null, Insets.EMPTY);
1701         assertEquals(expected, stroke);
1702     }
1703 
1704     @Test public void borderStyle_solid_dotted_dashed() {
1705         region.setStyle("-fx-border-color: black; -fx-border-style: solid dotted dashed;");
1706         processCSS();
1707 
1708         assertNull(region.getBackground());
1709         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1710         assertEquals(0, region.getBorder().getImages().size(), 0);
1711 
1712         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1713         BorderStroke expected = new BorderStroke(
1714                 Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK,
1715                 BorderStrokeStyle.SOLID, BorderStrokeStyle.DOTTED, BorderStrokeStyle.DASHED, BorderStrokeStyle.DOTTED,
1716                 null, null, Insets.EMPTY);
1717         assertEquals(expected, stroke);
1718     }
1719 
1720     @Ignore ("ridge not supported yet")
1721     @Test public void borderStyle_solid_dotted_dashed_ridge() {
1722         region.setStyle("-fx-border-color: black; -fx-border-style: solid dotted dashed ridge;");
1723         processCSS();
1724 
1725         assertEquals(0, region.getBackground().getFills().size(), 0);
1726         assertEquals(0, region.getBackground().getImages().size(), 0);
1727         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1728         assertEquals(0, region.getBorder().getImages().size(), 0);
1729 
1730         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1731 //        BorderStroke expected = new BorderStroke(
1732 //                Color.BLACK, Color.BLACK, Color.BLACK, Color.BLACK,
1733 //                BorderStrokeStyle.SOLID, BorderStrokeStyle.DOTTED, BorderStrokeStyle.DASHED, BorderStrokeStyle.RIDGE,
1734 //                null, null, Insets.EMPTY);
1735 //        assertEquals(expected, stroke);
1736     }
1737 
1738     @Ignore ("-fx-border-width-top is not supported")
1739     @Test public void borderStrokeWidth_top() {
1740         region.setStyle(
1741                 "-fx-border-color: black;" +
1742                 "-fx-border-width-top: 10px;");
1743         processCSS();
1744 
1745         assertEquals(0, region.getBackground().getFills().size(), 0);
1746         assertEquals(0, region.getBackground().getImages().size(), 0);
1747         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1748         assertEquals(0, region.getBorder().getImages().size(), 0);
1749 
1750         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1751         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(10, 0, 0, 0));
1752         assertEquals(expected, stroke);
1753     }
1754 
1755     @Ignore ("-fx-border-width-right is not supported")
1756     @Test public void borderStrokeWidth_right() {
1757         region.setStyle(
1758                 "-fx-border-color: black;" +
1759                 "-fx-border-width-right: 10px;");
1760         processCSS();
1761 
1762         assertEquals(0, region.getBackground().getFills().size(), 0);
1763         assertEquals(0, region.getBackground().getImages().size(), 0);
1764         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1765         assertEquals(0, region.getBorder().getImages().size(), 0);
1766 
1767         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1768         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(0, 10, 0, 0));
1769         assertEquals(expected, stroke);
1770     }
1771 
1772     @Ignore ("-fx-border-width-bottom is not supported")
1773     @Test public void borderStrokeWidth_bottom() {
1774         region.setStyle(
1775                 "-fx-border-color: black;" +
1776                 "-fx-border-width-bottom: 10px;");
1777         processCSS();
1778 
1779         assertEquals(0, region.getBackground().getFills().size(), 0);
1780         assertEquals(0, region.getBackground().getImages().size(), 0);
1781         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1782         assertEquals(0, region.getBorder().getImages().size(), 0);
1783 
1784         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1785         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(0, 0, 10, 0));
1786         assertEquals(expected, stroke);
1787     }
1788 
1789     @Ignore ("-fx-border-width-left is not supported")
1790     @Test public void borderStrokeWidth_left() {
1791         region.setStyle(
1792                 "-fx-border-color: black;" +
1793                 "-fx-border-width-left: 10px;");
1794         processCSS();
1795 
1796         assertEquals(0, region.getBackground().getFills().size(), 0);
1797         assertEquals(0, region.getBackground().getImages().size(), 0);
1798         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1799         assertEquals(0, region.getBorder().getImages().size(), 0);
1800 
1801         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1802         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(0, 0, 0, 10));
1803         assertEquals(expected, stroke);
1804     }
1805 
1806     @Ignore ("-fx-border-width-top and -fx-border-width-right are not supported")
1807     @Test public void borderStrokeWidth_top_right() {
1808         region.setStyle(
1809                 "-fx-border-color: black;" +
1810                 "-fx-border-width-top: 10px;" +
1811                 "-fx-border-width-right: 20px;");
1812         processCSS();
1813 
1814         assertEquals(0, region.getBackground().getFills().size(), 0);
1815         assertEquals(0, region.getBackground().getImages().size(), 0);
1816         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1817         assertEquals(0, region.getBorder().getImages().size(), 0);
1818 
1819         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1820         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(10, 20, 0, 0));
1821         assertEquals(expected, stroke);
1822     }
1823 
1824     @Ignore ("-fx-border-width-top and -fx-border-width-bottom are not supported")
1825     @Test public void borderStrokeWidth_top_bottom() {
1826         region.setStyle(
1827                 "-fx-border-color: black;" +
1828                 "-fx-border-width-top: 10px;" +
1829                 "-fx-border-width-bottom: 20px;");
1830         processCSS();
1831 
1832         assertEquals(0, region.getBackground().getFills().size(), 0);
1833         assertEquals(0, region.getBackground().getImages().size(), 0);
1834         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1835         assertEquals(0, region.getBorder().getImages().size(), 0);
1836 
1837         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1838         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(10, 0, 20, 0));
1839         assertEquals(expected, stroke);
1840     }
1841 
1842     @Ignore ("-fx-border-width-left and -fx-border-width-bottom are not supported")
1843     @Test public void borderStrokeWidth_left_bottom() {
1844         region.setStyle(
1845                 "-fx-border-color: black;" +
1846                 "-fx-border-width-left: 10px;" +
1847                 "-fx-border-width-bottom: 20px;");
1848         processCSS();
1849 
1850         assertEquals(0, region.getBackground().getFills().size(), 0);
1851         assertEquals(0, region.getBackground().getImages().size(), 0);
1852         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1853         assertEquals(0, region.getBorder().getImages().size(), 0);
1854 
1855         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1856         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(0, 0, 20, 10));
1857         assertEquals(expected, stroke);
1858     }
1859 
1860     @Test public void borderStrokeWidth2() {
1861         region.setStyle(
1862                 "-fx-border-color: black;" +
1863                 "-fx-border-width: 1px 2px;");
1864         processCSS();
1865 
1866         assertNull(region.getBackground());
1867         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1868         assertEquals(0, region.getBorder().getImages().size(), 0);
1869 
1870         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1871         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(1, 2, 1, 2));
1872         assertEquals(expected, stroke);
1873     }
1874 
1875     @Test public void borderStrokeWidth3() {
1876         region.setStyle(
1877                 "-fx-border-color: black;" +
1878                 "-fx-border-width: 1px 2px 3px;");
1879         processCSS();
1880 
1881         assertNull(region.getBackground());
1882         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1883         assertEquals(0, region.getBorder().getImages().size(), 0);
1884 
1885         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1886         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(1, 2, 3, 2));
1887         assertEquals(expected, stroke);
1888     }
1889 
1890     @Test public void borderStrokeWidth4() {
1891         region.setStyle(
1892                 "-fx-border-color: black;" +
1893                 "-fx-border-width: 1px 2px 3px 4px;");
1894         processCSS();
1895 
1896         assertNull(region.getBackground());
1897         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1898         assertEquals(0, region.getBorder().getImages().size(), 0);
1899 
1900         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1901         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(1, 2, 3, 4));
1902         assertEquals(expected, stroke);
1903     }
1904 
1905     @Ignore("thin keyword is not supported")
1906     @Test public void borderStrokeWidth_thin() {
1907         region.setStyle(
1908                 "-fx-border-color: black;" +
1909                 "-fx-border-width: thin;");
1910         processCSS();
1911 
1912         assertEquals(0, region.getBackground().getFills().size(), 0);
1913         assertEquals(0, region.getBackground().getImages().size(), 0);
1914         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1915         assertEquals(0, region.getBorder().getImages().size(), 0);
1916 
1917         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1918         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(1, 1, 1, 1));
1919         assertEquals(expected, stroke);
1920     }
1921 
1922     @Ignore("thick keyword is not supported")
1923     @Test public void borderStrokeWidth_thick() {
1924         region.setStyle(
1925                 "-fx-border-color: black;" +
1926                 "-fx-border-width: thick;");
1927         processCSS();
1928 
1929         assertEquals(0, region.getBackground().getFills().size(), 0);
1930         assertEquals(0, region.getBackground().getImages().size(), 0);
1931         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1932         assertEquals(0, region.getBorder().getImages().size(), 0);
1933 
1934         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1935         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(5, 5, 5, 5));
1936         assertEquals(expected, stroke);
1937     }
1938 
1939     @Ignore("medium keyword is not supported")
1940     @Test public void borderStrokeWidth_medium() {
1941         region.setStyle(
1942                 "-fx-border-color: black;" +
1943                 "-fx-border-width: medium;");
1944         processCSS();
1945 
1946         assertEquals(0, region.getBackground().getFills().size(), 0);
1947         assertEquals(0, region.getBackground().getImages().size(), 0);
1948         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1949         assertEquals(0, region.getBorder().getImages().size(), 0);
1950 
1951         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1952         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(3, 3, 3, 3));
1953         assertEquals(expected, stroke);
1954     }
1955 
1956     @Ignore("thin, medium, and thick keywords are not supported")
1957     @Test public void borderStrokeWidth_thin_medium_thick() {
1958         region.setStyle(
1959                 "-fx-border-color: black;" +
1960                 "-fx-border-width: thin medium thick;");
1961         processCSS();
1962 
1963         assertEquals(0, region.getBackground().getFills().size(), 0);
1964         assertEquals(0, region.getBackground().getImages().size(), 0);
1965         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1966         assertEquals(0, region.getBorder().getImages().size(), 0);
1967 
1968         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1969         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(1, 3, 5, 3));
1970         assertEquals(expected, stroke);
1971     }
1972 
1973     // TODO example 20
1974     // TODO example 21
1975 
1976     // TODO!! The initial width of a border is MEDIUM, NOT 0!
1977 
1978     @Ignore("-fx-border-top-left-radius not supported")
1979     @Test public void borderStrokeRadius_topLeft1() {
1980         region.setStyle(
1981                 "-fx-border-color: black;" +
1982                 "-fx-border-top-left-radius: 5px;");
1983         processCSS();
1984 
1985         assertEquals(0, region.getBackground().getFills().size(), 0);
1986         assertEquals(0, region.getBackground().getImages().size(), 0);
1987         assertEquals(1, region.getBorder().getStrokes().size(), 0);
1988         assertEquals(0, region.getBorder().getImages().size(), 0);
1989 
1990         BorderStroke stroke = region.getBorder().getStrokes().get(0);
1991         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
1992                 new CornerRadii(5, 0, 0, 0, false), BorderStroke.DEFAULT_WIDTHS);
1993         assertEquals(expected, stroke);
1994     }
1995 
1996     @Ignore("-fx-border-top-left-radius not supported")
1997     @Test public void borderStrokeRadius_topLeft2() {
1998         region.setStyle(
1999                 "-fx-border-color: black;" +
2000                 "-fx-border-top-left-radius: 5px, 10px;");
2001         processCSS();
2002 
2003         assertEquals(0, region.getBackground().getFills().size(), 0);
2004         assertEquals(0, region.getBackground().getImages().size(), 0);
2005         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2006         assertEquals(0, region.getBorder().getImages().size(), 0);
2007 
2008         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2009         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2010                 new CornerRadii(
2011                         5, 10, // top left
2012                         0, 0, // top right
2013                         0, 0, // bottom right
2014                         0, 0, // bottom left
2015                         false, false, // top left as percent
2016                         false, false, // top right as percent
2017                         false, false, // bottom right as percent
2018                         false, false), // bottom left as percent
2019                 BorderStroke.DEFAULT_WIDTHS);
2020         assertEquals(expected, stroke);
2021     }
2022 
2023     @Ignore("-fx-border-top-left-radius not supported")
2024     @Test public void borderStrokeRadius_topLeft3() {
2025         region.setStyle(
2026                 "-fx-border-color: black;" +
2027                 "-fx-border-top-left-radius: 5%;");
2028         processCSS();
2029 
2030         assertEquals(0, region.getBackground().getFills().size(), 0);
2031         assertEquals(0, region.getBackground().getImages().size(), 0);
2032         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2033         assertEquals(0, region.getBorder().getImages().size(), 0);
2034 
2035         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2036         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2037                 new CornerRadii(
2038                         5, 5, // top left
2039                         0, 0, // top right
2040                         0, 0, // bottom right
2041                         0, 0, // bottom left
2042                         true, true, // top left as percent
2043                         false, false, // top right as percent
2044                         false, false, // bottom right as percent
2045                         false, false), // bottom left as percent
2046                 BorderStroke.DEFAULT_WIDTHS);
2047         assertEquals(expected, stroke);
2048     }
2049 
2050     @Ignore("-fx-border-top-left-radius not supported")
2051     @Test public void borderStrokeRadius_topLeft4() {
2052         region.setStyle(
2053                 "-fx-border-color: black;" +
2054                 "-fx-border-top-left-radius: 5%, 10%;");
2055         processCSS();
2056 
2057         assertEquals(0, region.getBackground().getFills().size(), 0);
2058         assertEquals(0, region.getBackground().getImages().size(), 0);
2059         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2060         assertEquals(0, region.getBorder().getImages().size(), 0);
2061 
2062         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2063         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2064                 new CornerRadii(
2065                         5, 10, // top left
2066                         0, 0, // top right
2067                         0, 0, // bottom right
2068                         0, 0, // bottom left
2069                         true, true, // top left as percent
2070                         false, false, // top right as percent
2071                         false, false, // bottom right as percent
2072                         false, false), // bottom left as percent
2073                 BorderStroke.DEFAULT_WIDTHS);
2074         assertEquals(expected, stroke);
2075     }
2076 
2077     @Ignore("-fx-border-top-left-radius not supported")
2078     @Test public void borderStrokeRadius_topLeft5() {
2079         region.setStyle(
2080                 "-fx-border-color: black;" +
2081                 "-fx-border-top-left-radius: 5% 10px;");
2082         processCSS();
2083 
2084         assertEquals(0, region.getBackground().getFills().size(), 0);
2085         assertEquals(0, region.getBackground().getImages().size(), 0);
2086         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2087         assertEquals(0, region.getBorder().getImages().size(), 0);
2088 
2089         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2090         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2091                 new CornerRadii(
2092                         5, 10, // top left
2093                         0, 0, // top right
2094                         0, 0, // bottom right
2095                         0, 0, // bottom left
2096                         true, false, // top left as percent
2097                         false, false, // top right as percent
2098                         false, false, // bottom right as percent
2099                         false, false), // bottom left as percent
2100                 BorderStroke.DEFAULT_WIDTHS);
2101         assertEquals(expected, stroke);
2102     }
2103 
2104     @Ignore("-fx-border-top-left-radius not supported")
2105     @Test public void borderStrokeRadius_topLeft6() {
2106         region.setStyle(
2107                 "-fx-border-color: black;" +
2108                 "-fx-border-top-left-radius: 5px, 10%;");
2109         processCSS();
2110 
2111         assertEquals(0, region.getBackground().getFills().size(), 0);
2112         assertEquals(0, region.getBackground().getImages().size(), 0);
2113         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2114         assertEquals(0, region.getBorder().getImages().size(), 0);
2115 
2116         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2117         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2118                 new CornerRadii(
2119                         5, 10, // top left
2120                         0, 0, // top right
2121                         0, 0, // bottom right
2122                         0, 0, // bottom left
2123                         false, true, // top left as percent
2124                         false, false, // top right as percent
2125                         false, false, // bottom right as percent
2126                         false, false), // bottom left as percent
2127                 BorderStroke.DEFAULT_WIDTHS);
2128         assertEquals(expected, stroke);
2129     }
2130 
2131     @Ignore("-fx-border-top-right-radius not supported")
2132     @Test public void borderStrokeRadius_topRight1() {
2133         region.setStyle(
2134                 "-fx-border-color: black;" +
2135                 "-fx-border-top-right-radius: 5px;");
2136         processCSS();
2137 
2138         assertEquals(0, region.getBackground().getFills().size(), 0);
2139         assertEquals(0, region.getBackground().getImages().size(), 0);
2140         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2141         assertEquals(0, region.getBorder().getImages().size(), 0);
2142 
2143         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2144         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2145                 new CornerRadii(0, 5, 0, 0, false), BorderStroke.DEFAULT_WIDTHS);
2146         assertEquals(expected, stroke);
2147     }
2148 
2149     @Ignore("-fx-border-top-right-radius not supported")
2150     @Test public void borderStrokeRadius_topRight2() {
2151         region.setStyle(
2152                 "-fx-border-color: black;" +
2153                 "-fx-border-top-right-radius: 5px, 10px;");
2154         processCSS();
2155 
2156         assertEquals(0, region.getBackground().getFills().size(), 0);
2157         assertEquals(0, region.getBackground().getImages().size(), 0);
2158         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2159         assertEquals(0, region.getBorder().getImages().size(), 0);
2160 
2161         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2162         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2163                 new CornerRadii(
2164                         0, 0, // top left
2165                         5, 10, // top right
2166                         0, 0, // bottom right
2167                         0, 0, // bottom left
2168                         false, false, // top left as percent
2169                         false, false, // top right as percent
2170                         false, false, // bottom right as percent
2171                         false, false), // bottom left as percent
2172                 BorderStroke.DEFAULT_WIDTHS);
2173         assertEquals(expected, stroke);
2174     }
2175 
2176     @Ignore("-fx-border-top-right-radius not supported")
2177     @Test public void borderStrokeRadius_topRight3() {
2178         region.setStyle(
2179                 "-fx-border-color: black;" +
2180                 "-fx-border-top-right-radius: 5%;");
2181         processCSS();
2182 
2183         assertEquals(0, region.getBackground().getFills().size(), 0);
2184         assertEquals(0, region.getBackground().getImages().size(), 0);
2185         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2186         assertEquals(0, region.getBorder().getImages().size(), 0);
2187 
2188         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2189         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2190                 new CornerRadii(
2191                         0, 0, // top left
2192                         5, 5, // top right
2193                         0, 0, // bottom right
2194                         0, 0, // bottom left
2195                         false, false, // top left as percent
2196                         true, true, // top right as percent
2197                         false, false, // bottom right as percent
2198                         false, false), // bottom left as percent
2199                 BorderStroke.DEFAULT_WIDTHS);
2200         assertEquals(expected, stroke);
2201     }
2202 
2203     @Ignore("-fx-border-top-right-radius not supported")
2204     @Test public void borderStrokeRadius_topRight4() {
2205         region.setStyle(
2206                 "-fx-border-color: black;" +
2207                 "-fx-border-top-right-radius: 5%, 10%;");
2208         processCSS();
2209 
2210         assertEquals(0, region.getBackground().getFills().size(), 0);
2211         assertEquals(0, region.getBackground().getImages().size(), 0);
2212         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2213         assertEquals(0, region.getBorder().getImages().size(), 0);
2214 
2215         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2216         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2217                 new CornerRadii(
2218                         0, 0, // top left
2219                         5, 10, // top right
2220                         0, 0, // bottom right
2221                         0, 0, // bottom left
2222                         false, false, // top left as percent
2223                         true, true, // top right as percent
2224                         false, false, // bottom right as percent
2225                         false, false), // bottom left as percent
2226                 BorderStroke.DEFAULT_WIDTHS);
2227         assertEquals(expected, stroke);
2228     }
2229 
2230     @Ignore("-fx-border-top-right-radius not supported")
2231     @Test public void borderStrokeRadius_topRight5() {
2232         region.setStyle(
2233                 "-fx-border-color: black;" +
2234                 "-fx-border-top-right-radius: 5% 10px;");
2235         processCSS();
2236 
2237         assertEquals(0, region.getBackground().getFills().size(), 0);
2238         assertEquals(0, region.getBackground().getImages().size(), 0);
2239         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2240         assertEquals(0, region.getBorder().getImages().size(), 0);
2241 
2242         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2243         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2244                 new CornerRadii(
2245                         0, 0, // top left
2246                         5, 10, // top right
2247                         0, 0, // bottom right
2248                         0, 0, // bottom left
2249                         false, false, // top left as percent
2250                         true, false, // top right as percent
2251                         false, false, // bottom right as percent
2252                         false, false), // bottom left as percent
2253                 BorderStroke.DEFAULT_WIDTHS);
2254         assertEquals(expected, stroke);
2255     }
2256 
2257     @Ignore("-fx-border-top-right-radius not supported")
2258     @Test public void borderStrokeRadius_topRight6() {
2259         region.setStyle(
2260                 "-fx-border-color: black;" +
2261                 "-fx-border-top-right-radius: 5px, 10%;");
2262         processCSS();
2263 
2264         assertEquals(0, region.getBackground().getFills().size(), 0);
2265         assertEquals(0, region.getBackground().getImages().size(), 0);
2266         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2267         assertEquals(0, region.getBorder().getImages().size(), 0);
2268 
2269         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2270         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2271                 new CornerRadii(
2272                         0, 0, // top left
2273                         5, 10, // top right
2274                         0, 0, // bottom right
2275                         0, 0, // bottom left
2276                         false, false, // top left as percent
2277                         false, true, // top right as percent
2278                         false, false, // bottom right as percent
2279                         false, false), // bottom left as percent
2280                 BorderStroke.DEFAULT_WIDTHS);
2281         assertEquals(expected, stroke);
2282     }
2283 
2284     @Ignore("-fx-border-bottom-right-radius not supported")
2285     @Test public void borderStrokeRadius_bottomRight1() {
2286         region.setStyle(
2287                 "-fx-border-color: black;" +
2288                 "-fx-border-bottom-right-radius: 5px;");
2289         processCSS();
2290 
2291         assertEquals(0, region.getBackground().getFills().size(), 0);
2292         assertEquals(0, region.getBackground().getImages().size(), 0);
2293         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2294         assertEquals(0, region.getBorder().getImages().size(), 0);
2295 
2296         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2297         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2298                 new CornerRadii(0, 0, 5, 0, false), BorderStroke.DEFAULT_WIDTHS);
2299         assertEquals(expected, stroke);
2300     }
2301 
2302     @Ignore("-fx-border-bottom-right-radius not supported")
2303     @Test public void borderStrokeRadius_bottomRight2() {
2304         region.setStyle(
2305                 "-fx-border-color: black;" +
2306                 "-fx-border-bottom-right-radius: 5px, 10px;");
2307         processCSS();
2308 
2309         assertEquals(0, region.getBackground().getFills().size(), 0);
2310         assertEquals(0, region.getBackground().getImages().size(), 0);
2311         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2312         assertEquals(0, region.getBorder().getImages().size(), 0);
2313 
2314         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2315         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2316                 new CornerRadii(
2317                         0, 0, // top left
2318                         0, 0, // top right
2319                         5, 10, // bottom right
2320                         0, 0, // bottom left
2321                         false, false, // top left as percent
2322                         false, false, // top right as percent
2323                         false, false, // bottom right as percent
2324                         false, false), // bottom left as percent
2325                 BorderStroke.DEFAULT_WIDTHS);
2326         assertEquals(expected, stroke);
2327     }
2328 
2329     @Ignore("-fx-border-bottom-right-radius not supported")
2330     @Test public void borderStrokeRadius_bottomRight3() {
2331         region.setStyle(
2332                 "-fx-border-color: black;" +
2333                 "-fx-border-bottom-right-radius: 5%;");
2334         processCSS();
2335 
2336         assertEquals(0, region.getBackground().getFills().size(), 0);
2337         assertEquals(0, region.getBackground().getImages().size(), 0);
2338         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2339         assertEquals(0, region.getBorder().getImages().size(), 0);
2340 
2341         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2342         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2343                 new CornerRadii(
2344                         0, 0, // top left
2345                         0, 0, // top right
2346                         5, 5, // bottom right
2347                         0, 0, // bottom left
2348                         false, false, // top left as percent
2349                         false, false, // top right as percent
2350                         true, true, // bottom right as percent
2351                         false, false), // bottom left as percent
2352                 BorderStroke.DEFAULT_WIDTHS);
2353         assertEquals(expected, stroke);
2354     }
2355 
2356     @Ignore("-fx-border-bottom-right-radius not supported")
2357     @Test public void borderStrokeRadius_bottomRight4() {
2358         region.setStyle(
2359                 "-fx-border-color: black;" +
2360                 "-fx-border-bottom-right-radius: 5%, 10%;");
2361         processCSS();
2362 
2363         assertEquals(0, region.getBackground().getFills().size(), 0);
2364         assertEquals(0, region.getBackground().getImages().size(), 0);
2365         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2366         assertEquals(0, region.getBorder().getImages().size(), 0);
2367 
2368         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2369         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2370                 new CornerRadii(
2371                         0, 0, // top left
2372                         0, 0, // top right
2373                         5, 10, // bottom right
2374                         0, 0, // bottom left
2375                         false, false, // top left as percent
2376                         false, false, // top right as percent
2377                         true, true, // bottom right as percent
2378                         false, false), // bottom left as percent
2379                 BorderStroke.DEFAULT_WIDTHS);
2380         assertEquals(expected, stroke);
2381     }
2382 
2383     @Ignore("-fx-border-bottom-right-radius not supported")
2384     @Test public void borderStrokeRadius_bottomRight5() {
2385         region.setStyle(
2386                 "-fx-border-color: black;" +
2387                 "-fx-border-bottom-right-radius: 5% 10px;");
2388         processCSS();
2389 
2390         assertEquals(0, region.getBackground().getFills().size(), 0);
2391         assertEquals(0, region.getBackground().getImages().size(), 0);
2392         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2393         assertEquals(0, region.getBorder().getImages().size(), 0);
2394 
2395         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2396         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2397                 new CornerRadii(
2398                         0, 0, // top left
2399                         0, 0, // top right
2400                         5, 10, // bottom right
2401                         0, 0, // bottom left
2402                         false, false, // top left as percent
2403                         false, false, // top right as percent
2404                         true, false, // bottom right as percent
2405                         false, false), // bottom left as percent
2406                 BorderStroke.DEFAULT_WIDTHS);
2407         assertEquals(expected, stroke);
2408     }
2409 
2410     @Ignore("-fx-border-bottom-right-radius not supported")
2411     @Test public void borderStrokeRadius_bottomRight6() {
2412         region.setStyle(
2413                 "-fx-border-color: black;" +
2414                 "-fx-border-bottom-right-radius: 5px, 10%;");
2415         processCSS();
2416 
2417         assertEquals(0, region.getBackground().getFills().size(), 0);
2418         assertEquals(0, region.getBackground().getImages().size(), 0);
2419         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2420         assertEquals(0, region.getBorder().getImages().size(), 0);
2421 
2422         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2423         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2424                 new CornerRadii(
2425                         0, 0, // top left
2426                         0, 0, // top right
2427                         5, 10, // bottom right
2428                         0, 0, // bottom left
2429                         false, false, // top left as percent
2430                         false, false, // top right as percent
2431                         false, true, // bottom right as percent
2432                         false, false), // bottom left as percent
2433                 BorderStroke.DEFAULT_WIDTHS);
2434         assertEquals(expected, stroke);
2435     }
2436 
2437     @Ignore("-fx-border-bottom-left-radius not supported")
2438     @Test public void borderStrokeRadius_bottomLeft1() {
2439         region.setStyle(
2440                 "-fx-border-color: black;" +
2441                 "-fx-border-bottom-left-radius: 5px;");
2442         processCSS();
2443 
2444         assertEquals(0, region.getBackground().getFills().size(), 0);
2445         assertEquals(0, region.getBackground().getImages().size(), 0);
2446         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2447         assertEquals(0, region.getBorder().getImages().size(), 0);
2448 
2449         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2450         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2451                 new CornerRadii(0, 0, 0, 5, false), BorderStroke.DEFAULT_WIDTHS);
2452         assertEquals(expected, stroke);
2453     }
2454 
2455     @Ignore("-fx-border-bottom-left-radius not supported")
2456     @Test public void borderStrokeRadius_bottomLeft2() {
2457         region.setStyle(
2458                 "-fx-border-color: black;" +
2459                 "-fx-border-bottom-left-radius: 5px, 10px;");
2460         processCSS();
2461 
2462         assertEquals(0, region.getBackground().getFills().size(), 0);
2463         assertEquals(0, region.getBackground().getImages().size(), 0);
2464         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2465         assertEquals(0, region.getBorder().getImages().size(), 0);
2466 
2467         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2468         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2469                 new CornerRadii(
2470                         0, 0, // top left
2471                         0, 0, // top right
2472                         0, 0, // bottom right
2473                         5, 10, // bottom left
2474                         false, false, // top left as percent
2475                         false, false, // top right as percent
2476                         false, false, // bottom right as percent
2477                         false, false), // bottom left as percent
2478                 BorderStroke.DEFAULT_WIDTHS);
2479         assertEquals(expected, stroke);
2480     }
2481 
2482     @Ignore("-fx-border-bottom-left-radius not supported")
2483     @Test public void borderStrokeRadius_bottomLeft3() {
2484         region.setStyle(
2485                 "-fx-border-color: black;" +
2486                 "-fx-border-bottom-left-radius: 5%;");
2487         processCSS();
2488 
2489         assertEquals(0, region.getBackground().getFills().size(), 0);
2490         assertEquals(0, region.getBackground().getImages().size(), 0);
2491         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2492         assertEquals(0, region.getBorder().getImages().size(), 0);
2493 
2494         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2495         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2496                 new CornerRadii(
2497                         0, 0, // top left
2498                         0, 0, // top right
2499                         0, 0, // bottom right
2500                         5, 5, // bottom left
2501                         false, false, // top left as percent
2502                         false, false, // top right as percent
2503                         false, false, // bottom right as percent
2504                         true, true), // bottom left as percent
2505                 BorderStroke.DEFAULT_WIDTHS);
2506         assertEquals(expected, stroke);
2507     }
2508 
2509     @Ignore("-fx-border-bottom-left-radius not supported")
2510     @Test public void borderStrokeRadius_bottomLeft4() {
2511         region.setStyle(
2512                 "-fx-border-color: black;" +
2513                 "-fx-border-bottom-left-radius: 5%, 10%;");
2514         processCSS();
2515 
2516         assertEquals(0, region.getBackground().getFills().size(), 0);
2517         assertEquals(0, region.getBackground().getImages().size(), 0);
2518         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2519         assertEquals(0, region.getBorder().getImages().size(), 0);
2520 
2521         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2522         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2523                 new CornerRadii(
2524                         0, 0, // top left
2525                         0, 0, // top right
2526                         0, 0, // bottom right
2527                         5, 10, // bottom left
2528                         false, false, // top left as percent
2529                         false, false, // top right as percent
2530                         false, false, // bottom right as percent
2531                         true, true), // bottom left as percent
2532                 BorderStroke.DEFAULT_WIDTHS);
2533         assertEquals(expected, stroke);
2534     }
2535 
2536     @Ignore("-fx-border-bottom-left-radius not supported")
2537     @Test public void borderStrokeRadius_bottomLeft5() {
2538         region.setStyle(
2539                 "-fx-border-color: black;" +
2540                 "-fx-border-bottom-left-radius: 5% 10px;");
2541         processCSS();
2542 
2543         assertEquals(0, region.getBackground().getFills().size(), 0);
2544         assertEquals(0, region.getBackground().getImages().size(), 0);
2545         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2546         assertEquals(0, region.getBorder().getImages().size(), 0);
2547 
2548         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2549         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2550                 new CornerRadii(
2551                         0, 0, // top left
2552                         0, 0, // top right
2553                         0, 0, // bottom right
2554                         5, 10, // bottom left
2555                         false, false, // top left as percent
2556                         false, false, // top right as percent
2557                         false, false, // bottom right as percent
2558                         true, false), // bottom left as percent
2559                 BorderStroke.DEFAULT_WIDTHS);
2560         assertEquals(expected, stroke);
2561     }
2562 
2563     @Ignore("-fx-border-bottom-left-radius not supported")
2564     @Test public void borderStrokeRadius_bottomLeft6() {
2565         region.setStyle(
2566                 "-fx-border-color: black;" +
2567                 "-fx-border-bottom-left-radius: 5px, 10%;");
2568         processCSS();
2569 
2570         assertEquals(0, region.getBackground().getFills().size(), 0);
2571         assertEquals(0, region.getBackground().getImages().size(), 0);
2572         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2573         assertEquals(0, region.getBorder().getImages().size(), 0);
2574 
2575         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2576         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2577                 new CornerRadii(
2578                         0, 0, // top left
2579                         0, 0, // top right
2580                         0, 0, // bottom right
2581                         5, 10, // bottom left
2582                         false, false, // top left as percent
2583                         false, false, // top right as percent
2584                         false, false, // bottom right as percent
2585                         false, true), // bottom left as percent
2586                 BorderStroke.DEFAULT_WIDTHS);
2587         assertEquals(expected, stroke);
2588     }
2589 
2590     @Ignore("-fx-border-top-left-radius and -fx-border-top-right-radius are not supported")
2591     @Test public void borderStrokeRadius_topLeft_topRight() {
2592         region.setStyle(
2593                 "-fx-border-color: black;" +
2594                 "-fx-border-top-left-radius: 5px 10%;" +
2595                 "-fx-border-top-right-radius: 20px 30%;");
2596                 processCSS();
2597 
2598         assertEquals(0, region.getBackground().getFills().size(), 0);
2599         assertEquals(0, region.getBackground().getImages().size(), 0);
2600         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2601         assertEquals(0, region.getBorder().getImages().size(), 0);
2602 
2603         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2604         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2605                 new CornerRadii(
2606                         5, 10, // top left
2607                         20, 30, // top right
2608                         0, 0, // bottom right
2609                         0, 0, // bottom left
2610                         false, true, // top left as percent
2611                         false, true, // top right as percent
2612                         false, false, // bottom right as percent
2613                         false, false), // bottom left as percent
2614                 BorderStroke.DEFAULT_WIDTHS);
2615         assertEquals(expected, stroke);
2616     }
2617 
2618     @Test public void borderStrokeRadius1() {
2619         region.setStyle(
2620                 "-fx-border-color: black;" +
2621                 "-fx-border-radius: 5px;");
2622         processCSS();
2623 
2624         assertNull(region.getBackground());
2625         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2626         assertEquals(0, region.getBorder().getImages().size(), 0);
2627 
2628         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2629         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2630                 new CornerRadii(5, 5, 5, 5, false),
2631                 BorderStroke.DEFAULT_WIDTHS);
2632         assertEquals(expected, stroke);
2633     }
2634 
2635     @Test public void borderStrokeRadius1_Percent() {
2636         region.setStyle(
2637                 "-fx-border-color: black;" +
2638                 "-fx-border-radius: 5%;");
2639         processCSS();
2640 
2641         assertNull(region.getBackground());
2642         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2643         assertEquals(0, region.getBorder().getImages().size(), 0);
2644 
2645         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2646         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2647                 new CornerRadii(.05, .05, .05, .05, true),
2648                 BorderStroke.DEFAULT_WIDTHS);
2649         assertEquals(expected, stroke);
2650     }
2651 
2652     @Test public void borderStrokeRadius2() {
2653         region.setStyle(
2654                 "-fx-border-color: black;" +
2655                 "-fx-border-radius: 5px 10px;");
2656         processCSS();
2657 
2658         assertNull(region.getBackground());
2659         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2660         assertEquals(0, region.getBorder().getImages().size(), 0);
2661 
2662         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2663         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2664                 new CornerRadii(5, 10, 5, 10, false),
2665                 BorderStroke.DEFAULT_WIDTHS);
2666         assertEquals(expected, stroke);
2667     }
2668 
2669     @Test public void borderStrokeRadius2_Percent() {
2670         region.setStyle(
2671                 "-fx-border-color: black;" +
2672                 "-fx-border-radius: 5% 10%;");
2673         processCSS();
2674 
2675         assertNull(region.getBackground());
2676         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2677         assertEquals(0, region.getBorder().getImages().size(), 0);
2678 
2679         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2680         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2681                 new CornerRadii(.05, .10, .05, .10, true),
2682                 BorderStroke.DEFAULT_WIDTHS);
2683         assertEquals(expected, stroke);
2684     }
2685 
2686     @Test public void borderStrokeRadius3() {
2687         region.setStyle(
2688                 "-fx-border-color: black;" +
2689                 "-fx-border-radius: 5px 10px 15px;");
2690         processCSS();
2691 
2692         assertNull(region.getBackground());
2693         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2694         assertEquals(0, region.getBorder().getImages().size(), 0);
2695 
2696         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2697         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2698                 new CornerRadii(5, 10, 15, 10, false),
2699                 BorderStroke.DEFAULT_WIDTHS);
2700         assertEquals(expected, stroke);
2701     }
2702 
2703     @Test public void borderStrokeRadius3_Percent() {
2704         region.setStyle(
2705                 "-fx-border-color: black;" +
2706                 "-fx-border-radius: 5% 10% 15%;");
2707         processCSS();
2708 
2709         assertNull(region.getBackground());
2710         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2711         assertEquals(0, region.getBorder().getImages().size(), 0);
2712 
2713         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2714         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2715                 new CornerRadii(.05, .10, .15, .10, true),
2716                 BorderStroke.DEFAULT_WIDTHS);
2717         assertEquals(expected, stroke);
2718     }
2719 
2720     @Test public void borderStrokeRadius4() {
2721         region.setStyle(
2722                 "-fx-border-color: black;" +
2723                 "-fx-border-radius: 5px 10px 15px 20px;");
2724         processCSS();
2725 
2726         assertNull(region.getBackground());
2727         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2728         assertEquals(0, region.getBorder().getImages().size(), 0);
2729 
2730         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2731         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2732                 new CornerRadii(5, 10, 15, 20, false),
2733                 BorderStroke.DEFAULT_WIDTHS);
2734         assertEquals(expected, stroke);
2735     }
2736 
2737     @Test public void borderStrokeRadius4_Percent() {
2738         region.setStyle(
2739                 "-fx-border-color: black;" +
2740                 "-fx-border-radius: 5% 10% 15% 20%;");
2741         processCSS();
2742 
2743         assertNull(region.getBackground());
2744         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2745         assertEquals(0, region.getBorder().getImages().size(), 0);
2746 
2747         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2748         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2749                 new CornerRadii(.05, .10, .15, .20, true),
2750                 BorderStroke.DEFAULT_WIDTHS);
2751         assertEquals(expected, stroke);
2752     }
2753 
2754     // TODO Example 22
2755 
2756     // http://www.w3.org/TR/css3-background/#the-border-radius
2757     // Example 23 (except using px here instead of em)
2758     @Test public void testBorderRadiusWithHorizontalAndVerticalRadii() {
2759 
2760         region.setStyle("-fx-border-color: black; -fx-border-radius: 2px 1px 4px / 0.5px 3px;");
2761         processCSS();
2762 
2763         assertNull(region.getBackground());
2764         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2765         assertEquals(0, region.getBorder().getImages().size(), 0);
2766 
2767         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2768         BorderStroke expected = new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID,
2769                 new CornerRadii(2, .5, 3, 1, 4, .5, 3, 1, false, false, false, false, false, false, false, false),
2770                 BorderStroke.DEFAULT_WIDTHS);
2771 
2772         assertEquals(expected, stroke);
2773 
2774     }
2775 
2776 
2777 
2778     @Test public void borderStrokeIsTransparent() {
2779         region.setStyle(
2780                 "-fx-border-style: solid;" +
2781                 "-fx-border-color: transparent;");
2782         processCSS();
2783 
2784         assertNull(region.getBackground());
2785         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2786         assertEquals(0, region.getBorder().getImages().size(), 0);
2787 
2788         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2789         BorderStroke expected = new BorderStroke(Color.TRANSPARENT, BorderStrokeStyle.SOLID, null, null);
2790         assertEquals(expected, stroke);
2791     }
2792 
2793     @Test public void borderStrokeIsSpecifiedOnly() {
2794         region.setStyle(
2795                 "-fx-border-style: solid;" +
2796                 "-fx-border-color: red;");
2797         processCSS();
2798 
2799         assertNull(region.getBackground());
2800         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2801         assertEquals(0, region.getBorder().getImages().size(), 0);
2802 
2803         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2804         BorderStroke expected = new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, null, null);
2805         assertEquals(expected, stroke);
2806     }
2807 
2808     @Test public void borderStroke2IsSpecifiedOnly() {
2809         region.setStyle(
2810                 "-fx-border-style: solid;" +
2811                 "-fx-border-color: red green;");
2812         processCSS();
2813 
2814         assertNull(region.getBackground());
2815         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2816         assertEquals(0, region.getBorder().getImages().size(), 0);
2817 
2818         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2819         BorderStroke expected = new BorderStroke(
2820                 Color.RED, Color.GREEN, Color.RED, Color.GREEN,
2821                 BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID,
2822                 null, null, Insets.EMPTY);
2823         assertEquals(expected, stroke);
2824     }
2825 
2826     @Test public void borderStroke3IsSpecifiedOnly() {
2827         region.setStyle(
2828                 "-fx-border-style: solid;" +
2829                 "-fx-border-color: red green blue;");
2830         processCSS();
2831 
2832         assertNull(region.getBackground());
2833         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2834         assertEquals(0, region.getBorder().getImages().size(), 0);
2835 
2836         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2837         BorderStroke expected = new BorderStroke(
2838                 Color.RED, Color.GREEN, Color.BLUE, Color.GREEN,
2839                 BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID,
2840                 null, null, Insets.EMPTY);
2841         assertEquals(expected, stroke);
2842     }
2843 
2844     @Test public void borderStroke4IsSpecifiedOnly() {
2845         region.setStyle(
2846                 "-fx-border-style: solid;" +
2847                 "-fx-border-color: red green blue yellow;");
2848         processCSS();
2849 
2850         assertNull(region.getBackground());
2851         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2852         assertEquals(0, region.getBorder().getImages().size(), 0);
2853 
2854         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2855         BorderStroke expected = new BorderStroke(
2856                 Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW,
2857                 BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID,
2858                 null, null, Insets.EMPTY);
2859         assertEquals(expected, stroke);
2860     }
2861 
2862     @Ignore ("-fx-border-top-color is not supported by the CSS parser")
2863     @Test public void borderStroke_top_IsSpecifiedOnly() {
2864         region.setStyle(
2865                 "-fx-border-style: solid;" +
2866                 "-fx-border-top-color: purple;");
2867         processCSS();
2868 
2869         assertEquals(0, region.getBackground().getFills().size(), 0);
2870         assertEquals(0, region.getBackground().getImages().size(), 0);
2871         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2872         assertEquals(0, region.getBorder().getImages().size(), 0);
2873 
2874         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2875         BorderStroke expected = new BorderStroke(
2876                 Color.PURPLE, Color.BLACK, Color.BLACK, Color.BLACK,
2877                 BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID,
2878                 null, null, Insets.EMPTY);
2879         assertEquals(expected, stroke);
2880     }
2881 
2882     @Ignore ("-fx-border-right-color is not supported by the CSS parser")
2883     @Test public void borderStroke_right_IsSpecifiedOnly() {
2884         region.setStyle(
2885                 "-fx-border-style: solid;" +
2886                 "-fx-border-right-color: purple;");
2887         processCSS();
2888 
2889         assertEquals(0, region.getBackground().getFills().size(), 0);
2890         assertEquals(0, region.getBackground().getImages().size(), 0);
2891         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2892         assertEquals(0, region.getBorder().getImages().size(), 0);
2893 
2894         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2895         BorderStroke expected = new BorderStroke(
2896                 Color.BLACK, Color.PURPLE, Color.BLACK, Color.BLACK,
2897                 BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID,
2898                 null, null, Insets.EMPTY);
2899         assertEquals(expected, stroke);
2900     }
2901 
2902     @Ignore ("-fx-border-bottom-color is not supported by the CSS parser")
2903     @Test public void borderStroke_bottom_IsSpecifiedOnly() {
2904         region.setStyle(
2905                 "-fx-border-style: solid;" +
2906                 "-fx-border-bottom-color: purple;");
2907         processCSS();
2908 
2909         assertEquals(0, region.getBackground().getFills().size(), 0);
2910         assertEquals(0, region.getBackground().getImages().size(), 0);
2911         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2912         assertEquals(0, region.getBorder().getImages().size(), 0);
2913 
2914         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2915         BorderStroke expected = new BorderStroke(
2916                 Color.BLACK, Color.BLACK, Color.PURPLE, Color.BLACK,
2917                 BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID,
2918                 null, null, Insets.EMPTY);
2919         assertEquals(expected, stroke);
2920     }
2921 
2922     @Ignore ("-fx-border-left-color is not supported by the CSS parser")
2923     @Test public void borderStroke_left_IsSpecifiedOnly() {
2924         region.setStyle(
2925                 "-fx-border-style: solid;" +
2926                 "-fx-border-left-color: purple;");
2927         processCSS();
2928 
2929         assertEquals(0, region.getBackground().getFills().size(), 0);
2930         assertEquals(0, region.getBackground().getImages().size(), 0);
2931         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2932         assertEquals(0, region.getBorder().getImages().size(), 0);
2933 
2934         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2935         BorderStroke expected = new BorderStroke(
2936                 Color.BLACK, Color.BLACK, Color.BLACK, Color.PURPLE,
2937                 BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID,
2938                 null, null, Insets.EMPTY);
2939         assertEquals(expected, stroke);
2940     }
2941 
2942     @Ignore ("-fx-border-top-color and -fx-border-right-color is not supported by the CSS parser")
2943     @Test public void borderStroke_top_right_IsSpecifiedOnly() {
2944         region.setStyle(
2945                 "-fx-border-style: solid;" +
2946                 "-fx-border-top-color: red;" +
2947                 "-fx-border-right-color: green;");
2948         processCSS();
2949 
2950         assertEquals(0, region.getBackground().getFills().size(), 0);
2951         assertEquals(0, region.getBackground().getImages().size(), 0);
2952         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2953         assertEquals(0, region.getBorder().getImages().size(), 0);
2954 
2955         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2956         BorderStroke expected = new BorderStroke(
2957                 Color.RED, Color.GREEN, Color.BLACK, Color.BLACK,
2958                 BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID,
2959                 null, null, Insets.EMPTY);
2960         assertEquals(expected, stroke);
2961     }
2962 
2963     @Ignore ("-fx-border-left-color and -fx-border-right-color is not supported by the CSS parser")
2964     @Test public void borderStroke_right_left_IsSpecifiedOnly() {
2965         region.setStyle(
2966                 "-fx-border-style: solid;" +
2967                 "-fx-border-right-color: red;" +
2968                 "-fx-border-left-color: green;");
2969         processCSS();
2970 
2971         assertEquals(0, region.getBackground().getFills().size(), 0);
2972         assertEquals(0, region.getBackground().getImages().size(), 0);
2973         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2974         assertEquals(0, region.getBorder().getImages().size(), 0);
2975 
2976         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2977         BorderStroke expected = new BorderStroke(
2978                 Color.BLACK, Color.RED, Color.BLACK, Color.GREEN,
2979                 BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID,
2980                 null, null, Insets.EMPTY);
2981         assertEquals(expected, stroke);
2982     }
2983 
2984     @Ignore ("-fx-border-top-color and -fx-border-bottom-color is not supported by the CSS parser")
2985     @Test public void borderStroke_bottom_top_IsSpecifiedOnly() {
2986         region.setStyle(
2987                 "-fx-border-style: solid;" +
2988                 "-fx-border-bottom-color: red;" +
2989                 "-fx-border-top-color: green;");
2990         processCSS();
2991 
2992         assertEquals(0, region.getBackground().getFills().size(), 0);
2993         assertEquals(0, region.getBackground().getImages().size(), 0);
2994         assertEquals(1, region.getBorder().getStrokes().size(), 0);
2995         assertEquals(0, region.getBorder().getImages().size(), 0);
2996 
2997         BorderStroke stroke = region.getBorder().getStrokes().get(0);
2998         BorderStroke expected = new BorderStroke(
2999                 Color.GREEN, Color.BLACK, Color.RED, Color.BLACK,
3000                 BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID,
3001                 null, null, Insets.EMPTY);
3002         assertEquals(expected, stroke);
3003     }
3004 
3005     @Test public void borderRadiusIsSpecifiedOnly() {
3006         region.setStyle("-fx-border-radius: 1px;");
3007         processCSS();
3008 
3009         assertNull(region.getBackground());
3010         assertNull(region.getBorder());
3011     }
3012 
3013     @Test public void borderWidthIsSpecifiedOnly() {
3014         region.setStyle("-fx-border-width: 1;");
3015         processCSS();
3016 
3017         assertNull(region.getBackground());
3018         assertNull(region.getBorder());
3019     }
3020 
3021     @Test public void testWithExcessBorderWidths() {
3022         region.setStyle(
3023                 "-fx-border-style: solid;" +
3024                 "-fx-border-color: red;" +
3025                 "-fx-border-width: 0 0 0 0, 0, 1, 2;");
3026         processCSS();
3027 
3028         assertNull(region.getBackground());
3029         assertEquals(1, region.getBorder().getStrokes().size(), 0);
3030         assertEquals(0, region.getBorder().getImages().size(), 0);
3031 
3032         BorderStroke stroke = region.getBorder().getStrokes().get(0);
3033         BorderStroke expected = new BorderStroke(
3034                 Color.RED, Color.RED, Color.RED, Color.RED,
3035                 BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID,
3036                 null, new BorderWidths(0, 0, 0, 0), Insets.EMPTY);
3037         assertEquals(expected, stroke);
3038     }
3039 
3040     @Test public void testWithExcessBorderRadii() {
3041         region.setStyle(
3042                 "-fx-border-style: solid;" +
3043                 "-fx-border-color: red;" +
3044                 "-fx-border-radius: 5%, 0, 10%, 2;");
3045         processCSS();
3046 
3047         assertNull(region.getBackground());
3048         assertEquals(1, region.getBorder().getStrokes().size(), 0);
3049         assertEquals(0, region.getBorder().getImages().size(), 0);
3050 
3051         BorderStroke stroke = region.getBorder().getStrokes().get(0);
3052         BorderStroke expected = new BorderStroke(
3053                 Color.RED, Color.RED, Color.RED, Color.RED,
3054                 BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID, BorderStrokeStyle.SOLID,
3055                 new CornerRadii(.05, .05, .05, .05, true),
3056                 null, Insets.EMPTY);
3057         assertEquals(expected, stroke);
3058     }
3059     
3060     // Finally, the image borders!!
3061     // I probably have to rework things. The image border do depend on some settings from
3062     // the stroke borders (or at least, they can depend on them). As such I might not be
3063     // able to short-circuit the creation of stroke borders, even if they have no style.
3064 
3065     @Test public void borderImageSourceIsNull() {
3066         region.setStyle("-fx-border-image-source: null;");
3067         processCSS();
3068 
3069         assertEquals(new Insets(0), region.getPadding());
3070         assertNull(region.getBackground());
3071         assertNull(region.getBorder());
3072     }
3073 
3074     @Test public void borderImageSource() {
3075         region.setStyle("-fx-border-image-source: url('javafx/scene/layout/center-btn.png')");
3076         processCSS();
3077 
3078         assertNull(region.getBackground());
3079         assertEquals(0, region.getBorder().getStrokes().size(), 0);
3080         assertEquals(1, region.getBorder().getImages().size(), 0);
3081     }
3082 
3083     @Test public void defaultBorderImageValues() {
3084         region.setStyle("-fx-border-image-source: url('javafx/scene/layout/center-btn.png')");
3085         processCSS();
3086 
3087         BorderImage image = region.getBorder().getImages().get(0);
3088         BorderImage expected = new BorderImage(
3089                 image.getImage(),
3090                 BorderWidths.DEFAULT,
3091                 Insets.EMPTY,
3092                 BorderWidths.FULL,
3093                 false,
3094                 BorderRepeat.STRETCH,
3095                 BorderRepeat.STRETCH
3096         );
3097         assertEquals(expected, image);
3098     }
3099 
3100     @Test public void borderImageSlice_1() {
3101         region.setStyle(
3102                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3103                 "-fx-border-image-slice: 1;");
3104         processCSS();
3105 
3106         BorderImage image = region.getBorder().getImages().get(0);
3107         BorderImage expected = new BorderImage(
3108                 image.getImage(),
3109                 BorderWidths.DEFAULT,
3110                 Insets.EMPTY,
3111                 new BorderWidths(1, 1, 1, 1, false, false, false, false),
3112                 false,
3113                 BorderRepeat.STRETCH,
3114                 BorderRepeat.STRETCH
3115         );
3116         assertEquals(expected, image);
3117     }
3118 
3119     @Test public void borderImageSlice_1_2() {
3120         region.setStyle(
3121                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3122                 "-fx-border-image-slice: 1 2;");
3123         processCSS();
3124 
3125         BorderImage image = region.getBorder().getImages().get(0);
3126         BorderImage expected = new BorderImage(
3127                 image.getImage(),
3128                 BorderWidths.DEFAULT,
3129                 Insets.EMPTY,
3130                 new BorderWidths(1, 2, 1, 2, false, false, false, false),
3131                 false,
3132                 BorderRepeat.STRETCH,
3133                 BorderRepeat.STRETCH
3134         );
3135         assertEquals(expected, image);
3136     }
3137 
3138     @Test public void borderImageSlice_1_2_3() {
3139         region.setStyle(
3140                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3141                 "-fx-border-image-slice: 1 2 3;");
3142         processCSS();
3143 
3144         BorderImage image = region.getBorder().getImages().get(0);
3145         BorderImage expected = new BorderImage(
3146                 image.getImage(),
3147                 BorderWidths.DEFAULT,
3148                 Insets.EMPTY,
3149                 new BorderWidths(1, 2, 3, 2, false, false, false, false),
3150                 false,
3151                 BorderRepeat.STRETCH,
3152                 BorderRepeat.STRETCH
3153         );
3154         assertEquals(expected, image);
3155     }
3156 
3157     @Test public void borderImageSlice_1_2_3_4() {
3158         region.setStyle(
3159                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3160                 "-fx-border-image-slice: 1 2 3 4;");
3161         processCSS();
3162 
3163         BorderImage image = region.getBorder().getImages().get(0);
3164         BorderImage expected = new BorderImage(
3165                 image.getImage(),
3166                 BorderWidths.DEFAULT,
3167                 Insets.EMPTY,
3168                 new BorderWidths(1, 2, 3, 4, false, false, false, false),
3169                 false,
3170                 BorderRepeat.STRETCH,
3171                 BorderRepeat.STRETCH
3172         );
3173         assertEquals(expected, image);
3174     }
3175 
3176     @Test public void borderImageSlice_1_fill() {
3177         region.setStyle(
3178                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3179                 "-fx-border-image-slice: 1 fill;");
3180         processCSS();
3181 
3182         BorderImage image = region.getBorder().getImages().get(0);
3183         BorderImage expected = new BorderImage(
3184                 image.getImage(),
3185                 BorderWidths.DEFAULT,
3186                 Insets.EMPTY,
3187                 new BorderWidths(1, 1, 1, 1),
3188                 true,
3189                 BorderRepeat.STRETCH,
3190                 BorderRepeat.STRETCH
3191         );
3192         assertEquals(expected, image);
3193     }
3194 
3195     @Test public void borderImageSlice_1_2_fill() {
3196         region.setStyle(
3197                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3198                 "-fx-border-image-slice: 1 2 fill;");
3199         processCSS();
3200 
3201         BorderImage image = region.getBorder().getImages().get(0);
3202         BorderImage expected = new BorderImage(
3203                 image.getImage(),
3204                 BorderWidths.DEFAULT,
3205                 Insets.EMPTY,
3206                 new BorderWidths(1, 2, 1, 2),
3207                 true,
3208                 BorderRepeat.STRETCH,
3209                 BorderRepeat.STRETCH
3210         );
3211         assertEquals(expected, image);
3212     }
3213 
3214     @Test public void borderImageSlice_1_2_3_fill() {
3215         region.setStyle(
3216                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3217                 "-fx-border-image-slice: 1 2 3 fill;");
3218         processCSS();
3219 
3220         BorderImage image = region.getBorder().getImages().get(0);
3221         BorderImage expected = new BorderImage(
3222                 image.getImage(),
3223                 BorderWidths.DEFAULT,
3224                 Insets.EMPTY,
3225                 new BorderWidths(1, 2, 3, 2),
3226                 true,
3227                 BorderRepeat.STRETCH,
3228                 BorderRepeat.STRETCH
3229         );
3230         assertEquals(expected, image);
3231     }
3232 
3233     @Test public void borderImageSlice_1_2_3_4_fill() {
3234         region.setStyle(
3235                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3236                 "-fx-border-image-slice: 1 2 3 4 fill;");
3237         processCSS();
3238 
3239         BorderImage image = region.getBorder().getImages().get(0);
3240         BorderImage expected = new BorderImage(
3241                 image.getImage(),
3242                 BorderWidths.DEFAULT,
3243                 Insets.EMPTY,
3244                 new BorderWidths(1, 2, 3, 4),
3245                 true,
3246                 BorderRepeat.STRETCH,
3247                 BorderRepeat.STRETCH
3248         );
3249         assertEquals(expected, image);
3250     }
3251 
3252     @Test public void borderImageWidth_1() {
3253         region.setStyle(
3254                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3255                 "-fx-border-image-width: 1;");
3256         processCSS();
3257 
3258         BorderImage image = region.getBorder().getImages().get(0);
3259         BorderImage expected = new BorderImage(
3260                 image.getImage(),
3261                 new BorderWidths(1, 1, 1, 1, false, false, false, false),
3262                 Insets.EMPTY,
3263                 BorderWidths.FULL,
3264                 false,
3265                 BorderRepeat.STRETCH,
3266                 BorderRepeat.STRETCH
3267         );
3268         assertEquals(expected, image);
3269     }
3270 
3271     @Test public void borderImageWidth_1_2() {
3272         region.setStyle(
3273                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3274                 "-fx-border-image-width: 1 2;");
3275         processCSS();
3276 
3277         BorderImage image = region.getBorder().getImages().get(0);
3278         BorderImage expected = new BorderImage(
3279                 image.getImage(),
3280                 new BorderWidths(1, 2, 1, 2, false, false, false, false),
3281                 Insets.EMPTY,
3282                 BorderWidths.FULL,
3283                 false,
3284                 BorderRepeat.STRETCH,
3285                 BorderRepeat.STRETCH
3286         );
3287         assertEquals(expected, image);
3288     }
3289 
3290     @Test public void borderImageWidth_1_2_3() {
3291         region.setStyle(
3292                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3293                 "-fx-border-image-width: 1 2 3;");
3294         processCSS();
3295 
3296         BorderImage image = region.getBorder().getImages().get(0);
3297         BorderImage expected = new BorderImage(
3298                 image.getImage(),
3299                 new BorderWidths(1, 2, 3, 2, false, false, false, false),
3300                 Insets.EMPTY,
3301                 BorderWidths.FULL,
3302                 false,
3303                 BorderRepeat.STRETCH,
3304                 BorderRepeat.STRETCH
3305         );
3306         assertEquals(expected, image);
3307     }
3308 
3309     @Test public void borderImageWidth_1_2_3_4() {
3310         region.setStyle(
3311                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3312                 "-fx-border-image-width: 1 2 3 4;");
3313         processCSS();
3314 
3315         BorderImage image = region.getBorder().getImages().get(0);
3316         BorderImage expected = new BorderImage(
3317                 image.getImage(),
3318                 new BorderWidths(1, 2, 3, 4, false, false, false, false),
3319                 Insets.EMPTY,
3320                 BorderWidths.FULL,
3321                 false,
3322                 BorderRepeat.STRETCH,
3323                 BorderRepeat.STRETCH
3324         );
3325         assertEquals(expected, image);
3326     }
3327 
3328     @Test public void borderImageWidth_1_2Percent() {
3329         region.setStyle(
3330                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3331                 "-fx-border-image-width: 1 2%;");
3332         processCSS();
3333 
3334         BorderImage image = region.getBorder().getImages().get(0);
3335         BorderImage expected = new BorderImage(
3336                 image.getImage(),
3337                 new BorderWidths(1, .02, 1, .02, false, true, false, true),
3338                 Insets.EMPTY,
3339                 BorderWidths.FULL,
3340                 false,
3341                 BorderRepeat.STRETCH,
3342                 BorderRepeat.STRETCH
3343         );
3344         assertEquals(expected, image);
3345     }
3346 
3347     @Test public void borderImageWidth_1Percent_2Percent_3Percent_4Percent() {
3348         region.setStyle(
3349                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3350                 "-fx-border-image-width: 1% 2% 3% 4%;");
3351         processCSS();
3352 
3353         BorderImage image = region.getBorder().getImages().get(0);
3354         BorderImage expected = new BorderImage(
3355                 image.getImage(),
3356                 new BorderWidths(.01, .02, .03, .04, true, true, true, true),
3357                 Insets.EMPTY,
3358                 BorderWidths.FULL,
3359                 false,
3360                 BorderRepeat.STRETCH,
3361                 BorderRepeat.STRETCH
3362         );
3363         assertEquals(expected, image);
3364     }
3365 
3366     @Ignore("I am not certain that supporting auto makes sense for us, and if it does, is it anything other than 1?")
3367     @Test public void borderImageWidth_auto() {
3368         region.setStyle(
3369                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3370                 "-fx-border-image-width: auto;");
3371         processCSS();
3372 
3373         BorderImage image = region.getBorder().getImages().get(0);
3374         BorderImage expected = new BorderImage(
3375                 image.getImage(),
3376                 new BorderWidths(
3377                         BorderWidths.AUTO, BorderWidths.AUTO,
3378                         BorderWidths.AUTO, BorderWidths.AUTO, false, false, false, false),
3379                 Insets.EMPTY,
3380                 BorderWidths.FULL,
3381                 false,
3382                 BorderRepeat.STRETCH,
3383                 BorderRepeat.STRETCH
3384         );
3385         assertEquals(expected, image);
3386     }
3387 
3388     @Ignore("I am not certain that supporting auto makes sense for us, and if it does, is it anything other than 1?")
3389     @Test public void borderImageWidth_1_auto() {
3390         region.setStyle(
3391                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3392                 "-fx-border-image-width: 1 auto;");
3393         processCSS();
3394 
3395         BorderImage image = region.getBorder().getImages().get(0);
3396         BorderImage expected = new BorderImage(
3397                 image.getImage(),
3398                 new BorderWidths(1, BorderWidths.AUTO,
3399                         1, BorderWidths.AUTO, false, false, false, false),
3400                 Insets.EMPTY,
3401                 BorderWidths.FULL,
3402                 false,
3403                 BorderRepeat.STRETCH,
3404                 BorderRepeat.STRETCH
3405         );
3406         assertEquals(expected, image);
3407     }
3408 
3409     @Ignore("I am not certain that supporting auto makes sense for us, and if it does, is it anything other than 1?")
3410     @Test public void borderImageWidth_1_2Percent_auto() {
3411         region.setStyle(
3412                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3413                 "-fx-border-image-width: 1 2% auto;");
3414         processCSS();
3415 
3416         BorderImage image = region.getBorder().getImages().get(0);
3417         BorderImage expected = new BorderImage(
3418                 image.getImage(),
3419                 new BorderWidths(1, .02,
3420                         BorderWidths.AUTO, .02, false, true, false, true),
3421                 Insets.EMPTY,
3422                 BorderWidths.FULL,
3423                 false,
3424                 BorderRepeat.STRETCH,
3425                 BorderRepeat.STRETCH
3426         );
3427         assertEquals(expected, image);
3428     }
3429 
3430     @Test public void borderImageOutset_1() {
3431         region.setStyle(
3432                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3433                 "-fx-border-image-insets: 1;");
3434         processCSS();
3435 
3436         BorderImage image = region.getBorder().getImages().get(0);
3437         BorderImage expected = new BorderImage(
3438                 image.getImage(),
3439                 BorderWidths.DEFAULT,
3440                 new Insets(1),
3441                 BorderWidths.FULL,
3442                 false,
3443                 BorderRepeat.STRETCH,
3444                 BorderRepeat.STRETCH
3445         );
3446         assertEquals(expected, image);
3447     }
3448 
3449     @Test public void borderImageOutset_1_2() {
3450         region.setStyle(
3451                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3452                 "-fx-border-image-insets: 1 2;");
3453         processCSS();
3454 
3455         BorderImage image = region.getBorder().getImages().get(0);
3456         BorderImage expected = new BorderImage(
3457                 image.getImage(),
3458                 BorderWidths.DEFAULT,
3459                 new Insets(1, 2, 1, 2),
3460                 BorderWidths.FULL,
3461                 false,
3462                 BorderRepeat.STRETCH,
3463                 BorderRepeat.STRETCH
3464         );
3465         assertEquals(expected, image);
3466     }
3467 
3468     @Test public void borderImageOutset_1_2_3() {
3469         region.setStyle(
3470                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3471                 "-fx-border-image-insets: 1 2 3;");
3472         processCSS();
3473 
3474         BorderImage image = region.getBorder().getImages().get(0);
3475         BorderImage expected = new BorderImage(
3476                 image.getImage(),
3477                 BorderWidths.DEFAULT,
3478                 new Insets(1, 2, 3, 2),
3479                 BorderWidths.FULL,
3480                 false,
3481                 BorderRepeat.STRETCH,
3482                 BorderRepeat.STRETCH
3483         );
3484         assertEquals(expected, image);
3485     }
3486 
3487     @Test public void borderImageOutset_1_2_3_4() {
3488         region.setStyle(
3489                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3490                 "-fx-border-image-insets: 1 2 3 4;");
3491         processCSS();
3492 
3493         BorderImage image = region.getBorder().getImages().get(0);
3494         BorderImage expected = new BorderImage(
3495                 image.getImage(),
3496                 BorderWidths.DEFAULT,
3497                 new Insets(1, 2, 3, 4),
3498                 BorderWidths.FULL,
3499                 false,
3500                 BorderRepeat.STRETCH,
3501                 BorderRepeat.STRETCH
3502         );
3503         assertEquals(expected, image);
3504     }
3505 
3506     @Test public void borderImageRepeat_stretch() {
3507         region.setStyle(
3508                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3509                 "-fx-border-image-repeat: stretch;");
3510         processCSS();
3511 
3512         BorderImage image = region.getBorder().getImages().get(0);
3513         BorderImage expected = new BorderImage(
3514                 image.getImage(),
3515                 BorderWidths.DEFAULT,
3516                 Insets.EMPTY,
3517                 BorderWidths.FULL,
3518                 false,
3519                 BorderRepeat.STRETCH,
3520                 BorderRepeat.STRETCH
3521         );
3522         assertEquals(expected, image);
3523     }
3524 
3525     @Test public void borderImageRepeat_repeat() {
3526         region.setStyle(
3527                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3528                 "-fx-border-image-repeat: repeat;");
3529         processCSS();
3530 
3531         BorderImage image = region.getBorder().getImages().get(0);
3532         BorderImage expected = new BorderImage(
3533                 image.getImage(),
3534                 BorderWidths.DEFAULT,
3535                 Insets.EMPTY,
3536                 BorderWidths.FULL,
3537                 false,
3538                 BorderRepeat.REPEAT,
3539                 BorderRepeat.REPEAT
3540         );
3541         assertEquals(expected, image);
3542     }
3543 
3544     @Test public void borderImageRepeat_round() {
3545         region.setStyle(
3546                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3547                 "-fx-border-image-repeat: round;");
3548         processCSS();
3549 
3550         BorderImage image = region.getBorder().getImages().get(0);
3551         BorderImage expected = new BorderImage(
3552                 image.getImage(),
3553                 BorderWidths.DEFAULT,
3554                 Insets.EMPTY,
3555                 BorderWidths.FULL,
3556                 false,
3557                 BorderRepeat.ROUND,
3558                 BorderRepeat.ROUND
3559         );
3560         assertEquals(expected, image);
3561     }
3562 
3563     @Test public void borderImageRepeat_space() {
3564         region.setStyle(
3565                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3566                 "-fx-border-image-repeat: space;");
3567         processCSS();
3568 
3569         BorderImage image = region.getBorder().getImages().get(0);
3570         BorderImage expected = new BorderImage(
3571                 image.getImage(),
3572                 BorderWidths.DEFAULT,
3573                 Insets.EMPTY,
3574                 BorderWidths.FULL,
3575                 false,
3576                 BorderRepeat.SPACE,
3577                 BorderRepeat.SPACE
3578         );
3579         assertEquals(expected, image);
3580     }
3581 
3582     @Test public void borderImageRepeat_round_stretch() {
3583         region.setStyle(
3584                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3585                 "-fx-border-image-repeat: round stretch;");
3586         processCSS();
3587 
3588         BorderImage image = region.getBorder().getImages().get(0);
3589         BorderImage expected = new BorderImage(
3590                 image.getImage(),
3591                 BorderWidths.DEFAULT,
3592                 Insets.EMPTY,
3593                 BorderWidths.FULL,
3594                 false,
3595                 BorderRepeat.ROUND,
3596                 BorderRepeat.STRETCH
3597         );
3598         assertEquals(expected, image);
3599     }
3600 
3601     @Test public void borderImageRepeat_round_repeat() {
3602         region.setStyle(
3603                 "-fx-border-image-source: url('javafx/scene/layout/center-btn.png');" +
3604                 "-fx-border-image-repeat: round repeat;");
3605         processCSS();
3606 
3607         BorderImage image = region.getBorder().getImages().get(0);
3608         BorderImage expected = new BorderImage(
3609                 image.getImage(),
3610                 BorderWidths.DEFAULT,
3611                 Insets.EMPTY,
3612                 BorderWidths.FULL,
3613                 false,
3614                 BorderRepeat.ROUND,
3615                 BorderRepeat.REPEAT
3616         );
3617         assertEquals(expected, image);
3618     }
3619 
3620     // TODO multiple image borders
3621     // TODO complex background fill, background image, stroke border, image border scenario
3622 }