1 /* 2 * Copyright (c) 2011, 2014, 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 package test.javafx.scene; 26 27 import javafx.stage.Stage; 28 import com.sun.javafx.sg.prism.NGCamera; 29 import com.sun.javafx.sg.prism.NGSubScene; 30 import com.sun.javafx.tk.Toolkit; 31 import javafx.application.Platform; 32 import javafx.scene.Camera; 33 import javafx.scene.Group; 34 import javafx.scene.NodeShim; 35 import javafx.scene.ParallelCamera; 36 import javafx.scene.PerspectiveCamera; 37 import javafx.scene.Scene; 38 import javafx.scene.SceneAntialiasing; 39 import javafx.scene.SubScene; 40 import javafx.scene.SubSceneShim; 41 import javafx.scene.layout.Pane; 42 import static org.junit.Assert.assertEquals; 43 import static org.junit.Assert.assertNull; 44 import org.junit.Test; 45 import static org.junit.Assert.assertTrue; 46 import static org.junit.Assert.fail; 47 48 public class SubSceneTest { 49 50 @Test 51 public void isOnFxAppThread() { 52 assertTrue(Platform.isFxApplicationThread()); 53 } 54 55 @Test(expected = NullPointerException.class) 56 public void testNullRoot() { 57 SubScene subScene = new SubScene(null, 10, 10); 58 } 59 60 @Test(expected = NullPointerException.class) 61 public void testSetNullRoot() { 62 SubScene subScene = new SubScene(new Group(), 10, 10); 63 subScene.setRoot(null); 64 } 65 66 @Test 67 public void testRootInitializedInConstructor() { 68 Group g = new Group(); 69 SubScene subScene = new SubScene(g, 10, 10); 70 71 assertEquals(g, subScene.getRoot()); 72 assertEquals(subScene, NodeShim.getSubScene(g)); 73 } 74 75 @Test 76 public void testWidthHeightInitializedInConstructor() { 77 int width = 600; 78 int height = 400; 79 SubScene subScene = new SubScene(new Group(), width, height); 80 81 assertTrue(subScene.getWidth() == width); 82 assertTrue(subScene.getHeight() == height); 83 } 84 85 @Test 86 public void testDepthBufferInitializedInConstructor() { 87 Group g = new Group(); 88 SubScene subScene = new SubScene(g, 10, 10, true, SceneAntialiasing.DISABLED); 89 90 assertTrue(subScene.isDepthBuffer()); 91 } 92 93 @Test 94 public void testNullAntiAliasingInitializedInConstructor() { 95 Group g = new Group(); 96 SubScene subScene = new SubScene(g, 10, 10, false, null); 97 98 assertTrue(subScene.getAntiAliasing() == null); 99 } 100 101 @Test 102 public void testAntiAliasingInitializedInConstructor() { 103 Group g = new Group(); 104 SubScene subScene = new SubScene(g, 10, 10, false, SceneAntialiasing.BALANCED); 105 106 assertTrue(subScene.getAntiAliasing() == SceneAntialiasing.BALANCED); 107 } 108 109 @Test 110 public void testRootUpdatedWhenAddedToSubScene() { 111 SubScene subScene = new SubScene(new Group(), 10, 10); 112 113 Group g = new Group(); 114 subScene.setRoot(g); 115 116 assertEquals(g, subScene.getRoot()); 117 assertEquals(subScene, NodeShim.getSubScene(g)); 118 } 119 120 @Test 121 public void testRootUpdatedWhenChangedInSubScene() { 122 Group g = new Group(); 123 SubScene subScene = new SubScene(g, 10, 10); 124 125 Group g2 = new Group(); 126 subScene.setRoot(g2); 127 128 assertNull(NodeShim.getSubScene(g)); 129 assertEquals(g2, subScene.getRoot()); 130 assertEquals(subScene, NodeShim.getSubScene(g2)); 131 } 132 133 @Test 134 public void testSetCamera() { 135 Camera camera = new PerspectiveCamera(); 136 SubScene subScene = new SubScene(new Group(camera), 100, 100); 137 Scene scene = new Scene(new Group(subScene)); 138 subScene.setCamera(camera); 139 assertEquals(subScene.getCamera(), camera); 140 assertNull(scene.getCamera()); 141 subScene.setCamera(camera); 142 } 143 144 @Test 145 public void testSetCameraToNestedSubScene() { 146 Camera camera = new PerspectiveCamera(); 147 SubScene nestedSubScene = new SubScene(new Group(camera), 100, 100); 148 SubScene subScene = new SubScene(new Group(nestedSubScene), 150, 150); 149 Scene scene = new Scene(new Group(subScene)); 150 nestedSubScene.setCamera(camera); 151 assertEquals(nestedSubScene.getCamera(), camera); 152 assertNull(subScene.getCamera()); 153 assertNull(scene.getCamera()); 154 } 155 156 @Test 157 public void testGetDefaultCamera() { 158 SubScene subScene = new SubScene(new Group(), 100, 100); 159 Scene scene = new Scene(new Group(subScene)); 160 assertNull(subScene.getCamera()); 161 } 162 163 @Test 164 public void testSetNullCamera() { 165 SubScene subScene = new SubScene(new Group(), 100, 100); 166 Scene scene = new Scene(new Group(subScene)); 167 subScene.setCamera(null); 168 assertNull(subScene.getCamera()); 169 } 170 171 @Test(expected = IllegalArgumentException.class) 172 public void testSetIllegalCameraFromOtherScene() { 173 Camera camera = new PerspectiveCamera(); 174 175 Scene scene = new Scene(new Group(camera)); 176 177 SubScene subScene = new SubScene(new Group(), 150, 150); 178 Scene otherScene = new Scene(new Group(subScene)); 179 180 scene.setCamera(camera); 181 subScene.setCamera(camera); 182 } 183 184 @Test(expected = IllegalArgumentException.class) 185 public void testSetIllegalCameraFromItsScene() { 186 Camera camera = new PerspectiveCamera(); 187 188 SubScene subScene = new SubScene(new Group(), 150, 150); 189 Scene scene = new Scene(new Group(camera, subScene)); 190 191 scene.setCamera(camera); 192 subScene.setCamera(camera); 193 } 194 195 @Test(expected = IllegalArgumentException.class) 196 public void testSetIllegalCameraFromOtherSubScene() { 197 Camera camera = new PerspectiveCamera(); 198 199 SubScene subScene = new SubScene(new Group(), 150, 150); 200 Scene scene = new Scene(new Group(subScene)); 201 202 SubScene otherSubScene = new SubScene(new Group(camera), 100, 100); 203 Scene otherScene = new Scene(new Group(otherSubScene)); 204 205 otherSubScene.setCamera(camera); 206 subScene.setCamera(camera); 207 } 208 209 @Test(expected = IllegalArgumentException.class) 210 public void testSetIllegalCameraFromSubScene() { 211 Camera camera = new PerspectiveCamera(); 212 213 SubScene subScene = new SubScene(new Group(), 150, 150); 214 Scene scene = new Scene(new Group(subScene)); 215 216 SubScene otherSubScene = new SubScene(new Group(camera), 100, 100); 217 218 otherSubScene.setCamera(camera); 219 subScene.setCamera(camera); 220 } 221 222 @Test(expected = IllegalArgumentException.class) 223 public void testSetIllegalCameraFromNestedSubScene() { 224 Camera camera = new PerspectiveCamera(); 225 226 SubScene nestedSubScene = new SubScene(new Group(camera), 100, 100); 227 SubScene subScene = new SubScene(new Group(nestedSubScene), 150, 150); 228 Scene scene = new Scene(new Group(subScene)); 229 230 nestedSubScene.setCamera(camera); 231 subScene.setCamera(camera); 232 } 233 234 @Test 235 public void testCameraUpdatesPG() { 236 SubScene sub = new SubScene(new Group(), 100, 100); 237 Scene scene = new Scene(new Group(sub), 300, 200); 238 Camera cam = new ParallelCamera(); 239 Stage stage = new Stage(); 240 stage.setScene(scene); 241 stage.show(); 242 243 sub.setCamera(cam); 244 Toolkit.getToolkit().firePulse(); 245 246 // verify it has correct owner 247 cam.setNearClip(20); 248 Toolkit.getToolkit().firePulse(); 249 NGSubScene peer = sub.impl_getPeer(); 250 assertEquals(20, peer.getCamera().getNearClip(), 0.00001); 251 252 sub.setCamera(null); // Sets the default camera, which is parallel camera 253 ParallelCamera pCam = new ParallelCamera(); // Like default cam 254 Toolkit.getToolkit().firePulse(); 255 // verify owner was removed 256 cam.setNearClip(30); 257 Toolkit.getToolkit().firePulse(); 258 assertEquals(pCam.getNearClip(), peer.getCamera().getNearClip(), 0.00001); 259 260 sub.setCamera(cam); 261 Toolkit.getToolkit().firePulse(); 262 // verify it has correct owner 263 cam.setNearClip(40); 264 Toolkit.getToolkit().firePulse(); 265 assertEquals(40, peer.getCamera().getNearClip(), 0.00001); 266 267 NGCamera oldCam = peer.getCamera(); 268 sub.setCamera(new ParallelCamera()); 269 Toolkit.getToolkit().firePulse(); 270 // verify owner was removed 271 cam.setNearClip(50); 272 Toolkit.getToolkit().firePulse(); 273 assertEquals(40, oldCam.getNearClip(), 0.00001); 274 assertEquals(0.1, peer.getCamera().getNearClip(), 0.00001); 275 } 276 277 @Test 278 public void testDefaultCameraUpdatesPG() { 279 SubScene sub = new SubScene(new Group(), 100, 100); 280 Scene scene = new Scene(new Group(sub), 300, 200); 281 Stage stage = new Stage(); 282 stage.setScene(scene); 283 stage.show(); 284 285 Toolkit.getToolkit().firePulse(); 286 Camera cam = SubSceneShim.getEffectiveCamera(sub); 287 288 cam.setNearClip(20); 289 Toolkit.getToolkit().firePulse(); 290 NGSubScene peer = sub.impl_getPeer(); 291 assertEquals(20, peer.getCamera().getNearClip(), 0.00001); 292 } 293 294 @Test(expected=IllegalArgumentException.class) 295 public void subScenesCannotShareCamera() { 296 SubScene sub = new SubScene(new Group(), 100, 100); 297 SubScene sub2 = new SubScene(new Group(), 100, 100); 298 Scene scene = new Scene(new Group(sub, sub2), 300, 200); 299 Camera cam = new ParallelCamera(); 300 sub.setCamera(cam); 301 sub2.setCamera(cam); 302 } 303 304 @Test(expected=IllegalArgumentException.class) 305 public void sceneAndSubSceneCannotShareCamera() { 306 SubScene sub = new SubScene(new Group(), 100, 100); 307 Scene scene = new Scene(new Group(sub), 300, 200); 308 Camera cam = new ParallelCamera(); 309 scene.setCamera(cam); 310 sub.setCamera(cam); 311 } 312 313 @Test 314 public void shouldBeAbleToSetCameraTwiceToSubScene() { 315 SubScene sub = new SubScene(new Group(), 100, 100); 316 Scene scene = new Scene(new Group(sub), 300, 200); 317 Camera cam = new ParallelCamera(); 318 try { 319 sub.setCamera(cam); 320 sub.setCamera(cam); 321 } catch (IllegalArgumentException e) { 322 fail("It didn't allow to 'share' camera with myslef"); 323 } 324 } 325 326 @Test 327 public void testLayout() { 328 Pane pane = new Pane(); 329 pane.setPrefWidth(100); 330 331 SubScene sub = new SubScene(new Group(pane), 500, 500); 332 Scene scene = new Scene(new Group(sub), 600, 600); 333 334 scene.getRoot().layout(); 335 assertEquals(100, pane.getWidth(), 1e-10); 336 337 pane.setPrefWidth(110); 338 scene.getRoot().layout(); 339 assertEquals(110, pane.getWidth(), 1e-10); 340 341 342 } 343 }