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 }