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