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