1 /*
   2  * Copyright (c) 2011, 2015, 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;
  27 
  28 import test.com.sun.javafx.pgstub.StubToolkit;
  29 import com.sun.javafx.sg.prism.NGGroup;
  30 import com.sun.javafx.tk.Toolkit;
  31 import java.util.List;
  32 import javafx.scene.Group;
  33 import javafx.scene.Parent;
  34 import javafx.scene.ParentShim;
  35 import javafx.scene.Scene;
  36 import javafx.scene.layout.BorderPane;
  37 import javafx.scene.shape.Rectangle;
  38 import javafx.stage.Stage;
  39 import org.junit.Before;
  40 import org.junit.Test;
  41 
  42 import static org.junit.Assert.*;
  43 
  44 /**
  45  * Tests to make sure the synchronization of children between a Parent and PGGroup
  46  * works as expected.
  47  */
  48 public class Parent_structure_sync_Test {
  49     private Rectangle r1, r2, r3, r4, r5;
  50     private Parent parent;
  51     private NGGroup peer;
  52     
  53     @Before public void setup() {
  54         parent = new Group();
  55         r1 = new Rectangle(0, 0, 10, 10);
  56         r2 = new Rectangle(0, 0, 10, 10);
  57         r3 = new Rectangle(0, 0, 10, 10);
  58         r4 = new Rectangle(0, 0, 10, 10);
  59         r5 = new Rectangle(0, 0, 10, 10);
  60         peer = parent.impl_getPeer();
  61 
  62         Scene scene = new Scene(parent);
  63         Stage stage = new Stage();
  64         stage.setScene(scene);
  65         stage.show();
  66 
  67         sync();
  68     }
  69     
  70     private void sync() {
  71         ((StubToolkit) Toolkit.getToolkit()).firePulse();
  72     }
  73     
  74     @Test public void emptyParentShouldHaveEmptyPGGroup() {
  75         assertTrue(peer.getChildren().isEmpty());
  76     }
  77     
  78     @Test public void childAddedToEmptyParentShouldBeInPGGroup() {
  79         ParentShim.getChildren(parent).add(r1);
  80         sync();
  81         assertEquals(1, peer.getChildren().size());
  82         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
  83     }
  84     
  85     @Test public void childrenAddedToEmptyParentShouldAllBeInPGGroup() {
  86         ParentShim.getChildren(parent).addAll(r1, r2, r3);
  87         sync();
  88         assertEquals(3, peer.getChildren().size());
  89         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
  90         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
  91         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
  92     }
  93     
  94     @Test public void addingAChildToTheBack() {
  95         ParentShim.getChildren(parent).addAll(r2, r3, r4);
  96         sync();
  97         ParentShim.getChildren(parent).add(0, r1);
  98         sync();
  99         assertEquals(4, peer.getChildren().size());
 100         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 101         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 102         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 103         assertSame(r4.impl_getPeer(), peer.getChildren().get(3));
 104     }
 105 
 106     @Test public void addingAChildToTheFront() {
 107         ParentShim.getChildren(parent).addAll(r1, r2, r3);
 108         sync();
 109         ParentShim.getChildren(parent).add(r4);
 110         sync();
 111         assertEquals(4, peer.getChildren().size());
 112         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 113         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 114         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 115         assertSame(r4.impl_getPeer(), peer.getChildren().get(3));
 116     }
 117     
 118     @Test public void addingAChildToTheCenter() {
 119         ParentShim.getChildren(parent).addAll(r1, r2, r4);
 120         sync();
 121         ParentShim.getChildren(parent).add(2, r3);
 122         sync();
 123         assertEquals(4, peer.getChildren().size());
 124         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 125         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 126         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 127         assertSame(r4.impl_getPeer(), peer.getChildren().get(3));
 128     }
 129     
 130     @Test public void removingAChildFromTheFront() {
 131         ParentShim.getChildren(parent).addAll(r1, r2, r3, r4);
 132         sync();
 133         ParentShim.getChildren(parent).remove(3);
 134         sync();
 135         assertEquals(3, peer.getChildren().size());
 136         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 137         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 138         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 139     }
 140     
 141     @Test public void removingAChildFromTheBack() {
 142         ParentShim.getChildren(parent).addAll(r4, r1, r2, r3);
 143         sync();
 144         ParentShim.getChildren(parent).remove(0);
 145         sync();
 146         assertEquals(3, peer.getChildren().size());
 147         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 148         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 149         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 150     }
 151     
 152     @Test public void removingAChildFromTheCenter() {
 153         ParentShim.getChildren(parent).addAll(r1, r2, r4, r3);
 154         sync();
 155         ParentShim.getChildren(parent).remove(2);
 156         sync();
 157         assertEquals(3, peer.getChildren().size());
 158         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 159         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 160         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 161     }
 162     
 163     @Test public void movingAChildFromTheBackToTheFront() {
 164         ParentShim.getChildren(parent).addAll(r4, r1, r2, r3);
 165         sync();
 166         r4.toFront();
 167         sync();
 168         assertEquals(4, peer.getChildren().size());
 169         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 170         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 171         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 172         assertSame(r4.impl_getPeer(), peer.getChildren().get(3));
 173     }
 174     
 175     @Test public void movingAChildFromTheBackToTheFrontAndAddingAChild() {
 176         ParentShim.getChildren(parent).addAll(r4, r1, r2, r3);
 177         sync();
 178         r4.toFront();
 179         ParentShim.getChildren(parent).add(r5);
 180         sync();
 181         assertEquals(5, peer.getChildren().size());
 182         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 183         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 184         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 185         assertSame(r4.impl_getPeer(), peer.getChildren().get(3));
 186         assertSame(r5.impl_getPeer(), peer.getChildren().get(4));
 187     }
 188     
 189     @Test public void movingAChildFromTheBackToTheFrontAndRemovingAChild() {
 190         ParentShim.getChildren(parent).addAll(r3, r1, r4, r2);
 191         sync();
 192         r3.toFront();
 193         ParentShim.getChildren(parent).remove(1);
 194         sync();
 195         assertEquals(3, peer.getChildren().size());
 196         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 197         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 198         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 199     }
 200     
 201     @Test public void movingAChildFromTheBackToTheFrontAndThenRemovingTheChild() {
 202         ParentShim.getChildren(parent).addAll(r4, r1, r2, r3);
 203         sync();
 204         r4.toFront();
 205         ParentShim.getChildren(parent).remove(3);
 206         sync();
 207         assertEquals(3, peer.getChildren().size());
 208         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 209         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 210         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 211     }
 212 
 213     @Test public void movingAChildFromTheCenterToTheFront() {
 214         ParentShim.getChildren(parent).addAll(r1, r2, r4, r3);
 215         sync();
 216         r4.toFront();
 217         sync();
 218         assertEquals(4, peer.getChildren().size());
 219         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 220         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 221         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 222         assertSame(r4.impl_getPeer(), peer.getChildren().get(3));
 223     }
 224     
 225     @Test public void movingAChildFromTheCenterToTheBack() {
 226         ParentShim.getChildren(parent).addAll(r2, r3, r1, r4);
 227         sync();
 228         r1.toBack();
 229         sync();
 230         assertEquals(4, peer.getChildren().size());
 231         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 232         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 233         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 234         assertSame(r4.impl_getPeer(), peer.getChildren().get(3));
 235     }
 236     
 237     @Test public void movingAChildFromTheCenterToTheFrontAndAddingAChild() {
 238         ParentShim.getChildren(parent).addAll(r1, r2, r4, r3);
 239         sync();
 240         r4.toFront();
 241         ParentShim.getChildren(parent).add(r5);
 242         sync();
 243         assertEquals(5, peer.getChildren().size());
 244         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 245         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 246         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 247         assertSame(r4.impl_getPeer(), peer.getChildren().get(3));
 248         assertSame(r5.impl_getPeer(), peer.getChildren().get(4));
 249     }
 250     
 251     @Test public void movingAChildFromTheCenterToTheFrontAndRemovingAChild() {
 252         ParentShim.getChildren(parent).addAll(r1, r2, r3, r4);
 253         sync();
 254         r3.toFront();
 255         ParentShim.getChildren(parent).remove(2);
 256         sync();
 257         assertEquals(3, peer.getChildren().size());
 258         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 259         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 260         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 261     }
 262     
 263     @Test public void movingAChildFromTheCenterToTheFrontAndThenRemovingTheChild() {
 264         ParentShim.getChildren(parent).addAll(r1, r2, r4, r3);
 265         sync();
 266         r4.toFront();
 267         ParentShim.getChildren(parent).remove(3);
 268         sync();
 269         assertEquals(3, peer.getChildren().size());
 270         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 271         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 272         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 273     }
 274 
 275     @Test public void movingAChildFromTheFrontToTheBack() {
 276         ParentShim.getChildren(parent).addAll(r2, r3, r4, r1);
 277         sync();
 278         r1.toBack();
 279         sync();
 280         assertEquals(4, peer.getChildren().size());
 281         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 282         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 283         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 284         assertSame(r4.impl_getPeer(), peer.getChildren().get(3));
 285     }
 286     
 287     @Test public void movingAChildFromTheFrontToTheBackAndAddingAChild() {
 288         ParentShim.getChildren(parent).addAll(r2, r3, r4, r1);
 289         sync();
 290         r1.toBack();
 291         ParentShim.getChildren(parent).add(r5);
 292         sync();
 293         assertEquals(5, peer.getChildren().size());
 294         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 295         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 296         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 297         assertSame(r4.impl_getPeer(), peer.getChildren().get(3));
 298         assertSame(r5.impl_getPeer(), peer.getChildren().get(4));
 299     }
 300     
 301     @Test public void movingAChildFromTheFrontToTheBackAndRemovingAChild() {
 302         ParentShim.getChildren(parent).addAll(r2, r3, r4, r1);
 303         sync();
 304         r1.toBack();
 305         ParentShim.getChildren(parent).remove(3);
 306         sync();
 307         assertEquals(3, peer.getChildren().size());
 308         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 309         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 310         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 311     }
 312     
 313     @Test public void movingAChildFromTheFrontToTheBackAndThenRemovingTheChild() {
 314         ParentShim.getChildren(parent).addAll(r1, r2, r3, r4);
 315         sync();
 316         r4.toBack();
 317         ParentShim.getChildren(parent).remove(0);
 318         sync();
 319         assertEquals(3, peer.getChildren().size());
 320         assertSame(r1.impl_getPeer(), peer.getChildren().get(0));
 321         assertSame(r2.impl_getPeer(), peer.getChildren().get(1));
 322         assertSame(r3.impl_getPeer(), peer.getChildren().get(2));
 323     }
 324 
 325     @Test
 326     public void validateParentsRemovedList() {
 327         Group parent2 = new Group();
 328         ParentShim.getChildren(parent2).addAll(r1, r2);
 329         ParentShim.getChildren(parent).add(parent2);
 330         sync();
 331         ParentShim.getChildren(parent2).remove(r1);
 332         assertNotNull(ParentShim.test_getRemoved(parent2));
 333         assertFalse(ParentShim.test_getRemoved(parent2).isEmpty());
 334         sync();
 335         assertTrue(ParentShim.test_getRemoved(parent2).isEmpty());
 336         ParentShim.getChildren(parent2).remove(r2);
 337         parent.setVisible(false);
 338         assertFalse(ParentShim.test_getRemoved(parent2).isEmpty());
 339         sync();
 340         assertTrue(ParentShim.test_getRemoved(parent2).isEmpty());
 341     }
 342 
 343     @Test
 344     public void validateParentsRemovedList2() {
 345         BorderPane borderPane = new BorderPane(r1);
 346         Group parent2 = new Group();
 347         ParentShim.getChildren(parent2).addAll(r2);
 348         ParentShim.getChildren(parent).add(parent2);
 349         sync();
 350         ParentShim.getChildren(parent2).remove(r2);
 351         borderPane.setCenter(null);
 352         assertNotNull(ParentShim.test_getRemoved(parent2));
 353         assertFalse(ParentShim.test_getRemoved(parent2).isEmpty());
 354         assertNotNull(ParentShim.test_getRemoved(borderPane));
 355         assertTrue(ParentShim.test_getRemoved(borderPane).isEmpty());
 356         sync();
 357         assertTrue(ParentShim.test_getRemoved(parent2).isEmpty());
 358         assertTrue(ParentShim.test_getRemoved(borderPane).isEmpty());        
 359     }
 360 
 361     @Test
 362     public void validateParentsRemovedList3() {
 363         BorderPane borderPane = new BorderPane(r1);
 364         parent.getScene().setRoot(borderPane);
 365         sync();
 366         borderPane.getScene().setRoot(parent);
 367         borderPane.setCenter(null);
 368         assertNotNull(ParentShim.test_getRemoved(borderPane));
 369         assertTrue(ParentShim.test_getRemoved(borderPane).isEmpty());
 370         sync();
 371         assertTrue(ParentShim.test_getRemoved(borderPane).isEmpty());
 372     }
 373 }