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;
  27 
  28 import com.sun.javafx.FXUnit;
  29 import com.sun.javafx.pgstub.StubToolkit;
  30 import com.sun.javafx.sg.prism.NGGroup;
  31 import com.sun.javafx.tk.Toolkit;
  32 import javafx.scene.shape.Rectangle;
  33 import javafx.stage.Stage;
  34 import org.junit.Before;
  35 import org.junit.Rule;
  36 import org.junit.Test;
  37 
  38 import static org.junit.Assert.*;
  39 
  40 /**
  41  * Tests to make sure the synchronization of children between a Parent and PGGroup
  42  * works as expected.
  43  */
  44 public class Parent_structure_sync_Test {
  45 
  46     @Rule
  47     public FXUnit fx = new FXUnit();
  48 
  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         parent.getChildren().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         parent.getChildren().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         parent.getChildren().addAll(r2, r3, r4);
  96         sync();
  97         parent.getChildren().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         parent.getChildren().addAll(r1, r2, r3);
 108         sync();
 109         parent.getChildren().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         parent.getChildren().addAll(r1, r2, r4);
 120         sync();
 121         parent.getChildren().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         parent.getChildren().addAll(r1, r2, r3, r4);
 132         sync();
 133         parent.getChildren().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         parent.getChildren().addAll(r4, r1, r2, r3);
 143         sync();
 144         parent.getChildren().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         parent.getChildren().addAll(r1, r2, r4, r3);
 154         sync();
 155         parent.getChildren().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         parent.getChildren().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         parent.getChildren().addAll(r4, r1, r2, r3);
 177         sync();
 178         r4.toFront();
 179         parent.getChildren().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         parent.getChildren().addAll(r3, r1, r4, r2);
 191         sync();
 192         r3.toFront();
 193         parent.getChildren().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         parent.getChildren().addAll(r4, r1, r2, r3);
 203         sync();
 204         r4.toFront();
 205         parent.getChildren().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         parent.getChildren().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         parent.getChildren().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         parent.getChildren().addAll(r1, r2, r4, r3);
 239         sync();
 240         r4.toFront();
 241         parent.getChildren().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         parent.getChildren().addAll(r1, r2, r3, r4);
 253         sync();
 254         r3.toFront();
 255         parent.getChildren().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         parent.getChildren().addAll(r1, r2, r4, r3);
 265         sync();
 266         r4.toFront();
 267         parent.getChildren().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         parent.getChildren().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         parent.getChildren().addAll(r2, r3, r4, r1);
 289         sync();
 290         r1.toBack();
 291         parent.getChildren().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         parent.getChildren().addAll(r2, r3, r4, r1);
 303         sync();
 304         r1.toBack();
 305         parent.getChildren().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         parent.getChildren().addAll(r1, r2, r3, r4);
 315         sync();
 316         r4.toBack();
 317         parent.getChildren().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 }