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