1 /*
   2  * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package javafx.scene.layout;
  27 
  28 import javafx.geometry.Insets;
  29 import static org.junit.Assert.*;
  30 import javafx.geometry.Orientation;
  31 import org.junit.Before;
  32 import org.junit.Ignore;
  33 
  34 import org.junit.Test;
  35 
  36 
  37 public class BorderPaneTest {
  38 
  39     BorderPane borderpane;
  40 
  41     @Before public void setUp() {
  42         this.borderpane = new BorderPane();
  43     }
  44 
  45     @Test public void testEmptyBorderPane() {
  46         assertNull(borderpane.getTop());
  47         assertNull(borderpane.getCenter());
  48         assertNull(borderpane.getBottom());
  49         assertNull(borderpane.getLeft());
  50         assertNull(borderpane.getRight());
  51     }
  52 
  53     @Test public void testChildrenRemovedDirectly() {
  54         MockResizable node = new MockResizable(10,20, 100,200, 700,800);
  55 
  56         borderpane.setCenter(node);
  57         assertSame(node, borderpane.getCenter());
  58         assertNull(borderpane.getLeft());
  59         assertNull(borderpane.getRight());
  60         assertNull(borderpane.getBottom());
  61         assertNull(borderpane.getTop());
  62 
  63         borderpane.autosize();
  64         borderpane.layout();
  65         assertEquals(0, node.getLayoutX(), 1e-100);
  66         assertEquals(0, node.getLayoutY(), 1e-100);
  67         assertEquals(100, node.getWidth(), 1e-100);
  68         assertEquals(200, node.getHeight(), 1e-100);
  69 
  70         borderpane.getChildren().remove(node);
  71         assertNull(borderpane.getCenter());
  72 
  73         borderpane.setLeft(node);
  74         assertNull(borderpane.getCenter());
  75         assertSame(node, borderpane.getLeft());
  76         assertNull(borderpane.getRight());
  77         assertNull(borderpane.getBottom());
  78         assertNull(borderpane.getTop());
  79 
  80         borderpane.autosize();
  81         borderpane.layout();
  82         assertEquals(0, node.getLayoutX(), 1e-100);
  83         assertEquals(0, node.getLayoutY(), 1e-100);
  84         assertEquals(100, node.getWidth(), 1e-100);
  85         assertEquals(200, node.getHeight(), 1e-100);
  86 
  87         borderpane.getChildren().remove(node);
  88         assertNull(borderpane.getLeft());
  89 
  90         borderpane.setRight(node);
  91         assertNull(borderpane.getCenter());
  92         assertNull(borderpane.getLeft());
  93         assertSame(node, borderpane.getRight());
  94         assertNull(borderpane.getBottom());
  95         assertNull(borderpane.getTop());
  96 
  97         borderpane.autosize();
  98         borderpane.layout();
  99         assertEquals(0, node.getLayoutX(), 1e-100);
 100         assertEquals(0, node.getLayoutY(), 1e-100);
 101         assertEquals(100, node.getWidth(), 1e-100);
 102         assertEquals(200, node.getHeight(), 1e-100);
 103 
 104         borderpane.getChildren().remove(node);
 105         assertNull(borderpane.getRight());
 106 
 107         borderpane.setBottom(node);
 108         assertNull(borderpane.getCenter());
 109         assertNull(borderpane.getLeft());
 110         assertNull(borderpane.getRight());
 111         assertSame(node, borderpane.getBottom());
 112         assertNull(borderpane.getTop());
 113 
 114         borderpane.autosize();
 115         borderpane.layout();
 116         assertEquals(0, node.getLayoutX(), 1e-100);
 117         assertEquals(0, node.getLayoutY(), 1e-100);
 118         assertEquals(100, node.getWidth(), 1e-100);
 119         assertEquals(200, node.getHeight(), 1e-100);
 120 
 121         borderpane.getChildren().remove(node);
 122         assertNull(borderpane.getBottom());
 123 
 124         borderpane.setTop(node);
 125         assertNull(borderpane.getCenter());
 126         assertNull(borderpane.getLeft());
 127         assertNull(borderpane.getRight());
 128         assertNull(borderpane.getBottom());
 129         assertSame(node, borderpane.getTop());
 130 
 131         borderpane.autosize();
 132         borderpane.layout();
 133         assertEquals(0, node.getLayoutX(), 1e-100);
 134         assertEquals(0, node.getLayoutY(), 1e-100);
 135         assertEquals(100, node.getWidth(), 1e-100);
 136         assertEquals(200, node.getHeight(), 1e-100);
 137 
 138         borderpane.getChildren().remove(node);
 139         assertNull(borderpane.getTop());
 140 
 141     }
 142 
 143     @Test public void testCenterChildOnly() {
 144         MockResizable center = new MockResizable(10,20, 100,200, 700,800);
 145         borderpane.setCenter(center);
 146 
 147         assertEquals(center, borderpane.getCenter());
 148         assertEquals(1, borderpane.getChildren().size());
 149         assertEquals(center, borderpane.getChildren().get(0));
 150         assertEquals(10, borderpane.minWidth(-1), 1e-100);
 151         assertEquals(20, borderpane.minHeight(-1), 1e-100);
 152         assertEquals(100, borderpane.prefWidth(-1), 1e-100);
 153         assertEquals(200, borderpane.prefHeight(-1), 1e-100);
 154         assertEquals(Double.MAX_VALUE, borderpane.maxWidth(-1), 1e-100);
 155         assertEquals(Double.MAX_VALUE, borderpane.maxHeight(-1), 1e-100);
 156 
 157         borderpane.autosize();
 158         borderpane.layout();
 159         assertEquals(0, center.getLayoutX(), 1e-100);
 160         assertEquals(0, center.getLayoutY(), 1e-100);
 161         assertEquals(100, center.getWidth(), 1e-100);
 162         assertEquals(200, center.getHeight(), 1e-100);
 163 
 164     }
 165 
 166     @Test public void testTopChildOnly() {
 167         MockResizable top = new MockResizable(10,20, 100,200, 700,800);
 168         borderpane.setTop(top);
 169 
 170         assertEquals(top, borderpane.getTop());
 171         assertEquals(1, borderpane.getChildren().size());
 172         assertEquals(top, borderpane.getChildren().get(0));
 173         assertEquals(10, borderpane.minWidth(-1), 1e-100);
 174         assertEquals(200, borderpane.minHeight(-1), 1e-100); // Top is always at it's pref height
 175         assertEquals(100, borderpane.prefWidth(-1), 1e-100);
 176         assertEquals(200, borderpane.prefHeight(-1), 1e-100);
 177         assertEquals(Double.MAX_VALUE, borderpane.maxWidth(-1), 1e-100);
 178         assertEquals(Double.MAX_VALUE, borderpane.maxHeight(-1), 1e-100);
 179 
 180         borderpane.autosize();
 181         borderpane.layout();
 182         assertEquals(0, top.getLayoutX(), 1e-100);
 183         assertEquals(0, top.getLayoutY(), 1e-100);
 184         assertEquals(100, top.getWidth(), 1e-100);
 185         assertEquals(200, top.getHeight(), 1e-100);
 186     }
 187 
 188     @Test public void testBottomChildOnly() {
 189         MockResizable bottom = new MockResizable(10,20, 100,200, 700,800);
 190         borderpane.setBottom(bottom);
 191 
 192         assertEquals(bottom, borderpane.getBottom());
 193         assertEquals(1, borderpane.getChildren().size());
 194         assertEquals(bottom, borderpane.getChildren().get(0));
 195         assertEquals(10, borderpane.minWidth(-1), 1e-100);
 196         assertEquals(200, borderpane.minHeight(-1), 1e-100);  // Bottom is always at it's pref height
 197         assertEquals(100, borderpane.prefWidth(-1), 1e-100);
 198         assertEquals(200, borderpane.prefHeight(-1), 1e-100);
 199         assertEquals(Double.MAX_VALUE, borderpane.maxWidth(-1), 1e-100);
 200         assertEquals(Double.MAX_VALUE, borderpane.maxHeight(-1), 1e-100);
 201 
 202         borderpane.autosize();
 203         borderpane.layout();
 204         assertEquals(0, bottom.getLayoutX(), 1e-100);
 205         assertEquals(0, bottom.getLayoutY(), 1e-100);
 206         assertEquals(100, bottom.getWidth(), 1e-100);
 207         assertEquals(200, bottom.getHeight(), 1e-100);
 208     }
 209 
 210     @Test public void testRightChildOnly() {
 211         MockResizable right = new MockResizable(10,20, 100,200, 700,800);
 212         borderpane.setRight(right);
 213 
 214         assertEquals(right, borderpane.getRight());
 215         assertEquals(1, borderpane.getChildren().size());
 216         assertEquals(right, borderpane.getChildren().get(0));
 217         assertEquals(100, borderpane.minWidth(-1), 1e-100);
 218         assertEquals(20, borderpane.minHeight(-1), 1e-100);
 219         assertEquals(100, borderpane.prefWidth(-1), 1e-100);
 220         assertEquals(200, borderpane.prefHeight(-1), 1e-100);
 221         assertEquals(Double.MAX_VALUE, borderpane.maxWidth(-1), 1e-100);
 222         assertEquals(Double.MAX_VALUE, borderpane.maxHeight(-1), 1e-100);
 223 
 224         borderpane.autosize();
 225         borderpane.layout();
 226         assertEquals(0, right.getLayoutX(), 1e-100);
 227         assertEquals(0, right.getLayoutY(), 1e-100);
 228         assertEquals(100, right.getWidth(), 1e-100);
 229         assertEquals(200, right.getHeight(), 1e-100);
 230     }
 231 
 232     @Test public void testLeftChildOnly() {
 233         MockResizable left = new MockResizable(10,20, 100,200, 700,800);
 234         borderpane.setLeft(left);
 235 
 236         assertEquals(left, borderpane.getLeft());
 237         assertEquals(1, borderpane.getChildren().size());
 238         assertEquals(left, borderpane.getChildren().get(0));
 239         assertEquals(100, borderpane.minWidth(-1), 1e-100);
 240         assertEquals(20, borderpane.minHeight(-1), 1e-100);
 241         assertEquals(100, borderpane.prefWidth(-1), 1e-100);
 242         assertEquals(200, borderpane.prefHeight(-1), 1e-100);
 243         assertEquals(Double.MAX_VALUE, borderpane.maxWidth(-1), 1e-100);
 244         assertEquals(Double.MAX_VALUE, borderpane.maxHeight(-1), 1e-100);
 245 
 246         borderpane.autosize();
 247         borderpane.layout();
 248         assertEquals(0, left.getLayoutX(), 1e-100);
 249         assertEquals(0, left.getLayoutY(), 1e-100);
 250         assertEquals(100, left.getWidth(), 1e-100);
 251         assertEquals(200, left.getHeight(), 1e-100);
 252     }
 253 
 254     @Test public void testChildrenInAllPositions() {
 255         MockResizable center = new MockResizable(10,20, 100,200, 1000,1000);
 256         borderpane.setCenter(center);
 257         MockResizable top = new MockResizable(100,10, 200, 20, 1000,1000);
 258         borderpane.setTop(top);
 259         MockResizable bottom = new MockResizable(80,8, 220,22, 1000,1000);
 260         borderpane.setBottom(bottom);
 261         MockResizable left = new MockResizable(10,100, 15,150, 1000,1000);
 262         borderpane.setLeft(left);
 263         MockResizable right = new MockResizable(50,115, 60,120, 1000,1000);
 264         borderpane.setRight(right);
 265 
 266         assertEquals(5, borderpane.getChildren().size());
 267         assertEquals(center, borderpane.getCenter());
 268         assertEquals(top, borderpane.getTop());
 269         assertEquals(bottom, borderpane.getBottom());
 270         assertEquals(left, borderpane.getLeft());
 271         assertEquals(right, borderpane.getRight());
 272         assertTrue(borderpane.getChildren().contains(center));
 273         assertTrue(borderpane.getChildren().contains(top));
 274         assertTrue(borderpane.getChildren().contains(bottom));
 275         assertTrue(borderpane.getChildren().contains(left));
 276         assertTrue(borderpane.getChildren().contains(right));
 277 
 278         assertEquals(100, borderpane.minWidth(-1), 1e-100);
 279         assertEquals(top.prefHeight(-1) + bottom.prefHeight(-1) +
 280                 Math.max(center.minHeight(-1), Math.max(left.minHeight(-1), right.minHeight(-1))),
 281                 borderpane.minHeight(-1), 1e-100);
 282         assertEquals(220, borderpane.prefWidth(-1), 1e-100);
 283         assertEquals(242, borderpane.prefHeight(-1), 1e-100);
 284         assertEquals(Double.MAX_VALUE, borderpane.maxWidth(-1), 1e-100);
 285         assertEquals(Double.MAX_VALUE, borderpane.maxHeight(-1), 1e-100);
 286 
 287         borderpane.autosize();
 288         borderpane.layout();
 289         assertEquals(0, top.getLayoutX(), 1e-100);
 290         assertEquals(0, top.getLayoutY(), 1e-100);
 291         assertEquals(220, top.getWidth(), 1e-100);
 292         assertEquals(20, top.getHeight(), 1e-100);
 293 
 294         assertEquals(0, left.getLayoutX(), 1e-100);
 295         assertEquals(20, left.getLayoutY(), 1e-100);
 296         assertEquals(15, left.getWidth(), 1e-100);
 297         assertEquals(200, left.getHeight(), 1e-100);
 298 
 299         assertEquals(15, center.getLayoutX(), 1e-100);
 300         assertEquals(20, center.getLayoutY(), 1e-100);
 301         assertEquals(145, center.getWidth(), 1e-100);
 302         assertEquals(200, center.getHeight(), 1e-100);
 303 
 304         assertEquals(160, right.getLayoutX(), 1e-100);
 305         assertEquals(20, right.getLayoutY(), 1e-100);
 306         assertEquals(60, right.getWidth(), 1e-100);
 307         assertEquals(200, right.getHeight(), 1e-100);
 308 
 309         assertEquals(0, bottom.getLayoutX(), 1e-100);
 310         assertEquals(220, bottom.getLayoutY(), 1e-100);
 311         assertEquals(220, bottom.getWidth(), 1e-100);
 312         assertEquals(22, bottom.getHeight(), 1e-100);
 313 
 314     }
 315 
 316     @Test public void testWithBiasedChildren() {
 317         MockBiased top = new MockBiased(Orientation.HORIZONTAL, 100, 20); // 300 x 6.666
 318         borderpane.setTop(top);
 319 
 320         MockBiased left = new MockBiased(Orientation.VERTICAL, 40, 100); // 20 x 200
 321         borderpane.setLeft(left);
 322 
 323         MockBiased center = new MockBiased(Orientation.HORIZONTAL, 200, 200);
 324         borderpane.setCenter(center);
 325 
 326         MockBiased right = new MockBiased(Orientation.VERTICAL, 60, 200); // 60 x 200
 327         borderpane.setRight(right);
 328 
 329         MockBiased bottom = new MockBiased(Orientation.HORIZONTAL, 200, 20); // 300 x 13.333
 330         borderpane.setBottom(bottom);
 331 
 332         assertEquals(40/*l*/ + 60/*r*/ + 200/*c*/, borderpane.prefWidth(-1), 1e-100);
 333         assertEquals(240 /* l + r + c*/, borderpane.prefHeight(-1), 1e-10);
 334         assertEquals(110, borderpane.minWidth(-1), 1e-100); /* min center + 2x pref width (l, r) */
 335         assertEquals(50, borderpane.minHeight(-1), 1e-10);
 336         assertEquals(110, borderpane.minWidth(240), 1e-100);
 337         assertEquals(221, borderpane.minHeight(300), 1e-10);
 338 
 339         borderpane.resize(300, 240);
 340         borderpane.layout();
 341 
 342         assertEquals(0, top.getLayoutX(), 1e-100);
 343         assertEquals(0, top.getLayoutY(), 1e-100);
 344         assertEquals(300, top.getWidth(), 1e-100);
 345         assertEquals(7, top.getHeight(), 1e-100);
 346 
 347         assertEquals(0, bottom.getLayoutX(), 1e-100);
 348         assertEquals(226, bottom.getLayoutY(), 1e-100);
 349         assertEquals(300, bottom.getWidth(), 1e-100);
 350         assertEquals(14, bottom.getHeight(), 1e-100);
 351 
 352         assertEquals(0, left.getLayoutX(), 1e-100);
 353         assertEquals(7, left.getLayoutY(), 1e-100);
 354         assertEquals(240 - 14 - 7, left.getHeight(), 1e-100);
 355         final double leftWidth = Math.ceil(40*100.0/(240 - 14 - 7));
 356         assertEquals(leftWidth, left.getWidth(), 1e-100);
 357 
 358         assertEquals(7, right.getLayoutY(), 1e-100);
 359         assertEquals(240 - 14 - 7, right.getHeight(), 1e-100);
 360         final double rightWidth = Math.ceil(60*200.0/(240 - 14 - 7));
 361         assertEquals(rightWidth, right.getWidth(), 1e-100);
 362         assertEquals(300 - rightWidth, right.getLayoutX(), 1e-100);
 363 
 364         // Center is HORIZONTALLY biased, so when width is stretched, height is lower
 365         double centerWidth = 300 - leftWidth - rightWidth;
 366         double centerHeight = Math.ceil(200 * 200 / centerWidth);
 367 
 368         assertEquals(19, center.getLayoutX(), 1e-100);
 369         // center alignment, Math.round == snapPosition
 370         assertEquals(Math.round(7 + (240 - 7 - 14 - centerHeight) / 2), center.getLayoutY(), 1e-100);
 371         assertEquals(centerWidth, center.getWidth(), 1e-100);
 372         assertEquals(centerHeight, center.getHeight(), 1e-100);
 373 
 374     }
 375 
 376     @Test public void testWithHorizontalBiasedChildrenAtPrefSize() {
 377         MockResizable top = new MockResizable(400, 100);
 378         borderpane.setTop(top);
 379 
 380         MockResizable left = new MockResizable(100, 100);
 381         borderpane.setLeft(left);
 382 
 383         MockBiased center = new MockBiased(Orientation.HORIZONTAL, 200, 100);
 384         borderpane.setCenter(center);
 385 
 386         MockResizable right = new MockResizable(100, 100);
 387         borderpane.setRight(right);
 388 
 389         MockResizable bottom = new MockResizable(400, 100);
 390         borderpane.setBottom(bottom);
 391 
 392         assertEquals(Orientation.HORIZONTAL, borderpane.getContentBias());
 393         assertEquals(400, borderpane.prefWidth(-1), 1e-200);
 394         assertEquals(300, borderpane.prefHeight(-1), 1e-200);
 395 
 396         borderpane.autosize();
 397         borderpane.layout();
 398 
 399         assertEquals(0, top.getLayoutX(), 1e-200);
 400         assertEquals(0, top.getLayoutY(), 1e-200);
 401         assertEquals(400, top.getLayoutBounds().getWidth(), 1e-200);
 402         assertEquals(100, top.getLayoutBounds().getHeight(), 1e-200);
 403 
 404         assertEquals(0, left.getLayoutX(), 1e-200);
 405         assertEquals(100, left.getLayoutY(), 1e-200);
 406         assertEquals(100, left.getLayoutBounds().getWidth(), 1e-200);
 407         assertEquals(100, left.getLayoutBounds().getHeight(), 1e-200);
 408 
 409         assertEquals(100, center.getLayoutX(), 1e-200);
 410         assertEquals(100, center.getLayoutY(), 1e-200);
 411         assertEquals(200, center.getLayoutBounds().getWidth(), 1e-200);
 412         assertEquals(100, center.getLayoutBounds().getHeight(), 1e-200);
 413 
 414         assertEquals(300, right.getLayoutX(), 1e-200);
 415         assertEquals(100, right.getLayoutY(), 1e-200);
 416         assertEquals(100, right.getLayoutBounds().getWidth(), 1e-200);
 417         assertEquals(100, right.getLayoutBounds().getHeight(), 1e-200);
 418 
 419         assertEquals(0, bottom.getLayoutX(), 1e-200);
 420         assertEquals(200, bottom.getLayoutY(), 1e-200);
 421         assertEquals(400, bottom.getLayoutBounds().getWidth(), 1e-200);
 422         assertEquals(100, bottom.getLayoutBounds().getHeight(), 1e-200);
 423     }
 424 
 425     @Test public void testWithHorizontalBiasedChildrenGrowing() {
 426         MockBiased top = new MockBiased(Orientation.HORIZONTAL, 200, 100);
 427         borderpane.setTop(top);
 428 
 429         MockResizable left = new MockResizable(100, 100);
 430         borderpane.setLeft(left);
 431 
 432         MockBiased center = new MockBiased(Orientation.HORIZONTAL, 200, 100);
 433         borderpane.setCenter(center);
 434 
 435         MockResizable right = new MockResizable(100, 100);
 436         borderpane.setRight(right);
 437 
 438         MockResizable bottom = new MockResizable(400, 100);
 439         borderpane.setBottom(bottom);
 440 
 441         assertEquals(240, borderpane.prefHeight(500), 1e-200);
 442         borderpane.resize(500, 240);
 443         borderpane.layout();
 444 
 445         assertEquals(0, top.getLayoutX(), 1e-200);
 446         assertEquals(0, top.getLayoutY(), 1e-200);
 447         assertEquals(500, top.getLayoutBounds().getWidth(), 1e-200);
 448         assertEquals(40, top.getLayoutBounds().getHeight(), 1e-200);
 449 
 450         assertEquals(0, left.getLayoutX(), 1e-200);
 451         assertEquals(40, left.getLayoutY(), 1e-200);
 452         assertEquals(100, left.getLayoutBounds().getWidth(), 1e-200);
 453         assertEquals(100, left.getLayoutBounds().getHeight(), 1e-200);
 454 
 455         assertEquals(100, center.getLayoutX(), 1e-200);
 456         // 57 because the default alignment is Pos.CENTER
 457         assertEquals(57, center.getLayoutY(), 1e-200);
 458         assertEquals(300, center.getLayoutBounds().getWidth(), 1e-200);
 459         assertEquals(67, center.getLayoutBounds().getHeight(), 1e-200);
 460 
 461         assertEquals(400, right.getLayoutX(), 1e-200);
 462         assertEquals(40, right.getLayoutY(), 1e-200);
 463         assertEquals(100, right.getLayoutBounds().getWidth(), 1e-200);
 464         assertEquals(100, right.getLayoutBounds().getHeight(), 1e-200);
 465 
 466         assertEquals(0, bottom.getLayoutX(), 1e-200);
 467         assertEquals(140, bottom.getLayoutY(), 1e-200);
 468         assertEquals(500, bottom.getLayoutBounds().getWidth(), 1e-200);
 469         assertEquals(100, bottom.getLayoutBounds().getHeight(), 1e-200);
 470     }
 471 
 472     @Test public void testWithHorizontalBiasedChildrenShrinking() {
 473         MockBiased top = new MockBiased(Orientation.HORIZONTAL, 200, 100);
 474         borderpane.setTop(top);
 475 
 476         MockResizable left = new MockResizable(100, 100);
 477         borderpane.setLeft(left);
 478 
 479         MockBiased center = new MockBiased(Orientation.HORIZONTAL, 200, 100);
 480         borderpane.setCenter(center);
 481 
 482         MockResizable right = new MockResizable(100, 100);
 483         borderpane.setRight(right);
 484 
 485         MockResizable bottom = new MockResizable(400, 100);
 486         borderpane.setBottom(bottom);
 487 
 488         assertEquals(367, borderpane.prefHeight(300), 1e-200);
 489         borderpane.resize(300, 367);
 490         borderpane.layout();
 491 
 492         assertEquals(0, top.getLayoutX(), 1e-200);
 493         assertEquals(0, top.getLayoutY(), 1e-200);
 494         assertEquals(300, top.getLayoutBounds().getWidth(), 1e-200);
 495         assertEquals(67, top.getLayoutBounds().getHeight(), 1e-200);
 496 
 497         assertEquals(0, left.getLayoutX(), 1e-200);
 498         assertEquals(67, left.getLayoutY(), 1e-200);
 499         assertEquals(100, left.getLayoutBounds().getWidth(), 1e-200);
 500         assertEquals(200, left.getLayoutBounds().getHeight(), 1e-200);
 501 
 502         assertEquals(100, center.getLayoutX(), 1e-200);
 503         assertEquals(67, center.getLayoutY(), 1e-200);
 504         assertEquals(100, center.getLayoutBounds().getWidth(), 1e-200);
 505         assertEquals(200, center.getLayoutBounds().getHeight(), 1e-200);
 506 
 507         assertEquals(200, right.getLayoutX(), 1e-200);
 508         assertEquals(67, right.getLayoutY(), 1e-200);
 509         assertEquals(100, right.getLayoutBounds().getWidth(), 1e-200);
 510         assertEquals(200, right.getLayoutBounds().getHeight(), 1e-200);
 511 
 512         assertEquals(0, bottom.getLayoutX(), 1e-200);
 513         assertEquals(267, bottom.getLayoutY(), 1e-200);
 514         assertEquals(300, bottom.getLayoutBounds().getWidth(), 1e-200);
 515         assertEquals(100, bottom.getLayoutBounds().getHeight(), 1e-200);
 516     }
 517 
 518     @Test public void testWithVerticalBiasedChildrenAtPrefSize() {
 519         MockResizable top = new MockResizable(400, 100);
 520         borderpane.setTop(top);
 521 
 522         MockResizable left = new MockResizable(100, 100);
 523         borderpane.setLeft(left);
 524 
 525         MockBiased center = new MockBiased(Orientation.VERTICAL, 200, 100);
 526         borderpane.setCenter(center);
 527 
 528         MockResizable right = new MockResizable(100, 100);
 529         borderpane.setRight(right);
 530 
 531         MockResizable bottom = new MockResizable(400, 100);
 532         borderpane.setBottom(bottom);
 533 
 534         assertEquals(Orientation.VERTICAL, borderpane.getContentBias());
 535         assertEquals(400, borderpane.prefWidth(-1), 1e-200);
 536         assertEquals(300, borderpane.prefHeight(-1), 1e-200);
 537 
 538         borderpane.autosize();
 539         borderpane.layout();
 540 
 541         assertEquals(0, top.getLayoutX(), 1e-200);
 542         assertEquals(0, top.getLayoutY(), 1e-200);
 543         assertEquals(400, top.getLayoutBounds().getWidth(), 1e-200);
 544         assertEquals(100, top.getLayoutBounds().getHeight(), 1e-200);
 545 
 546         assertEquals(0, left.getLayoutX(), 1e-200);
 547         assertEquals(100, left.getLayoutY(), 1e-200);
 548         assertEquals(100, left.getLayoutBounds().getWidth(), 1e-200);
 549         assertEquals(100, left.getLayoutBounds().getHeight(), 1e-200);
 550 
 551         assertEquals(100, center.getLayoutX(), 1e-200);
 552         assertEquals(100, center.getLayoutY(), 1e-200);
 553         assertEquals(200, center.getLayoutBounds().getWidth(), 1e-200);
 554         assertEquals(100, center.getLayoutBounds().getHeight(), 1e-200);
 555 
 556         assertEquals(300, right.getLayoutX(), 1e-200);
 557         assertEquals(100, right.getLayoutY(), 1e-200);
 558         assertEquals(100, right.getLayoutBounds().getWidth(), 1e-200);
 559         assertEquals(100, right.getLayoutBounds().getHeight(), 1e-200);
 560 
 561         assertEquals(0, bottom.getLayoutX(), 1e-200);
 562         assertEquals(200, bottom.getLayoutY(), 1e-200);
 563         assertEquals(400, bottom.getLayoutBounds().getWidth(), 1e-200);
 564         assertEquals(100, bottom.getLayoutBounds().getHeight(), 1e-200);
 565     }
 566 
 567     @Test public void testWithVerticalBiasedChildrenGrowing() {
 568         MockBiased top = new MockBiased(Orientation.VERTICAL, 200, 100);
 569         borderpane.setTop(top);
 570 
 571         MockResizable left = new MockResizable(100, 100);
 572         borderpane.setLeft(left);
 573 
 574         MockBiased center = new MockBiased(Orientation.VERTICAL, 200, 100);
 575         borderpane.setCenter(center);
 576 
 577         MockResizable right = new MockResizable(100, 100);
 578         borderpane.setRight(right);
 579 
 580         MockResizable bottom = new MockResizable(400, 100);
 581         borderpane.setBottom(bottom);
 582 
 583         assertEquals(400, borderpane.prefWidth(500), 1e-200);
 584         borderpane.resize(400, 500);
 585         borderpane.layout();
 586 
 587         assertEquals(0, top.getLayoutX(), 1e-200);
 588         assertEquals(0, top.getLayoutY(), 1e-200);
 589         assertEquals(200, top.getLayoutBounds().getWidth(), 1e-200);
 590         assertEquals(100, top.getLayoutBounds().getHeight(), 1e-200);
 591 
 592         assertEquals(0, left.getLayoutX(), 1e-200);
 593         assertEquals(100, left.getLayoutY(), 1e-200);
 594         assertEquals(100, left.getLayoutBounds().getWidth(), 1e-200);
 595         assertEquals(300, left.getLayoutBounds().getHeight(), 1e-200); // 500 - 100(top) - 100 (bottom)
 596 
 597         // not growing to max width, because the bias is vertical (pref width depends on height) and
 598         // the default alignment is Pos.CENTER
 599         double centerWidth = Math.round((200 * 100) /*original area*/ / 300.0) /*new height*/;
 600         assertEquals(100 /*x position == left width*/ + centerWidth,
 601                 center.getLayoutX(), 1e-200);
 602         assertEquals(100, center.getLayoutY(), 1e-200);
 603         assertEquals(centerWidth, center.getLayoutBounds().getWidth(), 1e-200);
 604         assertEquals(300, center.getLayoutBounds().getHeight(), 1e-200);
 605 
 606         assertEquals(300, right.getLayoutX(), 1e-200);
 607         assertEquals(100, right.getLayoutY(), 1e-200);
 608         assertEquals(100, right.getLayoutBounds().getWidth(), 1e-200);
 609         assertEquals(300, right.getLayoutBounds().getHeight(), 1e-200);
 610 
 611         assertEquals(0, bottom.getLayoutX(), 1e-200);
 612         assertEquals(400, bottom.getLayoutY(), 1e-200);
 613         assertEquals(400, bottom.getLayoutBounds().getWidth(), 1e-200);
 614         assertEquals(100, bottom.getLayoutBounds().getHeight(), 1e-200);
 615     }
 616 
 617     @Test public void testWithVerticalBiasedChildrenShrinking() {
 618         MockBiased top = new MockBiased(Orientation.VERTICAL, 200, 100);
 619         borderpane.setTop(top);
 620 
 621         MockResizable left = new MockResizable(100, 100);
 622         borderpane.setLeft(left);
 623 
 624         MockBiased center = new MockBiased(Orientation.VERTICAL, 200, 100);
 625         borderpane.setCenter(center);
 626 
 627         MockResizable right = new MockResizable(100, 100);
 628         borderpane.setRight(right);
 629 
 630         MockResizable bottom = new MockResizable(400, 100);
 631         borderpane.setBottom(bottom);
 632 
 633         // The total pref height of top + (l c r) + bottom is 300
 634         // Shrinking this to 250 will lead to shrinking the center to 50
 635         // which means center pref width will grow to 200 * 100 / 50 = 400
 636         // (l, r) prefwidth is 100, which means 100 + 200 + 100 = 600,
 637         // bottom prefwidth is 400
 638         assertEquals(600, borderpane.prefWidth(250), 1e-200);
 639         borderpane.resize(600, 250);
 640         borderpane.layout();
 641 
 642         assertEquals(0, top.getLayoutX(), 1e-200);
 643         assertEquals(0, top.getLayoutY(), 1e-200);
 644         assertEquals(200, top.getLayoutBounds().getWidth(), 1e-200);
 645         assertEquals(100, top.getLayoutBounds().getHeight(), 1e-200);
 646 
 647         assertEquals(0, left.getLayoutX(), 1e-200);
 648         assertEquals(100, left.getLayoutY(), 1e-200);
 649         assertEquals(100, left.getLayoutBounds().getWidth(), 1e-200);
 650         assertEquals(50, left.getLayoutBounds().getHeight(), 1e-200);
 651 
 652         assertEquals(100, center.getLayoutX(), 1e-200);
 653         assertEquals(100, center.getLayoutY(), 1e-200);
 654         assertEquals(400, center.getLayoutBounds().getWidth(), 1e-200);
 655         assertEquals(50, center.getLayoutBounds().getHeight(), 1e-200);
 656 
 657         assertEquals(500, right.getLayoutX(), 1e-200);
 658         assertEquals(100, right.getLayoutY(), 1e-200);
 659         assertEquals(100, right.getLayoutBounds().getWidth(), 1e-200);
 660         assertEquals(50, right.getLayoutBounds().getHeight(), 1e-200);
 661 
 662         assertEquals(0, bottom.getLayoutX(), 1e-200);
 663         assertEquals(150, bottom.getLayoutY(), 1e-200);
 664         assertEquals(600, bottom.getLayoutBounds().getWidth(), 1e-200);
 665         assertEquals(100, bottom.getLayoutBounds().getHeight(), 1e-200);
 666 
 667 
 668         // Now make it a little wider (center should be in the middle now)
 669         borderpane.resize(700, 250);
 670         borderpane.layout();
 671 
 672         assertEquals(0, top.getLayoutX(), 1e-200);
 673         assertEquals(0, top.getLayoutY(), 1e-200);
 674         assertEquals(200, top.getLayoutBounds().getWidth(), 1e-200);
 675         assertEquals(100, top.getLayoutBounds().getHeight(), 1e-200);
 676 
 677         assertEquals(0, left.getLayoutX(), 1e-200);
 678         assertEquals(100, left.getLayoutY(), 1e-200);
 679         assertEquals(100, left.getLayoutBounds().getWidth(), 1e-200);
 680         assertEquals(50, left.getLayoutBounds().getHeight(), 1e-200);
 681 
 682         assertEquals(150, center.getLayoutX(), 1e-200);
 683         assertEquals(100, center.getLayoutY(), 1e-200);
 684         assertEquals(400, center.getLayoutBounds().getWidth(), 1e-200);
 685         assertEquals(50, center.getLayoutBounds().getHeight(), 1e-200);
 686 
 687         assertEquals(600, right.getLayoutX(), 1e-200);
 688         assertEquals(100, right.getLayoutY(), 1e-200);
 689         assertEquals(100, right.getLayoutBounds().getWidth(), 1e-200);
 690         assertEquals(50, right.getLayoutBounds().getHeight(), 1e-200);
 691 
 692         assertEquals(0, bottom.getLayoutX(), 1e-200);
 693         assertEquals(150, bottom.getLayoutY(), 1e-200);
 694         assertEquals(700, bottom.getLayoutBounds().getWidth(), 1e-200);
 695         assertEquals(100, bottom.getLayoutBounds().getHeight(), 1e-200);
 696     }
 697 
 698     @Test public void testFitsTopChildWithinBounds() {
 699         MockResizable child = new MockResizable(10,20, 100,200, 700,800);
 700         borderpane.setTop(child);
 701 
 702         borderpane.resize(50,50);
 703         borderpane.layout();
 704 
 705         assertEquals(50, child.getWidth(), 1e-100);
 706         assertEquals(200, child.getHeight(), 1e-100); //Top always at it's pref height
 707     }
 708 
 709     @Test public void testFitsBottomChildWithinBounds() {
 710         MockResizable child = new MockResizable(10,20, 100,200, 700,800);
 711         borderpane.setBottom(child);
 712 
 713         borderpane.resize(50,50);
 714         borderpane.layout();
 715 
 716         assertEquals(50, child.getWidth(), 1e-100);
 717         assertEquals(200, child.getHeight(), 1e-100); //Bottom always at it's pref height
 718     }
 719 
 720     @Test public void testFitsLeftChildWithinBounds() {
 721         MockResizable child = new MockResizable(10,20, 100,200, 700,800);
 722         borderpane.setLeft(child);
 723 
 724         borderpane.resize(50,50);
 725         borderpane.layout();
 726 
 727         assertEquals(100, child.getWidth(), 1e-100); //Left always at it's pref width
 728         assertEquals(50, child.getHeight(), 1e-100);
 729     }
 730 
 731     @Test public void testFitsRightChildWithinBounds() {
 732         MockResizable child = new MockResizable(10,20, 100,200, 700,800);
 733         borderpane.setRight(child);
 734 
 735         borderpane.resize(50,50);
 736         borderpane.layout();
 737 
 738         assertEquals(100, child.getWidth(), 1e-100); //Right always at it's pref width
 739         assertEquals(50, child.getHeight(), 1e-100);
 740     }
 741 
 742     @Test public void testFitsCenterChildWithinBounds() {
 743         MockResizable child = new MockResizable(10,20, 100,200, 700,800);
 744         borderpane.setCenter(child);
 745 
 746         borderpane.resize(50,50);
 747         borderpane.layout();
 748 
 749         assertEquals(50, child.getWidth(), 1e-100);
 750         assertEquals(50, child.getHeight(), 1e-100);
 751     }
 752 
 753     @Test public void testFitsAllChildrenWithinBounds() {
 754         MockResizable top = new MockResizable(10,20, 200,100, 700,800);
 755         MockResizable bottom = new MockResizable(10,20, 200,100, 700,800);
 756         MockResizable left = new MockResizable(10,20, 100,200, 700,800);
 757         MockResizable right = new MockResizable(10,20, 100,200, 700,800);
 758         MockResizable center = new MockResizable(10,20, 200,200, 700,800);
 759 
 760         borderpane.setTop(top);
 761         borderpane.setBottom(bottom);
 762         borderpane.setLeft(left);
 763         borderpane.setRight(right);
 764         borderpane.setCenter(center);
 765 
 766         borderpane.resize(300,300);
 767         borderpane.layout();
 768 
 769         assertEquals(300, top.getWidth(), 1e-100);
 770         assertEquals(100, top.getHeight(), 1e-100);
 771         assertEquals(0,   top.getLayoutX(), 1e-100);
 772         assertEquals(0,   top.getLayoutY(), 1e-100);
 773         assertEquals(300, bottom.getWidth(), 1e-100);
 774         assertEquals(100, bottom.getHeight(), 1e-100);
 775         assertEquals(0,   bottom.getLayoutX(), 1e-100);
 776         assertEquals(200, bottom.getLayoutY(), 1e-100);
 777         assertEquals(100, left.getWidth(), 1e-100);
 778         assertEquals(100, left.getHeight(), 1e-100);
 779         assertEquals(0,   left.getLayoutX(), 1e-100);
 780         assertEquals(100, left.getLayoutY(), 1e-100);
 781         assertEquals(100, right.getWidth(), 1e-100);
 782         assertEquals(100, right.getHeight(), 1e-100);
 783         assertEquals(200, right.getLayoutX(), 1e-100);
 784         assertEquals(100, right.getLayoutY(), 1e-100);
 785         assertEquals(100, center.getWidth(), 1e-100);
 786         assertEquals(100, center.getHeight(), 1e-100);
 787         assertEquals(100, center.getLayoutX(), 1e-100);
 788         assertEquals(100, center.getLayoutY(), 1e-100);
 789     }
 790 
 791     @Test public void testTopChildWithMargin() {
 792         MockResizable top = new MockResizable(10,10,130,30,150,50);
 793         MockResizable center = new MockResizable(10,10,100,100,200,200);
 794         Insets insets = new Insets(10, 5, 20, 30);
 795         BorderPane.setMargin(top, insets);
 796         borderpane.setTop(top);
 797         borderpane.setCenter(center);
 798 
 799         assertEquals(45, borderpane.minWidth(-1), 1e-100);
 800         // 10 + 20 (margin) + 30 (top.prefHeight) + 10 (center.minHeight)
 801         // Top is always at it's pref height
 802         assertEquals(70, borderpane.minHeight(-1), 1e-100);
 803         assertEquals(165, borderpane.prefWidth(-1), 1e-100);
 804         assertEquals(160, borderpane.prefHeight(-1), 1e-100);
 805         assertEquals(Double.MAX_VALUE, borderpane.maxWidth(-1), 1e-100);
 806         assertEquals(Double.MAX_VALUE, borderpane.maxHeight(-1), 1e-100);
 807 
 808         borderpane.autosize();
 809         borderpane.layout();
 810         assertEquals(30, top.getLayoutX(), 1e-100);
 811         assertEquals(10, top.getLayoutY(), 1e-100);
 812         assertEquals(130, top.getWidth(), 1e-100);
 813         assertEquals(30, top.getHeight(), 1e-100);
 814 
 815         assertEquals(0, center.getLayoutX(), 1e-100);
 816         assertEquals(60, center.getLayoutY(), 1e-100);
 817     }
 818 
 819     @Test public void testBottomChildWithMargin() {
 820         MockResizable bottom = new MockResizable(10,10,130,30,150,50);
 821         MockResizable center = new MockResizable(10,10,100,100,200,200);
 822         Insets insets = new Insets(10, 5, 20, 30);
 823         BorderPane.setMargin(bottom, insets);
 824         borderpane.setBottom(bottom);
 825         borderpane.setCenter(center);
 826 
 827         assertEquals(45, borderpane.minWidth(-1), 1e-100);
 828         assertEquals(70, borderpane.minHeight(-1), 1e-100);
 829         assertEquals(165, borderpane.prefWidth(-1), 1e-100);
 830         assertEquals(160, borderpane.prefHeight(-1), 1e-100);
 831         assertEquals(Double.MAX_VALUE, borderpane.maxWidth(-1), 1e-100);
 832         assertEquals(Double.MAX_VALUE, borderpane.maxHeight(-1), 1e-100);
 833 
 834         borderpane.autosize();
 835         borderpane.layout();
 836         assertEquals(30, bottom.getLayoutX(), 1e-100);
 837         assertEquals(110, bottom.getLayoutY(), 1e-100);
 838         assertEquals(130, bottom.getWidth(), 1e-100);
 839         assertEquals(30, bottom.getHeight(), 1e-100);
 840 
 841         assertEquals(0, center.getLayoutX(), 1e-100);
 842         assertEquals(0, center.getLayoutY(), 1e-100);
 843     }
 844 
 845     @Test public void testLeftChildWithMargin() {
 846         MockResizable left = new MockResizable(10,10,130,130,150,150);
 847         MockResizable center = new MockResizable(10,10,100,100,200,200);
 848         Insets insets = new Insets(5, 10, 30, 20);
 849         BorderPane.setMargin(left, insets);
 850         borderpane.setLeft(left);
 851         borderpane.setCenter(center);
 852 
 853         assertEquals(45, borderpane.minHeight(-1), 1e-100);
 854         assertEquals(170, borderpane.minWidth(-1), 1e-100);
 855         assertEquals(165, borderpane.prefHeight(-1), 1e-100);
 856         assertEquals(260, borderpane.prefWidth(-1), 1e-100);
 857         assertEquals(Double.MAX_VALUE, borderpane.maxWidth(-1), 1e-100);
 858         assertEquals(Double.MAX_VALUE, borderpane.maxHeight(-1), 1e-100);
 859 
 860         borderpane.autosize();
 861         borderpane.layout();
 862         assertEquals(20, left.getLayoutX(), 1e-100);
 863         assertEquals(5, left.getLayoutY(), 1e-100);
 864         assertEquals(130, left.getWidth(), 1e-100);
 865         assertEquals(130, left.getHeight(), 1e-100);
 866 
 867         assertEquals(160, center.getLayoutX(), 1e-100);
 868         assertEquals(0, center.getLayoutY(), 1e-100);
 869     }
 870 
 871     @Test public void testRightChildWithMargin() {
 872         MockResizable right = new MockResizable(10,10,130,130,150,150);
 873         MockResizable center = new MockResizable(10,10,100,100,200,200);
 874         Insets insets = new Insets(5, 10, 30, 20);
 875         BorderPane.setMargin(right, insets);
 876         borderpane.setRight(right);
 877         borderpane.setCenter(center);
 878 
 879         assertEquals(45, borderpane.minHeight(-1), 1e-100);
 880         assertEquals(170, borderpane.minWidth(-1), 1e-100);
 881         assertEquals(165, borderpane.prefHeight(-1), 1e-100);
 882         assertEquals(260, borderpane.prefWidth(-1), 1e-100);
 883         assertEquals(Double.MAX_VALUE, borderpane.maxWidth(-1), 1e-100);
 884         assertEquals(Double.MAX_VALUE, borderpane.maxHeight(-1), 1e-100);
 885 
 886         borderpane.autosize();
 887         borderpane.layout();
 888         assertEquals(120, right.getLayoutX(), 1e-100);
 889         assertEquals(5, right.getLayoutY(), 1e-100);
 890         assertEquals(130, right.getWidth(), 1e-100);
 891         assertEquals(130, right.getHeight(), 1e-100);
 892 
 893         assertEquals(0, center.getLayoutX(), 1e-100);
 894         assertEquals(0, center.getLayoutY(), 1e-100);
 895     }
 896 
 897     @Test public void testCenterChildWithMargin() {
 898         MockResizable center = new MockResizable(10,10,100,100,200,200);
 899         Insets insets = new Insets(5, 10, 30, 20);
 900         BorderPane.setMargin(center, insets);
 901         borderpane.setCenter(center);
 902 
 903         assertEquals(45, borderpane.minHeight(-1), 1e-100);
 904         assertEquals(40, borderpane.minWidth(-1), 1e-100);
 905         assertEquals(135, borderpane.prefHeight(-1), 1e-100);
 906         assertEquals(130, borderpane.prefWidth(-1), 1e-100);
 907         assertEquals(Double.MAX_VALUE, borderpane.maxWidth(-1), 1e-100);
 908         assertEquals(Double.MAX_VALUE, borderpane.maxHeight(-1), 1e-100);
 909 
 910         borderpane.autosize();
 911         borderpane.layout();
 912 
 913         assertEquals(20, center.getLayoutX(), 1e-100);
 914         assertEquals(5, center.getLayoutY(), 1e-100);
 915     }
 916 
 917     @Test
 918     public void testResizeBelowMinimum() {
 919         MockResizable left = new MockResizable(10,10,100,100,150,150);
 920         MockResizable center = new MockResizable(30,30,100,100,200,200);
 921 
 922         borderpane.setCenter(center);
 923         borderpane.setLeft(left);
 924 
 925         borderpane.resize(30, 30);
 926 
 927         borderpane.layout();
 928 
 929         assertEquals(100, left.getWidth(), 1e-100); // Always at pref.
 930         assertEquals(30, left.getHeight(), 1e-100);
 931 
 932         assertEquals(100, center.getLayoutX(), 1e-100);
 933         assertEquals(0, center.getLayoutY(), 1e-100);
 934         assertEquals(30, center.getWidth(), 1e-100);
 935         assertEquals(30, center.getHeight(), 1e-100);
 936     }
 937 
 938 }