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