1 /*
   2  * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package test.javafx.scene.layout;
  27 
  28 import test.javafx.scene.layout.MockBiased;
  29 import test.javafx.scene.layout.MockRegion;
  30 import javafx.geometry.HPos;
  31 import javafx.geometry.Insets;
  32 import javafx.geometry.Orientation;
  33 import javafx.geometry.VPos;
  34 import javafx.scene.image.Image;
  35 import test.javafx.scene.image.ImageForTesting;
  36 import javafx.scene.image.WritableImage;
  37 import javafx.scene.paint.Color;
  38 import javafx.scene.shape.ClosePath;
  39 import javafx.scene.shape.LineTo;
  40 import javafx.scene.shape.MoveTo;
  41 import javafx.scene.shape.Path;
  42 import java.util.concurrent.atomic.AtomicBoolean;
  43 import com.sun.javafx.scene.DirtyBits;
  44 import com.sun.javafx.sg.prism.NGRegion;
  45 import javafx.scene.NodeShim;
  46 import javafx.scene.layout.Background;
  47 import javafx.scene.layout.BackgroundFill;
  48 import javafx.scene.layout.BackgroundImage;
  49 import javafx.scene.layout.Border;
  50 import javafx.scene.layout.BorderImage;
  51 import javafx.scene.layout.BorderStroke;
  52 import javafx.scene.layout.BorderStrokeStyle;
  53 import javafx.scene.layout.BorderWidths;
  54 import javafx.scene.layout.Pane;
  55 import javafx.scene.layout.Region;
  56 import javafx.scene.layout.RegionShim;
  57 import org.junit.Test;
  58 import static org.junit.Assert.assertEquals;
  59 import static org.junit.Assert.assertFalse;
  60 import static org.junit.Assert.assertTrue;
  61 import static org.junit.Assert.fail;
  62 
  63 /**
  64  *
  65  */
  66 public class RegionTest {
  67 
  68     @Test public void testPaddingEmptyByDefault() {
  69         Region region = new Region();
  70 
  71         assertEquals(Insets.EMPTY, region.getPadding());
  72     }
  73 
  74     @Test public void testPaddingCannotBeSetToNull() {
  75         Region region = new Region();
  76 
  77         try {
  78             region.setPadding(null);
  79             fail("NullPointerException expected if padding set to null.");
  80         } catch (Exception e) {
  81             // expected
  82         }
  83 
  84         try {
  85             region.paddingProperty().set(null);
  86             fail("NullPointerException expected if padding set to null.");
  87         } catch (Exception e) {
  88             // expected
  89         }
  90     }
  91 
  92     @Test public void testInsetsEqualsPaddingByDefault() {
  93         Region region = new Region();
  94 
  95         assertEquals(region.getInsets(), region.getPadding());
  96     }
  97 
  98     @Test public void testBoundedSizeReturnsPrefWhenPrefBetweenMinAndMax() {
  99         assertEquals(200, RegionShim.boundedSize(100, 200, 300), 0);
 100     }
 101 
 102     @Test public void testBoundedSizeReturnsMinWhenMinGreaterThanPrefButLessThanMax() {
 103         assertEquals(200, RegionShim.boundedSize(200, 100, 300), 0);
 104     }
 105 
 106     @Test public void testBoundedSizeReturnsMinWhenMinGreaterThanPrefAndMax() {
 107         assertEquals(300, RegionShim.boundedSize(300, 100, 200), 0);
 108     }
 109 
 110     @Test public void testBoundedSizeReturnsMaxWhenMaxLessThanPrefButGreaterThanMin() {
 111         assertEquals(200, RegionShim.boundedSize(100, 300, 200), 0);
 112     }
 113 
 114     @Test public void testBoundedSizeReturnsMinWhenMaxLessThanPrefAndMin() {
 115         assertEquals(200, RegionShim.boundedSize(200, 300, 100), 0);
 116     }
 117 
 118     @Test public void testBoundedSizeReturnsMinWhenMaxLessThanPrefAndMinAndPrefLessThanMin() {
 119         assertEquals(300, RegionShim.boundedSize(300, 200, 100), 0);
 120     }
 121 
 122     @Test public void testMinWidthOverride() {
 123         Region region = new MockRegion(10,20, 100,200, 500,600);
 124         assertEquals(10, region.minWidth(-1), 1e-100);
 125         region.setMinWidth(25.0);
 126         assertEquals(25, region.getMinWidth(), 1e-100);
 127         assertEquals(25, region.minWidth(-1), 1e-100);
 128     }
 129 
 130     @Test public void testMinWidthOverrideThenRestoreComputedSize() {
 131         Region region = new MockRegion(10,20, 100,200, 500,600);
 132         region.setMinWidth(75.0);
 133         region.setMinWidth(Region.USE_COMPUTED_SIZE); // reset
 134         assertEquals(Region.USE_COMPUTED_SIZE, region.getMinWidth(), 1e-100);
 135         assertEquals(10, region.minWidth(-1), 1e-100);
 136     }
 137 
 138     @Test public void testMinWidthNaNTreatedAsZero() {
 139         Region region = new Region();
 140         region.setMinWidth(Double.NaN);
 141         assertEquals(0, region.minWidth(-1), 0);
 142         assertEquals(0, region.minWidth(5), 0);
 143     }
 144 
 145     @Test public void testMinWidthNegativeTreatedAsZero() {
 146         Region region = new Region();
 147         region.setMinWidth(-10);
 148         assertEquals(0, region.minWidth(-1), 0);
 149         assertEquals(0, region.minWidth(5), 0);
 150     }
 151 
 152     @Test public void testMinHeightOverride() {
 153         Region region = new MockRegion(10,20, 100,200, 500,600);
 154         assertEquals(20, region.minHeight(-1), 1e-100);
 155         region.setMinHeight(30.0);
 156         assertEquals(30, region.getMinHeight(), 1e-100);
 157         assertEquals(30, region.minHeight(-1), 1e-100);
 158     }
 159 
 160     @Test public void testMinHeightOverrideThenRestoreComputedSize() {
 161         Region region = new MockRegion(10,20, 100,200, 500,600);
 162         region.setMinHeight(75.0);
 163         region.setMinHeight(Region.USE_COMPUTED_SIZE); // reset
 164         assertEquals(Region.USE_COMPUTED_SIZE, region.getMinHeight(), 1e-100);
 165         assertEquals(20, region.minHeight(-1), 1e-100);
 166     }
 167 
 168     @Test public void testMinHeightNaNTreatedAsZero() {
 169         Region region = new Region();
 170         region.setMinHeight(Double.NaN);
 171         assertEquals(0, region.minHeight(-1), 0);
 172         assertEquals(0, region.minHeight(5), 0);
 173     }
 174 
 175     @Test public void testMinHeightNegativeTreatedAsZero() {
 176         Region region = new Region();
 177         region.setMinHeight(-10);
 178         assertEquals(0, region.minHeight(-1), 0);
 179         assertEquals(0, region.minHeight(5), 0);
 180     }
 181 
 182     @Test public void testMinWidthOverrideSetToPref() {
 183         Region region = new MockRegion(10,20, 100,200, 500,600);
 184         assertEquals(10, region.minWidth(-1), 1e-100);
 185         region.setMinWidth(Region.USE_PREF_SIZE);
 186         assertEquals(Region.USE_PREF_SIZE, region.getMinWidth(), 1e-100);
 187         assertEquals(100, region.minWidth(-1), 1e-100);
 188     }
 189 
 190     @Test public void testMinHeightOverrideSetToPref() {
 191         Region region = new MockRegion(10,20, 100,200, 500,600);
 192         assertEquals(20, region.minHeight(-1), 1e-100);
 193         region.setMinHeight(Region.USE_PREF_SIZE);
 194         assertEquals(Region.USE_PREF_SIZE, region.getMinHeight(), 1e-100);
 195         assertEquals(200, region.minHeight(-1), 1e-100);
 196     }
 197 
 198     @Test public void testPrefWidthOverride() {
 199         Region region = new MockRegion(10,20, 100,200, 500,600);
 200         assertEquals(100, region.prefWidth(-1), 1e-100);
 201         region.setPrefWidth(150.0);
 202         assertEquals(150, region.getPrefWidth(), 1e-100);
 203         assertEquals(150, region.prefWidth(-1), 1e-100);
 204     }
 205 
 206     @Test public void testPrefWidthOverrideThenRestoreComputedSize() {
 207         Region region = new MockRegion(10,20, 100,200, 500,600);
 208         region.setPrefWidth(150.0);
 209         region.setPrefWidth(Region.USE_COMPUTED_SIZE); // reset
 210         assertEquals(Region.USE_COMPUTED_SIZE, region.getPrefWidth(), 1e-100);
 211         assertEquals(100, region.prefWidth(-1), 1e-100);
 212     }
 213 
 214     @Test public void testPrefWidthNaNTreatedAsZero() {
 215         Region region = new Region();
 216         region.setPrefWidth(Double.NaN);
 217         assertEquals(0, region.prefWidth(-1), 0);
 218         assertEquals(0, region.prefWidth(5), 0);
 219     }
 220 
 221     @Test public void testPrefWidthNegativeTreatedAsZero() {
 222         Region region = new Region();
 223         region.setPrefWidth(-10);
 224         assertEquals(0, region.prefWidth(-1), 0);
 225         assertEquals(0, region.prefWidth(5), 0);
 226     }
 227 
 228     @Test public void testPrefHeightOverride() {
 229         Region region = new MockRegion(10,20, 100,200, 500,600);
 230         assertEquals(200, region.prefHeight(-1), 1e-100);
 231         region.setPrefHeight(300.0);
 232         assertEquals(300, region.getPrefHeight(), 1e-100);
 233         assertEquals(300, region.prefHeight(-1), 1e-100);
 234     }
 235 
 236     @Test public void testPrefHeightOverrideThenRestoreComputedSize() {
 237         Region region = new MockRegion(10,20, 100,200, 500,600);
 238         region.setPrefHeight(250);
 239         region.setPrefHeight(Region.USE_COMPUTED_SIZE); // reset
 240         assertEquals(Region.USE_COMPUTED_SIZE, region.getPrefHeight(), 1e-100);
 241         assertEquals(200, region.prefHeight(-1), 1e-100);
 242     }
 243 
 244     @Test public void testPrefHeightNaNTreatedAsZero() {
 245         Region region = new Region();
 246         region.setPrefHeight(Double.NaN);
 247         assertEquals(0, region.prefHeight(-1), 0);
 248         assertEquals(0, region.prefHeight(5), 0);
 249     }
 250 
 251     @Test public void testPrefHeightNegativeTreatedAsZero() {
 252         Region region = new Region();
 253         region.setPrefHeight(-10);
 254         assertEquals(0, region.prefHeight(-1), 0);
 255         assertEquals(0, region.prefHeight(5), 0);
 256     }
 257 
 258     @Test public void testMaxWidthOverride() {
 259         Region region = new MockRegion(10,20, 100,200, 500,600);
 260         assertEquals(500, region.maxWidth(-1), 1e-100);
 261         region.setMaxWidth(550);
 262         assertEquals(550, region.getMaxWidth(), 1e-100);
 263         assertEquals(550, region.maxWidth(-1), 1e-100);
 264     }
 265 
 266     @Test public void testMaxWidthOverrideThenRestoreComputedSize() {
 267         Region region = new MockRegion(10,20, 100,200, 500,600);
 268         region.setMaxWidth(1000);
 269         region.setMaxWidth(Region.USE_COMPUTED_SIZE); // reset
 270         assertEquals(Region.USE_COMPUTED_SIZE, region.getMaxWidth(), 1e-100);
 271         assertEquals(500, region.maxWidth(-1), 1e-100);
 272     }
 273 
 274     @Test public void testMaxWidthNaNTreatedAsZero() {
 275         Region region = new Region();
 276         region.setMaxWidth(Double.NaN);
 277         assertEquals(0, region.maxWidth(-1), 0);
 278         assertEquals(0, region.maxWidth(5), 0);
 279     }
 280 
 281     @Test public void testMaxWidthNegativeTreatedAsZero() {
 282         Region region = new Region();
 283         region.setMaxWidth(-10);
 284         assertEquals(0, region.maxWidth(-1), 0);
 285         assertEquals(0, region.maxWidth(5), 0);
 286     }
 287 
 288     @Test public void testMaxHeightOverride() {
 289         Region region = new MockRegion(10,20, 100,200, 500,600);
 290         assertEquals(600, region.maxHeight(-1), 1e-100);
 291         region.setMaxHeight(650);
 292         assertEquals(650, region.getMaxHeight(), 1e-100);
 293         assertEquals(650, region.maxHeight(-1), 1e-100);
 294     }
 295 
 296     @Test public void testMaxHeightOverrideThenRestoreComputedSize() {
 297         Region region = new MockRegion(10,20, 100,200, 500,600);
 298         region.setMaxHeight(800);
 299         region.setMaxHeight(Region.USE_COMPUTED_SIZE); // reset
 300         assertEquals(Region.USE_COMPUTED_SIZE, region.getMaxHeight(), 0);
 301         assertEquals(600, region.maxHeight(-1), 1e-100);
 302     }
 303 
 304     @Test public void testMaxHeightNaNTreatedAsZero() {
 305         Region region = new Region();
 306         region.setMaxHeight(Double.NaN);
 307         assertEquals(0, region.maxHeight(-1), 0);
 308         assertEquals(0, region.maxHeight(5), 0);
 309     }
 310 
 311     @Test public void testMaxHeightNegativeTreatedAsZero() {
 312         Region region = new Region();
 313         region.setMaxHeight(-10);
 314         assertEquals(0, region.maxHeight(-1), 0);
 315         assertEquals(0, region.maxHeight(5), 0);
 316     }
 317 
 318     @Test public void testMaxWidthOverrideSetToPref() {
 319         Region region = new MockRegion(10,20, 100,200, 500,600);
 320         assertEquals(500, region.maxWidth(-1), 1e-100);
 321         region.setMaxWidth(Region.USE_PREF_SIZE);
 322         assertEquals(Region.USE_PREF_SIZE, region.getMaxWidth(), 0);
 323         assertEquals(100, region.maxWidth(-1), 1e-100);
 324     }
 325 
 326     @Test public void testMaxHeightOverrideSetToPref() {
 327         Region region = new MockRegion(10,20, 100,200, 500,600);
 328         assertEquals(600, region.maxHeight(-1), 1e-100);
 329         region.setMaxHeight(Region.USE_PREF_SIZE);
 330         assertEquals(Region.USE_PREF_SIZE, region.getMaxHeight(), 0);
 331         assertEquals(200, region.maxHeight(-1), 1e-100);
 332     }
 333 
 334     @Test public void testPositionInAreaForResizableForResizableTopLeft() {
 335         Pane pane = new Pane(); // Region extension which makes children sequence public
 336 
 337         MockResizable child = new MockResizable(10,20, 30,40, 50,60);
 338         pane.getChildren().add(child);
 339 
 340         child.autosize();
 341         RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 0, HPos.LEFT, VPos.TOP);
 342 
 343         assertEquals(30, child.getWidth(), 1e-100);
 344         assertEquals(40, child.getHeight(), 1e-100);
 345         assertEquals(10, child.getLayoutX(), 1e-100);
 346         assertEquals(10, child.getLayoutY(), 1e-100);
 347     }
 348 
 349     @Test public void testPositionInAreaForResizableTopCenter() {
 350         Pane pane = new Pane(); // Region extension which makes children sequence public
 351 
 352         MockResizable child = new MockResizable(10,20, 30,40, 50,60);
 353         pane.getChildren().add(child);
 354 
 355         child.autosize();
 356         RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 0, HPos.CENTER, VPos.TOP);
 357 
 358         assertEquals(30, child.getWidth(), 1e-100);
 359         assertEquals(40, child.getHeight(), 1e-100);
 360         assertEquals(45, child.getLayoutX(), 1e-100);
 361         assertEquals(10, child.getLayoutY(), 1e-100);
 362     }
 363 
 364     @Test public void testPositionInAreaForResizableTopRight() {
 365         Pane pane = new Pane(); // Region extension which makes children sequence public
 366 
 367         MockResizable child = new MockResizable(10,20, 30,40, 50,60);
 368         pane.getChildren().add(child);
 369 
 370         child.autosize();
 371         RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 0, HPos.RIGHT, VPos.TOP);
 372 
 373         assertEquals(30, child.getWidth(), 1e-100);
 374         assertEquals(40, child.getHeight(), 1e-100);
 375         assertEquals(80, child.getLayoutX(), 1e-100);
 376         assertEquals(10, child.getLayoutY(), 1e-100);
 377     }
 378 
 379     @Test public void testPositionInAreaForResizableCenterLeft() {
 380         Pane pane = new Pane(); // Region extension which makes children sequence public
 381 
 382         MockResizable child = new MockResizable(10,20, 30,40, 50,60);
 383         pane.getChildren().add(child);
 384 
 385         child.autosize();
 386         RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 0, HPos.LEFT, VPos.CENTER);
 387 
 388         assertEquals(30, child.getWidth(), 1e-100);
 389         assertEquals(40, child.getHeight(), 1e-100);
 390         assertEquals(10, child.getLayoutX(), 1e-100);
 391         assertEquals(40, child.getLayoutY(), 1e-100);
 392     }
 393 
 394 //    // See RT-19282
 395 //    @Test public void testPositionInAreaForNONResizableCenterLeft() {
 396 //        Pane pane = new Pane(); // Region extension which makes children sequence public
 397 //
 398 //        Rectangle child = new Rectangle(50.4, 50.4);
 399 //        pane.getChildren().add(child);
 400 //
 401 //        RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 0, HPos.LEFT, VPos.CENTER);
 402 //
 403 //        assertEquals(10, child.getLayoutX(), .01);
 404 //        assertEquals(34.8, child.getLayoutY(), .01);
 405 //    }
 406 
 407 
 408     @Test public void testPositionInAreaForResizableCenter() {
 409         Pane pane = new Pane(); // Region extension which makes children sequence public
 410 
 411         MockResizable child = new MockResizable(10,20, 30,40, 50,60);
 412         pane.getChildren().add(child);
 413 
 414         child.autosize();
 415         RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 0, HPos.CENTER, VPos.CENTER);
 416 
 417         assertEquals(30, child.getWidth(), 1e-100);
 418         assertEquals(40, child.getHeight(), 1e-100);
 419         assertEquals(45, child.getLayoutX(), 1e-100);
 420         assertEquals(40, child.getLayoutY(), 1e-100);
 421     }
 422 
 423 //    // See RT-19282
 424 //    @Test public void testPositionInAreaForNONResizableCenter() {
 425 //        Pane pane = new Pane(); // Region extension which makes children sequence public
 426 //
 427 //        Rectangle child = new Rectangle(50.4, 50.4);
 428 //        pane.getChildren().add(child);
 429 //
 430 //        RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 0, HPos.CENTER, VPos.CENTER);
 431 //
 432 //        assertEquals(34.8, child.getLayoutX(), .01);
 433 //        assertEquals(34.8, child.getLayoutY(), .01);
 434 //    }
 435 
 436     @Test public void testPositionInAreaForResizableCenterRight() {
 437         Pane pane = new Pane(); // Region extension which makes children sequence public
 438 
 439         MockResizable child = new MockResizable(10,20, 30,40, 50,60);
 440         pane.getChildren().add(child);
 441 
 442         child.autosize();
 443         RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 0, HPos.RIGHT, VPos.CENTER);
 444 
 445         assertEquals(30, child.getWidth(), 1e-100);
 446         assertEquals(40, child.getHeight(), 1e-100);
 447         assertEquals(80, child.getLayoutX(), 1e-100);
 448         assertEquals(40, child.getLayoutY(), 1e-100);
 449     }
 450 
 451     @Test public void testPositionInAreaForResizableBottomLeft() {
 452         Pane pane = new Pane(); // Region extension which makes children sequence public
 453 
 454         MockResizable child = new MockResizable(10,20, 30,40, 50,60);
 455         pane.getChildren().add(child);
 456 
 457         child.autosize();
 458         RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 0, HPos.LEFT, VPos.BOTTOM);
 459 
 460         assertEquals(30, child.getWidth(), 1e-100);
 461         assertEquals(40, child.getHeight(), 1e-100);
 462         assertEquals(10, child.getLayoutX(), 1e-100);
 463         assertEquals(70, child.getLayoutY(), 1e-100);
 464     }
 465 
 466 //    // See RT-19282
 467 //    @Test public void testPositionInAreaForNONResizableBottomLeft() {
 468 //        Pane pane = new Pane(); // Region extension which makes children sequence public
 469 //
 470 //        Rectangle child = new Rectangle(50.4, 50.4);
 471 //        pane.getChildren().add(child);
 472 //
 473 //        RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 0, HPos.LEFT, VPos.BOTTOM);
 474 //
 475 //        assertEquals(10, child.getLayoutX(), .01);
 476 //        assertEquals(59.6, child.getLayoutY(), .01);
 477 //    }
 478 
 479     @Test public void testPositionInAreaForResizableBottomCenter() {
 480         Pane pane = new Pane(); // Region extension which makes children sequence public
 481 
 482         MockResizable child = new MockResizable(10,20, 30,40, 50,60);
 483         pane.getChildren().add(child);
 484 
 485         child.autosize();
 486         RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 0, HPos.CENTER, VPos.BOTTOM);
 487 
 488         assertEquals(30, child.getWidth(), 1e-100);
 489         assertEquals(40, child.getHeight(), 1e-100);
 490         assertEquals(45, child.getLayoutX(), 1e-100);
 491         assertEquals(70, child.getLayoutY(), 1e-100);
 492     }
 493 
 494 //    // See RT-19282
 495 //    @Test public void testPositionInAreaForNONResizableBottomCenter() {
 496 //        Pane pane = new Pane(); // Region extension which makes children sequence public
 497 //
 498 //        Rectangle child = new Rectangle(50.4, 50.4);
 499 //        pane.getChildren().add(child);
 500 //
 501 //        RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 0, HPos.CENTER, VPos.BOTTOM);
 502 //
 503 //        assertEquals(34.8, child.getLayoutX(), .01);
 504 //        assertEquals(59.6, child.getLayoutY(), .01);
 505 //    }
 506 
 507     @Test public void testPositionInAreaForResizableBottomRight() {
 508         Pane pane = new Pane(); // Region extension which makes children sequence public
 509 
 510         MockResizable child = new MockResizable(10,20, 30,40, 50,60);
 511         pane.getChildren().add(child);
 512 
 513         child.autosize();
 514         RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 0, HPos.RIGHT, VPos.BOTTOM);
 515 
 516         assertEquals(30, child.getWidth(), 1e-100);
 517         assertEquals(40, child.getHeight(), 1e-100);
 518         assertEquals(80, child.getLayoutX(), 1e-100);
 519         assertEquals(70, child.getLayoutY(), 1e-100);
 520     }
 521 
 522 //    // See RT-19282
 523 //    @Test public void testPositionInAreaForNONResizableBottomRight() {
 524 //        Pane pane = new Pane(); // Region extension which makes children sequence public
 525 //
 526 //        Rectangle child = new Rectangle(50.4, 50.4);
 527 //        pane.getChildren().add(child);
 528 //
 529 //        RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 0, HPos.RIGHT, VPos.BOTTOM);
 530 //
 531 //        assertEquals(59.6, child.getLayoutX(), .01);
 532 //        assertEquals(59.6, child.getLayoutY(), .01);
 533 //    }
 534 
 535     @Test public void testPositionInAreaForResizableBaselineLeft() {
 536         Pane pane = new Pane(); // Region extension which makes children sequence public
 537 
 538         MockResizable child = new MockResizable(10,20, 30,40, 50,60); //baseline = 30
 539         pane.getChildren().add(child);
 540 
 541         child.autosize();
 542         RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 50, HPos.LEFT, VPos.BASELINE);
 543 
 544         assertEquals(30, child.getWidth(), 1e-100);
 545         assertEquals(40, child.getHeight(), 1e-100);
 546         assertEquals(10, child.getLayoutX(), 1e-100);
 547         assertEquals(30, child.getLayoutY(), 1e-100);
 548     }
 549 
 550 //    // See RT-19282
 551 //    @Test public void testPositionInAreaForNONResizableBaselineLeft() {
 552 //        Pane pane = new Pane(); // Region extension which makes children sequence public
 553 //
 554 //        Rectangle child = new Rectangle(50.4, 50.4);
 555 //        pane.getChildren().add(child);
 556 //
 557 //        RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 60, HPos.LEFT, VPos.BASELINE);
 558 //
 559 //        assertEquals(10, child.getLayoutX(), .01);
 560 //        assertEquals(19.6, child.getLayoutY(), .01);
 561 //    }
 562 
 563     @Test public void testPositionInAreaForResizableBaselineCenter() {
 564         Pane pane = new Pane(); // Region extension which makes children sequence public
 565 
 566         MockResizable child = new MockResizable(10,20, 30,40, 50,60); //baseline = 30
 567         pane.getChildren().add(child);
 568 
 569         child.autosize();
 570         RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 50, HPos.CENTER, VPos.BASELINE);
 571 
 572         assertEquals(30, child.getWidth(), 1e-100);
 573         assertEquals(40, child.getHeight(), 1e-100);
 574         assertEquals(45, child.getLayoutX(), 1e-100);
 575         assertEquals(30, child.getLayoutY(), 1e-100);
 576     }
 577 
 578 //    // See RT-19282
 579 //    @Test public void testPositionInAreaForNONResizableBaselineCenter() {
 580 //        Pane pane = new Pane(); // Region extension which makes children sequence public
 581 //
 582 //        Rectangle child = new Rectangle(50.4, 50.4);
 583 //        pane.getChildren().add(child);
 584 //
 585 //        RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 60, HPos.CENTER, VPos.BASELINE);
 586 //
 587 //        assertEquals(34.8, child.getLayoutX(), .01);
 588 //        assertEquals(19.6, child.getLayoutY(), .01);
 589 //    }
 590 
 591     @Test public void testPositionInAreaForResizableBaselineRight() {
 592         Pane pane = new Pane(); // Region extension which makes children sequence public
 593 
 594         MockResizable child = new MockResizable(10,20, 30,40, 50,60); //baseline = 30
 595         pane.getChildren().add(child);
 596 
 597         child.autosize();
 598         RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 50, HPos.RIGHT, VPos.BASELINE);
 599 
 600         assertEquals(30, child.getWidth(), 1e-100);
 601         assertEquals(40, child.getHeight(), 1e-100);
 602         assertEquals(80, child.getLayoutX(), 1e-100);
 603         assertEquals(30, child.getLayoutY(), 1e-100);
 604     }
 605 
 606 //    // See RT-19282
 607 //    @Test public void testPositionInAreaForNONResizableBaselineRight() {
 608 //        Pane pane = new Pane(); // Region extension which makes children sequence public
 609 //
 610 //        Rectangle child = new Rectangle(50.4, 50.4);
 611 //        pane.getChildren().add(child);
 612 //
 613 //        RegionShim.positionInArea(pane,child, 10, 10, 100, 100, 60, HPos.RIGHT, VPos.BASELINE);
 614 //
 615 //        assertEquals(59.6, child.getLayoutX(), .01);
 616 //        assertEquals(19.6, child.getLayoutY(), .01);
 617 //    }
 618 
 619     @Test public void testLayoutInAreaWithLargerMax() {
 620         Pane pane = new Pane(); // Region extension which makes children sequence public
 621 
 622         MockResizable child = new MockResizable(10,20, 30,40, 300,300);
 623         pane.getChildren().add(child);
 624 
 625         RegionShim.layoutInArea(pane, child, 10, 10, 100, 100, 0, HPos.CENTER, VPos.CENTER);
 626 
 627         assertEquals(100, child.getWidth(), 1e-100);
 628         assertEquals(100, child.getHeight(), 1e-100);
 629         assertEquals(10, child.getLayoutX(), 1e-100);
 630         assertEquals(10, child.getLayoutY(), 1e-100);
 631 
 632     }
 633 
 634     @Test public void testLayoutInAreaWithSmallerMax() {
 635         Pane pane = new Pane(); // Region extension which makes children sequence public
 636 
 637         MockResizable child = new MockResizable(10,20, 30,40, 50,60);
 638         pane.getChildren().add(child);
 639 
 640         RegionShim.layoutInArea(pane, child, 10, 10, 100, 100, 0, HPos.CENTER, VPos.CENTER);
 641 
 642         assertEquals(50, child.getWidth(), 1e-100);
 643         assertEquals(60, child.getHeight(), 1e-100);
 644         assertEquals(35, child.getLayoutX(), 1e-100);
 645         assertEquals(30, child.getLayoutY(), 1e-100);
 646 
 647     }
 648 
 649     @Test public void testLayoutInAreaWithLargerMin() {
 650         Pane pane = new Pane(); // Region extension which makes children sequence public
 651 
 652         MockResizable child = new MockResizable(10,20, 30,40, 50,60);
 653         pane.getChildren().add(child);
 654 
 655         RegionShim.layoutInArea(pane, child, 10, 10, 5, 5, 0, HPos.CENTER, VPos.CENTER);
 656 
 657         assertEquals(10, child.getWidth(), 1e-100);
 658         assertEquals(20, child.getHeight(), 1e-100);
 659         assertEquals(8, child.getLayoutX(), 1e-100);
 660         assertEquals(3, child.getLayoutY(), 1e-100);
 661 
 662     }
 663 
 664     @Test public void testLayoutInAreaWithSizeOverrides() {
 665         Pane pane = new Pane(); // Region extension which makes children sequence public
 666 
 667         MockRegion child = new MockRegion(10,20, 30,40, 50,60);
 668         child.setMinSize(50,60);
 669         child.setPrefSize(100,200);
 670         child.setMaxSize(500, 500);
 671         pane.getChildren().add(child);
 672 
 673         RegionShim.layoutInArea(pane, child, 10, 10, 300, 300, 0, HPos.CENTER, VPos.CENTER);
 674 
 675         assertEquals(300, child.getWidth(), 1e-100);
 676         assertEquals(300, child.getHeight(), 1e-100);
 677         assertEquals(10, child.getLayoutX(), 1e-100);
 678         assertEquals(10, child.getLayoutY(), 1e-100);
 679 
 680     }
 681 
 682     @Test public void testLayoutInAreaWithMaxConstrainedToPref() {
 683         Pane pane = new Pane(); // Region extension which makes children sequence public
 684 
 685         MockRegion child = new MockRegion(10,20, 30,40, 500,500);
 686         child.setMinSize(50,60);
 687         child.setPrefSize(100,200);
 688         child.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
 689         pane.getChildren().add(child);
 690 
 691         RegionShim.layoutInArea(pane, child, 10, 10, 300, 300, 0, HPos.CENTER, VPos.CENTER);
 692 
 693         assertEquals(100, child.getWidth(), 1e-100);
 694         assertEquals(200, child.getHeight(), 1e-100);
 695         assertEquals(110, child.getLayoutX(), 1e-100);
 696         assertEquals(60, child.getLayoutY(), 1e-100);
 697 
 698     }
 699 
 700     @Test public void testLayoutInAreaHonorsMaxWidthOverPref() {
 701         Pane pane = new Pane(); // Region extension which makes children sequence public
 702 
 703         MockRegion child = new MockRegion(10,20, 200,300, 500,500);
 704         child.setMaxWidth(100); // max less than pref
 705         pane.getChildren().add(child);
 706 
 707         RegionShim.layoutInArea(pane, child, 10, 10, 300, 300, 0, HPos.CENTER, VPos.CENTER);
 708 
 709         assertEquals(100, child.getWidth(), 1e-100);
 710         assertEquals(300, child.getHeight(), 1e-100);
 711         assertEquals(110, child.getLayoutX(), 1e-100);
 712         assertEquals(10, child.getLayoutY(), 1e-100);
 713 
 714     }
 715 
 716     @Test public void testLayoutInAreaHonorsMaxHeightOverPref() {
 717         Pane pane = new Pane(); // Region extension which makes children sequence public
 718 
 719         MockRegion child = new MockRegion(10,20, 200,300, 500,500);
 720         child.setMaxHeight(100); // max less than pref
 721         pane.getChildren().add(child);
 722 
 723         RegionShim.layoutInArea(pane, child, 10, 10, 300, 300, 0, HPos.CENTER, VPos.CENTER);
 724 
 725         assertEquals(300, child.getWidth(), 1e-100);
 726         assertEquals(100, child.getHeight(), 1e-100);
 727         assertEquals(10, child.getLayoutX(), 1e-100);
 728         assertEquals(110, child.getLayoutY(), 1e-100);
 729 
 730     }
 731 
 732     @Test public void testLayoutInAreaHonorsMinWidthOverPref() {
 733         Pane pane = new Pane(); // Region extension which makes children sequence public
 734 
 735         MockRegion child = new MockRegion(10,20, 200,300, 500,500);
 736         child.setMinWidth(400); // max less than pref
 737         pane.getChildren().add(child);
 738 
 739         RegionShim.layoutInArea(pane, child, 10, 10, 300, 300, 0, HPos.CENTER, VPos.CENTER);
 740 
 741         assertEquals(400, child.getWidth(), 1e-100);
 742         assertEquals(300, child.getHeight(), 1e-100);
 743         assertEquals(-40, child.getLayoutX(), 1e-100);
 744         assertEquals(10, child.getLayoutY(), 1e-100);
 745     }
 746 
 747     @Test public void testLayoutInAreaHonorsMinHeightOverPref() {
 748         Pane pane = new Pane(); // Region extension which makes children sequence public
 749 
 750         MockRegion child = new MockRegion(10,20, 200,300, 500,500);
 751         child.setMinHeight(400); // max less than pref
 752         pane.getChildren().add(child);
 753 
 754         RegionShim.layoutInArea(pane, child, 10, 10, 300, 300, 0, HPos.CENTER, VPos.CENTER);
 755 
 756         assertEquals(300, child.getWidth(), 1e-100);
 757         assertEquals(400, child.getHeight(), 1e-100);
 758         assertEquals(10, child.getLayoutX(), 1e-100);
 759         assertEquals(-40, child.getLayoutY(), 1e-100);
 760     }
 761 
 762     @Test public void testLayoutInAreaHonorsMinWidthOverMax() {
 763         Pane pane = new Pane(); // Region extension which makes children sequence public
 764 
 765         MockRegion child = new MockRegion(10,20, 200,300, 500,500);
 766         child.setMinWidth(600); // max less than min
 767         pane.getChildren().add(child);
 768 
 769         RegionShim.layoutInArea(pane, child, 10, 10, 300, 300, 0, HPos.CENTER, VPos.CENTER);
 770 
 771         assertEquals(600, child.getWidth(), 1e-100);
 772         assertEquals(300, child.getHeight(), 1e-100);
 773         assertEquals(-140, child.getLayoutX(), 1e-100);
 774         assertEquals(10, child.getLayoutY(), 1e-100);
 775     }
 776 
 777     @Test public void testLayoutInAreaHonorsMinHeightOverMax() {
 778         Pane pane = new Pane(); // Region extension which makes children sequence public
 779 
 780         MockRegion child = new MockRegion(10,20, 200,300, 500,500);
 781         child.setMinHeight(600); // max less than min
 782         pane.getChildren().add(child);
 783 
 784         RegionShim.layoutInArea(pane, child, 10, 10, 300, 300, 0, HPos.CENTER, VPos.CENTER);
 785 
 786         assertEquals(300, child.getWidth(), 1e-100);
 787         assertEquals(600, child.getHeight(), 1e-100);
 788         assertEquals(10, child.getLayoutX(), 1e-100);
 789         assertEquals(-140, child.getLayoutY(), 1e-100);
 790     }
 791 
 792     @Test public void testLayoutInAreaHonorsAreaWidthOverPrefWithFillWidth() {
 793         Pane pane = new Pane(); // Region extension which makes children sequence public
 794 
 795         MockRegion child = new MockRegion(10,20, 200,300, 500,500);
 796         pane.getChildren().add(child);
 797 
 798         RegionShim.layoutInArea(pane, child, 10, 10, 100, 400, 0, Insets.EMPTY, true, true, HPos.CENTER, VPos.CENTER);
 799 
 800         assertEquals(100, child.getWidth(), 1e-100);
 801         assertEquals(400, child.getHeight(), 1e-100);
 802         assertEquals(10, child.getLayoutX(), 1e-100);
 803         assertEquals(10, child.getLayoutY(), 1e-100);
 804     }
 805 
 806     @Test public void testLayoutInAreaHonorsAreaHeightOverPrefWithFillHeight() {
 807         Pane pane = new Pane(); // Region extension which makes children sequence public
 808 
 809         MockRegion child = new MockRegion(10,20, 200,300, 500,500);
 810         pane.getChildren().add(child);
 811 
 812         RegionShim.layoutInArea(pane, child, 10, 10, 300, 100, 0, Insets.EMPTY, true, true, HPos.CENTER, VPos.CENTER);
 813 
 814         assertEquals(300, child.getWidth(), 1e-100);
 815         assertEquals(100, child.getHeight(), 1e-100);
 816         assertEquals(10, child.getLayoutX(), 1e-100);
 817         assertEquals(10, child.getLayoutY(), 1e-100);
 818     }
 819 
 820     @Test public void testLayoutInAreaHonorsAreaWidthOverPrefWithNOFill() {
 821         Pane pane = new Pane(); // Region extension which makes children sequence public
 822 
 823         MockRegion child = new MockRegion(10,20, 200,300, 500,500);
 824         pane.getChildren().add(child);
 825 
 826         RegionShim.layoutInArea(pane, child, 10, 10, 100, 400, 0, Insets.EMPTY, false, false, HPos.CENTER, VPos.CENTER);
 827 
 828         assertEquals(100, child.getWidth(), 1e-100);
 829         assertEquals(300, child.getHeight(), 1e-100);
 830         assertEquals(10, child.getLayoutX(), 1e-100);
 831         assertEquals(60, child.getLayoutY(), 1e-100);
 832     }
 833 
 834     @Test public void testLayoutInAreaHonorsAreaHeightOverPrefWithNOFill() {
 835         Pane pane = new Pane(); // Region extension which makes children sequence public
 836 
 837         MockRegion child = new MockRegion(10,20, 200,300, 500,500);
 838         pane.getChildren().add(child);
 839 
 840         RegionShim.layoutInArea(pane, child, 10, 10, 300, 100, 0, Insets.EMPTY, false, false, HPos.CENTER, VPos.CENTER);
 841 
 842         assertEquals(200, child.getWidth(), 1e-100);
 843         assertEquals(100, child.getHeight(), 1e-100);
 844         assertEquals(60, child.getLayoutX(), 1e-100);
 845         assertEquals(10, child.getLayoutY(), 1e-100);
 846     }
 847 
 848     @Test public void testLayoutInAreaWithBaselineOffset() {
 849         Pane pane = new Pane(); // Region extension which makes children sequence public
 850 
 851         Region c1 = new MockBiased(Orientation.HORIZONTAL, 100, 100);
 852         Region c2 = new MockBiased(Orientation.VERTICAL, 100, 100);
 853         Region c3 = new MockRegion(10, 10, 100, 100, 1000, 1000);
 854 
 855         pane.getChildren().addAll(c1, c2, c3);
 856         RegionShim.layoutInArea(pane, c1, 10, 10, 300, 100, 20, Insets.EMPTY, false, false, HPos.CENTER, VPos.BASELINE);
 857         RegionShim.layoutInArea(pane, c2, 10, 10, 300, 100, 20, Insets.EMPTY, false, false, HPos.CENTER, VPos.BASELINE);
 858         RegionShim.layoutInArea(pane, c3, 10, 10, 300, 100, 20, Insets.EMPTY, false, false, HPos.CENTER, VPos.BASELINE);
 859 
 860         assertEquals(100, c1.getHeight(), 1e-100); // min height == pref height
 861         // As the other 2 Regions don't have a baseline offset, their baseline offset is "same as height", therefore
 862         // they can be max 20px tall
 863         assertEquals(20, c2.getHeight(), 1e-100);
 864         assertEquals(20, c3.getHeight(), 1e-100);
 865     }
 866 
 867     @Test public void testComputeChildPrefAreaWidthHonorsMaxWidthOverPref() {
 868         Pane pane = new Pane(); // Region extension which makes children sequence public
 869 
 870         MockRegion child = new MockRegion(10,20, 200,300, 500,500);
 871         child.setMaxWidth(100); // max less than pref
 872         pane.getChildren().add(child);
 873 
 874         assertEquals(100, RegionShim.computeChildPrefAreaWidth(pane, child, Insets.EMPTY), 1e-100);
 875     }
 876 
 877     @Test public void testComputeChildPrefAreaHeightHonorsMaxWidthOverPref() {
 878         Pane pane = new Pane(); // Region extension which makes children sequence public
 879 
 880         MockRegion child = new MockRegion(10,20, 200,300, 500,500);
 881         child.setMaxHeight(100); // max less than pref
 882         pane.getChildren().add(child);
 883 
 884         assertEquals(100, RegionShim.computeChildPrefAreaHeight(pane, child, Insets.EMPTY), 1e-100);
 885     }
 886 
 887     @Test public void testComputeChildPrefAreaWidthHonorsMinWidthOverPref() {
 888         Pane pane = new Pane(); // Region extension which makes children sequence public
 889 
 890         MockRegion child = new MockRegion(10,20, 200,300, 500,500);
 891         child.setMinWidth(400); // max less than pref
 892         pane.getChildren().add(child);
 893 
 894         assertEquals(400, RegionShim.computeChildPrefAreaWidth(pane, child, Insets.EMPTY), 1e-100);
 895     }
 896 
 897     @Test public void testComputeChildPrefAreaHeightHonorsMinWidthOverPref() {
 898         Pane pane = new Pane(); // Region extension which makes children sequence public
 899 
 900         MockRegion child = new MockRegion(10,20, 200,300, 500,500);
 901         child.setMinHeight(400); // max less than pref
 902         pane.getChildren().add(child);
 903 
 904         assertEquals(400, RegionShim.computeChildPrefAreaHeight(pane, child, Insets.EMPTY), 1e-100);
 905     }
 906 
 907     @Test public void testComputeChildPrefAreaWidthHonorsMinWidthOverMax() {
 908         Pane pane = new Pane(); // Region extension which makes children sequence public
 909 
 910         MockRegion child = new MockRegion(10,20, 200,300, 500,500);
 911         child.setMinWidth(600); // max less than pref
 912         pane.getChildren().add(child);
 913 
 914         assertEquals(600, RegionShim.computeChildPrefAreaWidth(pane, child, Insets.EMPTY), 1e-100);
 915     }
 916 
 917     @Test public void testComputeChildPrefAreaHeightHonorsMinWidthOverMax() {
 918         Pane pane = new Pane(); // Region extension which makes children sequence public
 919 
 920         MockRegion child = new MockRegion(10,20, 200,300, 500,500);
 921         child.setMinHeight(600); // max less than pref
 922         pane.getChildren().add(child);
 923 
 924         assertEquals(600, RegionShim.computeChildPrefAreaHeight(pane, child, Insets.EMPTY), 1e-100);
 925     }
 926 
 927     @Test public void testChildMinAreaWidth() {
 928         Pane pane = new Pane();
 929 
 930         Region c1 = new MockBiased(Orientation.HORIZONTAL, 100, 100);
 931         Region c2 = new MockBiased(Orientation.VERTICAL, 100, 100);
 932         Region c3 = new MockRegion(10, 10, 100, 100, 1000, 1000);
 933 
 934         pane.getChildren().addAll(c1, c2, c3);
 935 
 936         assertEquals(12, RegionShim.computeChildMinAreaWidth(pane, c1, new Insets(1)), 1e-100);
 937         assertEquals(12, RegionShim.computeChildMinAreaWidth(pane, c1, 0, new Insets(1), 50, false), 1e-100);
 938         assertEquals(102, RegionShim.computeChildMinAreaWidth(pane, c2, new Insets(1)), 1e-100);
 939         assertEquals(2 + Math.ceil(100*100/48.0), RegionShim.computeChildMinAreaWidth(pane, c2, -1, new Insets(1), 50, false), 1e-100); // vertically biased, effective height is 49
 940         assertEquals(2 + Math.ceil(100*100/38.0), RegionShim.computeChildMinAreaWidth(pane, c2, 10, new Insets(1), 50, false), 1e-100); // vertically biased, effective height is 49
 941         assertEquals(12, RegionShim.computeChildMinAreaWidth(pane, c3, new Insets(1)), 1e-100);
 942         assertEquals(12, RegionShim.computeChildMinAreaWidth(pane, c3, 0, new Insets(1), 50, false), 1e-100);
 943 
 944     }
 945 
 946     @Test public void testChildMinAreaHeight() {
 947         Pane pane = new Pane();
 948 
 949         Region c1 = new MockBiased(Orientation.HORIZONTAL, 100, 100);
 950         Region c2 = new MockBiased(Orientation.VERTICAL, 100, 100);
 951         Region c3 = new MockRegion(10, 10, 100, 100, 1000, 1000);
 952 
 953         pane.getChildren().addAll(c1, c2, c3);
 954 
 955         assertEquals(3, RegionShim.computeChildMinAreaHeight(pane, c1, -1, new Insets(1), -1), 1e-100); /*Insets + minimal for biased is 1 */
 956         assertEquals(2 + Math.ceil(100*100/48.0), RegionShim.computeChildMinAreaHeight(pane, c1, -1, new Insets(1), 50), 1e-100);
 957         assertEquals(12 + Math.ceil(100*100/48.0), RegionShim.computeChildMinAreaHeight(pane, c1, 10, new Insets(1), 50), 1e-100);
 958         assertEquals(12, RegionShim.computeChildMinAreaHeight(pane, c2, -1, new Insets(1), -1), 1e-100);
 959         assertEquals(12, RegionShim.computeChildMinAreaHeight(pane, c2, -1, new Insets(1), 50), 1e-100);
 960         assertEquals(12, RegionShim.computeChildMinAreaHeight(pane, c3, -1, new Insets(1), -1), 1e-100);
 961         assertEquals(12, RegionShim.computeChildMinAreaHeight(pane, c3, -1, new Insets(1), 50), 1e-100);
 962     }
 963 
 964     @Test public void testChildMaxAreaWidth() {
 965         Pane pane = new Pane();
 966 
 967         Region c1 = new MockBiased(Orientation.HORIZONTAL, 100, 100);
 968         Region c2 = new MockBiased(Orientation.VERTICAL, 100, 100);
 969         Region c3 = new MockRegion(10, 10, 100, 100, 1000, 1000);
 970 
 971         pane.getChildren().addAll(c1, c2, c3);
 972 
 973         assertEquals(10002, RegionShim.computeChildMaxAreaWidth(pane,c1, -1, new Insets(1), -1, false), 1e-100);
 974         assertEquals(10002, RegionShim.computeChildMaxAreaWidth(pane,c1, -1, new Insets(1), 50, false), 1e-100);
 975         assertEquals(102, RegionShim.computeChildMaxAreaWidth(pane,c2, -1,  new Insets(1), -1, false), 1e-100); // Vertival bias is not applied when no height/baseline offset is set
 976         assertEquals(2 + Math.ceil(100*100/48.0), RegionShim.computeChildMaxAreaWidth(pane,c2, -1, new Insets(1), 50, false), 1e-100);
 977         assertEquals(2 + Math.ceil(100*100/38.0), RegionShim.computeChildMaxAreaWidth(pane,c2, 10, new Insets(1), 50, false), 1e-100);
 978         assertEquals(1002, RegionShim.computeChildMaxAreaWidth(pane,c3, -1, new Insets(1), -1, false), 1e-100);
 979         assertEquals(1002, RegionShim.computeChildMaxAreaWidth(pane,c3, -1, new Insets(1), 50, false), 1e-100);
 980     }
 981 
 982     @Test public void testChildMaxAreaHeight() {
 983         Pane pane = new Pane();
 984 
 985         Region c1 = new MockBiased(Orientation.HORIZONTAL, 100, 100);
 986         Region c2 = new MockBiased(Orientation.VERTICAL, 100, 100);
 987         Region c3 = new MockRegion(10, 10, 100, 100, 1000, 1000);
 988 
 989         pane.getChildren().addAll(c1, c2, c3);
 990 
 991         assertEquals(1002, RegionShim.computeChildMaxAreaHeight(pane,c1, -1, new Insets(1), -1), 1e-100);
 992         assertEquals(2 + Math.ceil(100*100/48.0), RegionShim.computeChildMaxAreaHeight(pane,c1, -1, new Insets(1), 50), 1e-100);
 993         assertEquals(12 + Math.ceil(100*100/48.0), RegionShim.computeChildMaxAreaHeight(pane,c1, 10, new Insets(1), 50), 1e-100);
 994         assertEquals(10002, RegionShim.computeChildMaxAreaHeight(pane,c2, -1, new Insets(1), -1), 1e-100);
 995         assertEquals(10002, RegionShim.computeChildMaxAreaHeight(pane,c2, -1, new Insets(1), 50), 1e-100);
 996         assertEquals(1002, RegionShim.computeChildMaxAreaHeight(pane,c3, -1, new Insets(1), -1), 1e-100);
 997         assertEquals(1002, RegionShim.computeChildMaxAreaHeight(pane,c3, -1, new Insets(1), 50), 1e-100);
 998     }
 999 
1000     /**************************************************************************
1001      *                                                                        *
1002      *    Test that images which are background loaded, or images which can   *
1003      *    change (such as WritableImage or animated gif) will cause a         *
1004      *    listener to be installed. Also that a non-animating background      *
1005      *    loaded image will have the listener removed when the image          *
1006      *    finishes loading, and that all listeners are removed from images    *
1007      *    which have been removed from the Region. Also that any animating    *
1008      *    or background loaded image will cause a repaint to happen when the  *
1009      *    underlying platform image changes.                                  *
1010      *                                                                        *
1011      *************************************************************************/
1012 
1013     @Test public void testBackgroundLoadedBackgroundImageHasListenerInstalled() {
1014         final ImageForTesting image = new ImageForTesting("http://something.png", true);
1015         assertTrue(image.getProgress() < 1);
1016 
1017         ImageRegion r = new ImageRegion();
1018         final Background background = new Background(new BackgroundImage(image, null, null, null, null));
1019         r.setBackground(background);
1020 
1021         assertTrue(r.listenerAdded.get());
1022     }
1023 
1024     @Test public void testBackgroundLoadedBackgroundImageStillLoadingButRemovedFromRegionHasListenerRemoved() {
1025         final ImageForTesting image = new ImageForTesting("http://something.png", true);
1026         assertTrue(image.getProgress() < 1);
1027 
1028         ImageRegion r = new ImageRegion();
1029         final Background background = new Background(new BackgroundImage(image, null, null, null, null));
1030         r.setBackground(background);
1031         r.setBackground(null);
1032 
1033         assertFalse(r.listenerAdded.get());
1034     }
1035 
1036     @Test public void testBackgroundLoadedBackgroundImageWhichFinishesLoadingHasListenerRemoved() {
1037         final ImageForTesting image = new ImageForTesting("http://something.png", true);
1038         assertTrue(image.getProgress() < 1);
1039 
1040         ImageRegion r = new ImageRegion();
1041         final Background background = new Background(new BackgroundImage(image, null, null, null, null));
1042         r.setBackground(background);
1043         image.updateProgress(1);
1044         image.updateVisuals();
1045 
1046         assertFalse(r.listenerAdded.get());
1047     }
1048 
1049     @Test public void testBackgroundLoadedBackgroundImageWhichFinishesLoadingCausesRepaint() {
1050         final ImageForTesting image = new ImageForTesting("http://something.png", true);
1051         assertTrue(image.getProgress() < 1);
1052 
1053         ImageRegion r = new ImageRegion();
1054         final Background background = new Background(new BackgroundImage(image, null, null, null, null));
1055         r.setBackground(background);
1056         r.clearDirty();
1057         assertFalse(r.willBeRepainted());
1058         image.updateProgress(1);
1059         image.updateVisuals();
1060 
1061         assertTrue(r.willBeRepainted());
1062     }
1063 
1064     @Test public void testBackgroundLoadedBorderImageHasListenerInstalled() {
1065         final ImageForTesting image = new ImageForTesting("http://something.png", true);
1066         assertTrue(image.getProgress() < 1);
1067 
1068         ImageRegion r = new ImageRegion();
1069         final Border border = new Border(new BorderImage(image, null, null, null, false, null, null));
1070         r.setBorder(border);
1071 
1072         assertTrue(r.listenerAdded.get());
1073     }
1074 
1075     @Test public void testBackgroundLoadedBorderImageStillLoadingButRemovedFromRegionHasListenerRemoved() {
1076         final ImageForTesting image = new ImageForTesting("http://something.png", true);
1077         assertTrue(image.getProgress() < 1);
1078 
1079         ImageRegion r = new ImageRegion();
1080         final Border border = new Border(new BorderImage(image, null, null, null, false, null, null));
1081         r.setBorder(border);
1082         r.setBorder(null);
1083 
1084         assertFalse(r.listenerAdded.get());
1085     }
1086 
1087     @Test public void testBackgroundLoadedBorderImageWhichFinishesLoadingHasListenerRemoved() {
1088         final ImageForTesting image = new ImageForTesting("http://something.png", true);
1089         assertTrue(image.getProgress() < 1);
1090 
1091         ImageRegion r = new ImageRegion();
1092         final Border border = new Border(new BorderImage(image, null, null, null, false, null, null));
1093         r.setBorder(border);
1094         image.updateProgress(1);
1095         image.updateVisuals();
1096 
1097         assertFalse(r.listenerAdded.get());
1098     }
1099 
1100     @Test public void testBackgroundLoadedBorderImageWhichFinishesLoadingCausesRepaint() {
1101         final ImageForTesting image = new ImageForTesting("http://something.png", true);
1102         assertTrue(image.getProgress() < 1);
1103 
1104         ImageRegion r = new ImageRegion();
1105         final Border border = new Border(new BorderImage(image, null, null, null, false, null, null));
1106         r.setBorder(border);
1107         r.clearDirty();
1108         assertFalse(r.willBeRepainted());
1109         image.updateProgress(1);
1110         image.updateVisuals();
1111 
1112         assertTrue(r.willBeRepainted());
1113     }
1114 
1115     @Test public void testAnimatedBackgroundImageHasListenerInstalled() {
1116         final WritableImage image = new WritableImage(10, 10);
1117         ImageRegion r = new ImageRegion();
1118         final Background background = new Background(new BackgroundImage(image, null, null, null, null));
1119         r.setBackground(background);
1120         assertTrue(r.listenerAdded.get());
1121     }
1122 
1123     @Test public void testAnimatedBackgroundImageRemovedFromRegionHasListenerRemoved() {
1124         final WritableImage image = new WritableImage(10, 10);
1125         ImageRegion r = new ImageRegion();
1126         final Background background = new Background(new BackgroundImage(image, null, null, null, null));
1127         r.setBackground(background);
1128         r.setBackground(null);
1129         assertFalse(r.listenerAdded.get());
1130     }
1131 
1132     @Test public void testAnimatedBackgroundImageCausesRepaintWhenAnimationChanges() {
1133         final WritableImage image = new WritableImage(10, 10);
1134         ImageRegion r = new ImageRegion();
1135         final Background background = new Background(new BackgroundImage(image, null, null, null, null));
1136         r.setBackground(background);
1137         r.clearDirty();
1138         assertFalse(r.willBeRepainted());
1139         image.getPixelWriter().setArgb(0, 0, 100);
1140         assertTrue(r.willBeRepainted());
1141     }
1142 
1143     @Test public void testAnimatedBorderImageHasListenerInstalled() {
1144         final WritableImage image = new WritableImage(10, 10);
1145         ImageRegion r = new ImageRegion();
1146         final Border border = new Border(new BorderImage(image, null, null, null, false, null, null));
1147         r.setBorder(border);
1148         assertTrue(r.listenerAdded.get());
1149     }
1150 
1151     @Test public void testAnimatedBorderImageRemovedFromRegionHasListenerRemoved() {
1152         final WritableImage image = new WritableImage(10, 10);
1153         ImageRegion r = new ImageRegion();
1154         final Border border = new Border(new BorderImage(image, null, null, null, false, null, null));
1155         r.setBorder(border);
1156         r.setBorder(null);
1157         assertFalse(r.listenerAdded.get());
1158     }
1159 
1160     @Test public void testAnimatedBorderImageCausesRepaintWhenAnimationChanges() {
1161         final WritableImage image = new WritableImage(10, 10);
1162         ImageRegion r = new ImageRegion();
1163         final Border border = new Border(new BorderImage(image, null, null, null, false, null, null));
1164         r.setBorder(border);
1165         r.clearDirty();
1166         assertFalse(r.willBeRepainted());
1167         image.getPixelWriter().setArgb(0, 0, 100);
1168         assertTrue(r.willBeRepainted());
1169     }
1170 
1171     @Test public void testBorderChangeUpdatesTheInsets() {
1172         Region r = new Region();
1173 
1174         r.setBorder(new Border(new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, BorderWidths.DEFAULT, new Insets(10))));
1175         assertEquals(new Insets(11), r.getInsets());
1176 
1177         r.setBorder(new Border(new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, null, null, new Insets(20))));
1178 
1179         assertEquals(new Insets(21), r.getInsets());
1180     }
1181 
1182     static final class ImageRegion extends RegionShim {
1183         AtomicBoolean listenerAdded = new AtomicBoolean(false);
1184 
1185         @Override public void addImageListener(Image image) {
1186             super.addImageListener(image);
1187             listenerAdded.set(true);
1188         }
1189 
1190         @Override public void removeImageListener(Image image) {
1191             super.removeImageListener(image);
1192             listenerAdded.set(false);
1193         }
1194 
1195         public boolean willBeRepainted() {
1196             return NodeShim.impl_isDirty(this, DirtyBits.NODE_CONTENTS);
1197         }
1198 
1199         public void clearDirty() {
1200             NodeShim.impl_clearDirty(this, DirtyBits.NODE_CONTENTS);
1201         }
1202     };
1203 
1204     // Test for RT-13820
1205     @Test public void changingShapeElementsShouldResultInRender() {
1206         Region r = new Region();
1207         r.setPrefWidth(640);
1208         r.setPrefHeight(480);
1209         LineTo lineTo;
1210         Path p = new Path(
1211                 new MoveTo(0, 0),
1212                 lineTo = new LineTo(100, 0),
1213                 new LineTo(50, 100),
1214                 new ClosePath()
1215         );
1216         r.setBackground(new Background(new BackgroundFill(Color.BLUE, null, null)));
1217         r.setCenterShape(true);
1218         r.setScaleShape(true);
1219         r.setShape(p);
1220         r.impl_syncPeer();
1221 
1222         NGRegion peer = r.impl_getPeer();
1223         assertFalse(peer.isClean());
1224         peer.clearDirtyTree();
1225         assertTrue(peer.isClean());
1226 
1227         lineTo.setX(200);
1228         p.impl_syncPeer();
1229         r.impl_syncPeer();
1230         assertFalse(peer.isClean());
1231     }
1232 }