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