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 }