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.layout.BorderPane; 37 import javafx.scene.shape.Rectangle; 38 import javafx.stage.Stage; 39 import org.junit.Before; 40 import org.junit.Test; 41 42 import static org.junit.Assert.*; 43 44 /** 45 * Tests to make sure the synchronization of children between a Parent and PGGroup 46 * works as expected. 47 */ 48 public class Parent_structure_sync_Test { 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 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).addAll(r2, r3, r4); 96 sync(); 97 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).addAll(r1, r2, r3); 108 sync(); 109 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).addAll(r1, r2, r4); 120 sync(); 121 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).addAll(r1, r2, r3, r4); 132 sync(); 133 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).addAll(r4, r1, r2, r3); 143 sync(); 144 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).addAll(r1, r2, r4, r3); 154 sync(); 155 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).addAll(r4, r1, r2, r3); 177 sync(); 178 r4.toFront(); 179 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).addAll(r3, r1, r4, r2); 191 sync(); 192 r3.toFront(); 193 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).addAll(r4, r1, r2, r3); 203 sync(); 204 r4.toFront(); 205 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).addAll(r1, r2, r4, r3); 239 sync(); 240 r4.toFront(); 241 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).addAll(r1, r2, r3, r4); 253 sync(); 254 r3.toFront(); 255 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).addAll(r1, r2, r4, r3); 265 sync(); 266 r4.toFront(); 267 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).addAll(r2, r3, r4, r1); 289 sync(); 290 r1.toBack(); 291 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).addAll(r2, r3, r4, r1); 303 sync(); 304 r1.toBack(); 305 ParentShim.getChildren(parent).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 ParentShim.getChildren(parent).addAll(r1, r2, r3, r4); 315 sync(); 316 r4.toBack(); 317 ParentShim.getChildren(parent).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 325 @Test 326 public void validateParentsRemovedList() { 327 Group parent2 = new Group(); 328 ParentShim.getChildren(parent2).addAll(r1, r2); 329 ParentShim.getChildren(parent).add(parent2); 330 sync(); 331 ParentShim.getChildren(parent2).remove(r1); 332 assertNotNull(ParentShim.test_getRemoved(parent2)); 333 assertFalse(ParentShim.test_getRemoved(parent2).isEmpty()); 334 sync(); 335 assertTrue(ParentShim.test_getRemoved(parent2).isEmpty()); 336 ParentShim.getChildren(parent2).remove(r2); 337 parent.setVisible(false); 338 assertFalse(ParentShim.test_getRemoved(parent2).isEmpty()); 339 sync(); 340 assertTrue(ParentShim.test_getRemoved(parent2).isEmpty()); 341 } 342 343 @Test 344 public void validateParentsRemovedList2() { 345 BorderPane borderPane = new BorderPane(r1); 346 Group parent2 = new Group(); 347 ParentShim.getChildren(parent2).addAll(r2); 348 ParentShim.getChildren(parent).add(parent2); 349 sync(); 350 ParentShim.getChildren(parent2).remove(r2); 351 borderPane.setCenter(null); 352 assertNotNull(ParentShim.test_getRemoved(parent2)); 353 assertFalse(ParentShim.test_getRemoved(parent2).isEmpty()); 354 assertNotNull(ParentShim.test_getRemoved(borderPane)); 355 assertTrue(ParentShim.test_getRemoved(borderPane).isEmpty()); 356 sync(); 357 assertTrue(ParentShim.test_getRemoved(parent2).isEmpty()); 358 assertTrue(ParentShim.test_getRemoved(borderPane).isEmpty()); 359 } 360 361 @Test 362 public void validateParentsRemovedList3() { 363 BorderPane borderPane = new BorderPane(r1); 364 parent.getScene().setRoot(borderPane); 365 sync(); 366 borderPane.getScene().setRoot(parent); 367 borderPane.setCenter(null); 368 assertNotNull(ParentShim.test_getRemoved(borderPane)); 369 assertTrue(ParentShim.test_getRemoved(borderPane).isEmpty()); 370 sync(); 371 assertTrue(ParentShim.test_getRemoved(borderPane).isEmpty()); 372 } 373 }