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