1 /*
   2  * Copyright (c) 2012, 2013, 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.input;
  27 
  28 import com.sun.javafx.FXUnit;
  29 import com.sun.javafx.pgstub.StubScene;
  30 import com.sun.javafx.test.MouseEventGenerator;
  31 import javafx.event.Event;
  32 import javafx.event.EventHandler;
  33 import javafx.geometry.Point3D;
  34 import javafx.scene.Group;
  35 import javafx.scene.Scene;
  36 import javafx.scene.shape.Rectangle;
  37 import javafx.stage.Stage;
  38 import org.junit.Rule;
  39 import org.junit.Test;
  40 import static org.junit.Assert.*;
  41 
  42 public class ZoomEventTest {
  43 
  44     @Rule
  45     public FXUnit fx = new FXUnit();
  46 
  47     private boolean zoomed;
  48     private boolean zoomed2;
  49     private PickResult pickRes;
  50 
  51     @Test public void testShortConstructor() {
  52         Rectangle node = new Rectangle();
  53         node.setTranslateX(3);
  54         node.setTranslateY(2);
  55         node.setTranslateZ(50);
  56 
  57         pickRes = new PickResult(node, new Point3D(15, 25, 100), 33);
  58         ZoomEvent e = new ZoomEvent(
  59                 ZoomEvent.ZOOM_FINISHED, 10, 20, 30, 40,
  60                 false, true, false, true, false, true,
  61                 0.75, 1.5, pickRes);
  62 
  63         assertSame(ZoomEvent.ZOOM_FINISHED, e.getEventType());
  64         assertSame(pickRes, e.getPickResult());
  65         assertEquals(18, e.getX(), 10e-20);
  66         assertEquals(27, e.getY(), 10e-20);
  67         assertEquals(150, e.getZ(), 10e-20);
  68         assertEquals(10, e.getSceneX(), 10e-20);
  69         assertEquals(20, e.getSceneY(), 10e-20);
  70         assertEquals(30, e.getScreenX(), 10e-20);
  71         assertEquals(40, e.getScreenY(), 10e-20);
  72         assertFalse(e.isShiftDown());
  73         assertTrue(e.isControlDown());
  74         assertFalse(e.isAltDown());
  75         assertTrue(e.isMetaDown());
  76         assertFalse(e.isDirect());
  77         assertTrue(e.isInertia());
  78         assertEquals(0.75, e.getZoomFactor(), 10e-20);
  79         assertEquals(1.5, e.getTotalZoomFactor(), 10e-20);
  80         assertSame(Event.NULL_SOURCE_TARGET, e.getSource());
  81         assertSame(Event.NULL_SOURCE_TARGET, e.getTarget());
  82         assertFalse(e.isConsumed());
  83 
  84         e = new ZoomEvent(
  85                 ZoomEvent.ZOOM_FINISHED, 10, 20, 30, 40,
  86                 true, false, true, false, true, false,
  87                 0.75, 1.5, pickRes);
  88         assertTrue(e.isShiftDown());
  89         assertFalse(e.isControlDown());
  90         assertTrue(e.isAltDown());
  91         assertFalse(e.isMetaDown());
  92         assertTrue(e.isDirect());
  93         assertFalse(e.isInertia());
  94     }
  95 
  96     @Test public void testShortConstructorWithoutPickResult() {
  97         ZoomEvent e = new ZoomEvent(
  98                 ZoomEvent.ZOOM_FINISHED, 10, 20, 30, 40,
  99                 false, true, false, true, false, true,
 100                 0.75, 1.5, null);
 101 
 102         assertEquals(10, e.getX(), 10e-20);
 103         assertEquals(20, e.getY(), 10e-20);
 104         assertEquals(0, e.getZ(), 10e-20);
 105         assertEquals(10, e.getSceneX(), 10e-20);
 106         assertEquals(20, e.getSceneY(), 10e-20);
 107         assertEquals(30, e.getScreenX(), 10e-20);
 108         assertEquals(40, e.getScreenY(), 10e-20);
 109         assertNotNull(e.getPickResult());
 110         assertNotNull(e.getPickResult().getIntersectedPoint());
 111         assertEquals(10, e.getPickResult().getIntersectedPoint().getX(), 10e-20);
 112         assertEquals(20, e.getPickResult().getIntersectedPoint().getY(), 10e-20);
 113         assertEquals(0, e.getPickResult().getIntersectedPoint().getZ(), 10e-20);
 114         assertSame(Event.NULL_SOURCE_TARGET, e.getSource());
 115         assertSame(Event.NULL_SOURCE_TARGET, e.getTarget());
 116     }
 117 
 118     @Test public void testLongConstructor() {
 119         Rectangle node = new Rectangle(10, 10);
 120         node.setTranslateX(3);
 121         node.setTranslateY(2);
 122         node.setTranslateZ(50);
 123         Rectangle n1 = new Rectangle(10, 10);
 124         Rectangle n2 = new Rectangle(10, 10);
 125 
 126         pickRes = new PickResult(node, new Point3D(15, 25, 100), 33);
 127         ZoomEvent e = new ZoomEvent(n1, n2,
 128                 ZoomEvent.ZOOM_FINISHED, 10, 20, 30, 40,
 129                 false, true, false, true, false, true,
 130                 0.75, 1.5, pickRes);
 131 
 132         assertSame(n1, e.getSource());
 133         assertSame(n2, e.getTarget());
 134         assertSame(ZoomEvent.ZOOM_FINISHED, e.getEventType());
 135         assertSame(pickRes, e.getPickResult());
 136         assertEquals(18, e.getX(), 10e-20);
 137         assertEquals(27, e.getY(), 10e-20);
 138         assertEquals(150, e.getZ(), 10e-20);
 139         assertEquals(10, e.getSceneX(), 10e-20);
 140         assertEquals(20, e.getSceneY(), 10e-20);
 141         assertEquals(30, e.getScreenX(), 10e-20);
 142         assertEquals(40, e.getScreenY(), 10e-20);
 143         assertFalse(e.isShiftDown());
 144         assertTrue(e.isControlDown());
 145         assertFalse(e.isAltDown());
 146         assertTrue(e.isMetaDown());
 147         assertFalse(e.isDirect());
 148         assertTrue(e.isInertia());
 149         assertEquals(0.75, e.getZoomFactor(), 10e-20);
 150         assertEquals(1.5, e.getTotalZoomFactor(), 10e-20);
 151         assertFalse(e.isConsumed());
 152 
 153         e = new ZoomEvent(n1, n2,
 154                 ZoomEvent.ZOOM_FINISHED, 10, 20, 30, 40,
 155                 true, false, true, false, true, false,
 156                 0.75, 1.5, pickRes);
 157         assertTrue(e.isShiftDown());
 158         assertFalse(e.isControlDown());
 159         assertTrue(e.isAltDown());
 160         assertFalse(e.isMetaDown());
 161         assertTrue(e.isDirect());
 162         assertFalse(e.isInertia());
 163     }
 164 
 165     @Test public void testLongConstructorWithoutPickResult() {
 166         Rectangle n1 = new Rectangle(10, 10);
 167         Rectangle n2 = new Rectangle(10, 10);
 168         ZoomEvent e = new ZoomEvent(n1, n2,
 169                 ZoomEvent.ZOOM_FINISHED, 10, 20, 30, 40,
 170                 false, true, false, true, false, true,
 171                 0.75, 1.5, null);
 172 
 173         assertSame(n1, e.getSource());
 174         assertSame(n2, e.getTarget());
 175         assertEquals(10, e.getX(), 10e-20);
 176         assertEquals(20, e.getY(), 10e-20);
 177         assertEquals(0, e.getZ(), 10e-20);
 178         assertEquals(10, e.getSceneX(), 10e-20);
 179         assertEquals(20, e.getSceneY(), 10e-20);
 180         assertEquals(30, e.getScreenX(), 10e-20);
 181         assertEquals(40, e.getScreenY(), 10e-20);
 182         assertNotNull(e.getPickResult());
 183         assertNotNull(e.getPickResult().getIntersectedPoint());
 184         assertEquals(10, e.getPickResult().getIntersectedPoint().getX(), 10e-20);
 185         assertEquals(20, e.getPickResult().getIntersectedPoint().getY(), 10e-20);
 186         assertEquals(0, e.getPickResult().getIntersectedPoint().getZ(), 10e-20);
 187     }
 188 
 189     @Test
 190     public void shouldDeliverZoomEventToPickedNode() {
 191         Scene scene = createScene();
 192         Rectangle rect = 
 193                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 194         
 195         zoomed = false;
 196         rect.setOnZoom(new EventHandler<ZoomEvent>() {
 197             @Override public void handle(ZoomEvent event) {
 198                 zoomed = true;
 199             }
 200         });
 201         
 202         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 203                 ZoomEvent.ZOOM, 1, 1,
 204                 50, 50, 50, 50, false, false, false, false, false, false);
 205         
 206         assertFalse(zoomed);
 207 
 208         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 209                 ZoomEvent.ZOOM, 1, 1,
 210                 150, 150, 150, 150, false, false, false, false, false, false);
 211         
 212         assertTrue(zoomed);
 213     }
 214     
 215     @Test
 216     public void shouldPassFactors() {
 217         Scene scene = createScene();
 218         Rectangle rect = 
 219                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 220         
 221         zoomed = false;
 222         rect.setOnZoom(new EventHandler<ZoomEvent>() {
 223             @Override public void handle(ZoomEvent event) {
 224                 assertEquals(1.2, event.getZoomFactor(), 0.0001);
 225                 assertEquals(2.4, event.getTotalZoomFactor(), 0.0001);
 226                 zoomed = true;
 227             }
 228         });
 229         
 230         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 231                 ZoomEvent.ZOOM, 1.2, 2.4,
 232                 150, 150, 150, 150, false, false, false, false, false, false);
 233         
 234         assertTrue(zoomed);
 235     }
 236 
 237     @Test
 238     public void shouldPassModifiers() {
 239         Scene scene = createScene();
 240         Rectangle rect = 
 241                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 242         
 243         zoomed = false;
 244         rect.setOnZoom(new EventHandler<ZoomEvent>() {
 245             @Override public void handle(ZoomEvent event) {
 246                 assertTrue(event.isShiftDown());
 247                 assertFalse(event.isControlDown());
 248                 assertTrue(event.isAltDown());
 249                 assertFalse(event.isMetaDown());
 250                 zoomed = true;
 251             }
 252         });
 253         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 254                 ZoomEvent.ZOOM, 2, 3,
 255                 150, 150, 150, 150, true, false, true, false, false, false);
 256         assertTrue(zoomed);
 257 
 258         zoomed = false;
 259         rect.setOnZoom(new EventHandler<ZoomEvent>() {
 260             @Override public void handle(ZoomEvent event) {
 261                 assertFalse(event.isShiftDown());
 262                 assertTrue(event.isControlDown());
 263                 assertFalse(event.isAltDown());
 264                 assertTrue(event.isMetaDown());
 265                 zoomed = true;
 266             }
 267         });
 268         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 269                 ZoomEvent.ZOOM, 2, 3,
 270                 150, 150, 150, 150, false, true, false, true, false, false);
 271         assertTrue(zoomed);
 272     }
 273 
 274     @Test
 275     public void shouldPassDirect() {
 276         Scene scene = createScene();
 277         Rectangle rect =
 278                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 279 
 280         zoomed = false;
 281         rect.setOnZoom(new EventHandler<ZoomEvent>() {
 282             @Override public void handle(ZoomEvent event) {
 283                 assertTrue(event.isDirect());
 284                 zoomed = true;
 285             }
 286         });
 287         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 288                 ZoomEvent.ZOOM, 2, 3,
 289                 150, 150, 150, 150, true, false, true, false, true, false);
 290         assertTrue(zoomed);
 291 
 292         zoomed = false;
 293         rect.setOnZoom(new EventHandler<ZoomEvent>() {
 294             @Override public void handle(ZoomEvent event) {
 295                 assertFalse(event.isDirect());
 296                 zoomed = true;
 297             }
 298         });
 299         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 300                 ZoomEvent.ZOOM, 2, 3,
 301                 150, 150, 150, 150, false, true, false, true, false, false);
 302         assertTrue(zoomed);
 303     }
 304 
 305     @Test
 306     public void shouldPassInertia() {
 307         Scene scene = createScene();
 308         Rectangle rect =
 309                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 310 
 311         zoomed = false;
 312         rect.setOnZoom(new EventHandler<ZoomEvent>() {
 313             @Override public void handle(ZoomEvent event) {
 314                 assertTrue(event.isInertia());
 315                 zoomed = true;
 316             }
 317         });
 318         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 319                 ZoomEvent.ZOOM, 2, 3,
 320                 150, 150, 150, 150, true, false, true, false, false, true);
 321         assertTrue(zoomed);
 322 
 323         zoomed = false;
 324         rect.setOnZoom(new EventHandler<ZoomEvent>() {
 325             @Override public void handle(ZoomEvent event) {
 326                 assertFalse(event.isInertia());
 327                 zoomed = true;
 328             }
 329         });
 330         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 331                 ZoomEvent.ZOOM, 2, 3,
 332                 150, 150, 150, 150, false, true, false, true, false, false);
 333         assertTrue(zoomed);
 334     }
 335 
 336     @Test
 337     public void shouldPassEventType() {
 338         Scene scene = createScene();
 339         Rectangle rect =
 340                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 341 
 342         zoomed = false;
 343         rect.setOnZoomStarted(new EventHandler<ZoomEvent>() {
 344             @Override public void handle(ZoomEvent event) {
 345                 zoomed = true;
 346             }
 347         });
 348         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 349                 ZoomEvent.ZOOM_STARTED, 2, 3,
 350                 150, 150, 150, 150, true, false, true, false, true, false);
 351         assertTrue(zoomed);
 352 
 353         zoomed = false;
 354         rect.setOnZoomFinished(new EventHandler<ZoomEvent>() {
 355             @Override public void handle(ZoomEvent event) {
 356                 zoomed = true;
 357             }
 358         });
 359         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 360                 ZoomEvent.ZOOM_FINISHED, 2, 3,
 361                 150, 150, 150, 150, true, false, true, false, true, false);
 362         assertTrue(zoomed);
 363     }
 364 
 365     @Test
 366     public void handlingAnyShouldGetAllTypes() {
 367         Scene scene = createScene();
 368         Rectangle rect =
 369                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 370 
 371         rect.addEventHandler(ZoomEvent.ANY, new EventHandler<ZoomEvent>() {
 372             @Override public void handle(ZoomEvent event) {
 373                 zoomed = true;
 374             }
 375         });
 376 
 377         zoomed = false;
 378         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 379                 ZoomEvent.ZOOM_STARTED, 2, 3,
 380                 150, 150, 150, 150, true, false, true, false, true, false);
 381         assertTrue(zoomed);
 382 
 383         zoomed = false;
 384         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 385                 ZoomEvent.ZOOM, 2, 3,
 386                 150, 150, 150, 150, true, false, true, false, true, false);
 387         assertTrue(zoomed);
 388 
 389         zoomed = false;
 390         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 391                 ZoomEvent.ZOOM_FINISHED, 2, 3,
 392                 150, 150, 150, 150, true, false, true, false, true, false);
 393         assertTrue(zoomed);
 394     }
 395 
 396     @Test
 397     public void shouldDeliverWholeGestureToOneNode() {
 398         Scene scene = createScene();
 399         Rectangle rect1 =
 400                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 401         Rectangle rect2 =
 402                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
 403 
 404         rect1.addEventHandler(ZoomEvent.ANY, new EventHandler<ZoomEvent>() {
 405             @Override public void handle(ZoomEvent event) {
 406                 zoomed = true;
 407             }
 408         });
 409         rect2.addEventHandler(ZoomEvent.ANY, new EventHandler<ZoomEvent>() {
 410             @Override public void handle(ZoomEvent event) {
 411                 zoomed2 = true;
 412             }
 413         });
 414 
 415         zoomed = false;
 416         zoomed2 = false;
 417         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 418                 ZoomEvent.ZOOM_STARTED, 2, 3,
 419                 150, 150, 150, 150, true, false, true, false, true, false);
 420         assertTrue(zoomed);
 421         assertFalse(zoomed2);
 422 
 423         zoomed = false;
 424         zoomed2 = false;
 425         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 426                 ZoomEvent.ZOOM, 2, 3,
 427                 250, 250, 250, 250, true, false, true, false, true, false);
 428         assertTrue(zoomed);
 429         assertFalse(zoomed2);
 430 
 431         zoomed = false;
 432         zoomed2 = false;
 433         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 434                 ZoomEvent.ZOOM_FINISHED, 2, 3,
 435                 250, 250, 250, 250, true, false, true, false, true, false);
 436         assertTrue(zoomed);
 437         assertFalse(zoomed2);
 438     }
 439 
 440     @Test
 441     public void shouldCompute3dCoordinates() {
 442         Scene scene = createScene();
 443         Rectangle rect =
 444                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 445         rect.setTranslateZ(50);
 446 
 447         zoomed = false;
 448         zoomed2 = false;
 449         rect.setOnZoom(new EventHandler<ZoomEvent>() {
 450             @Override public void handle(ZoomEvent event) {
 451                 assertEquals(150, event.getX(), 0.00001);
 452                 assertEquals(150, event.getY(), 0.00001);
 453                 assertEquals(0, event.getZ(), 0.00001);
 454                 zoomed = true;
 455             }
 456         });
 457 
 458         scene.setOnZoom(new EventHandler<ZoomEvent>() {
 459             @Override public void handle(ZoomEvent event) {
 460                 assertEquals(150, event.getX(), 0.00001);
 461                 assertEquals(150, event.getY(), 0.00001);
 462                 assertEquals(50, event.getZ(), 0.00001);
 463                 zoomed2 = true;
 464             }
 465         });
 466 
 467         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 468                 ZoomEvent.ZOOM, 1, 1,
 469                 150, 150, 150, 150, false, false, false, false, false, false);
 470 
 471         assertTrue(zoomed);
 472         assertTrue(zoomed2);
 473     }
 474 
 475     @Test
 476     public void shouldContainPickResult() {
 477         Scene scene = createScene();
 478         Rectangle rect1 =
 479                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 480         Rectangle rect2 =
 481                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
 482 
 483         rect1.addEventHandler(ZoomEvent.ANY, new EventHandler<ZoomEvent>() {
 484             @Override public void handle(ZoomEvent event) {
 485                 zoomed = true;
 486                 pickRes = event.getPickResult();
 487             }
 488         });
 489         rect2.addEventHandler(ZoomEvent.ANY, new EventHandler<ZoomEvent>() {
 490             @Override public void handle(ZoomEvent event) {
 491                 zoomed2 = true;
 492                 pickRes = event.getPickResult();
 493             }
 494         });
 495 
 496         zoomed = false;
 497         zoomed2 = false;
 498         pickRes = null;
 499         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 500                 ZoomEvent.ZOOM_STARTED, 2, 3,
 501                 150, 150, 150, 150, true, false, true, false, true, false);
 502         assertTrue(zoomed);
 503         assertFalse(zoomed2);
 504         assertNotNull(pickRes);
 505         assertSame(rect1, pickRes.getIntersectedNode());
 506         assertEquals(150, pickRes.getIntersectedPoint().getX(), 0.00001);
 507         assertEquals(150, pickRes.getIntersectedPoint().getY(), 0.00001);
 508         assertEquals(0, pickRes.getIntersectedPoint().getZ(), 0.00001);
 509 
 510         zoomed = false;
 511         zoomed2 = false;
 512         pickRes = null;
 513         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 514                 ZoomEvent.ZOOM, 2, 3,
 515                 250, 250, 250, 250, true, false, true, false, true, false);
 516         assertTrue(zoomed);
 517         assertFalse(zoomed2);
 518         assertNotNull(pickRes);
 519         assertSame(rect2, pickRes.getIntersectedNode());
 520         assertEquals(250, pickRes.getIntersectedPoint().getX(), 0.00001);
 521         assertEquals(250, pickRes.getIntersectedPoint().getY(), 0.00001);
 522         assertEquals(0, pickRes.getIntersectedPoint().getZ(), 0.00001);
 523 
 524         zoomed = false;
 525         zoomed2 = false;
 526         pickRes = null;
 527         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 528                 ZoomEvent.ZOOM_FINISHED, 2, 3,
 529                 250, 250, 250, 250, true, false, true, false, true, false);
 530         assertTrue(zoomed);
 531         assertFalse(zoomed2);
 532         assertNotNull(pickRes);
 533         assertSame(rect2, pickRes.getIntersectedNode());
 534         assertEquals(250, pickRes.getIntersectedPoint().getX(), 0.00001);
 535         assertEquals(250, pickRes.getIntersectedPoint().getY(), 0.00001);
 536         assertEquals(0, pickRes.getIntersectedPoint().getZ(), 0.00001);
 537     }
 538 
 539     @Test
 540     public void unknownLocationShouldBeReplacedByMouseLocation() {
 541         Scene scene = createScene();
 542         Rectangle rect1 =
 543                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 544         Rectangle rect2 =
 545                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
 546         rect1.addEventHandler(ZoomEvent.ANY, new EventHandler<ZoomEvent>() {
 547             @Override public void handle(ZoomEvent event) {
 548                 zoomed = true;
 549             }
 550         });
 551 
 552         MouseEventGenerator generator = new MouseEventGenerator();
 553 
 554         zoomed = false;
 555         zoomed2 = false;
 556         rect2.setOnZoomStarted(new EventHandler<ZoomEvent>() {
 557             @Override public void handle(ZoomEvent event) {
 558                 assertEquals(250.0, event.getSceneX(), 0.0001);
 559                 assertEquals(250.0, event.getSceneY(), 0.0001);
 560                 zoomed2 = true;
 561             }
 562         });
 563         scene.impl_processMouseEvent(generator.generateMouseEvent(
 564                 MouseEvent.MOUSE_MOVED, 250, 250));
 565         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 566                 ZoomEvent.ZOOM_STARTED, 2, 3,
 567                 Double.NaN, Double.NaN, Double.NaN, Double.NaN,
 568                 true, false, true, false, true, false);
 569         assertFalse(zoomed);
 570         assertTrue(zoomed2);
 571 
 572         zoomed = false;
 573         zoomed2 = false;
 574         rect2.setOnZoom(new EventHandler<ZoomEvent>() {
 575             @Override public void handle(ZoomEvent event) {
 576                 assertEquals(150.0, event.getSceneX(), 0.0001);
 577                 assertEquals(150.0, event.getSceneY(), 0.0001);
 578                 zoomed2 = true;
 579             }
 580         });
 581         scene.impl_processMouseEvent(generator.generateMouseEvent(
 582                 MouseEvent.MOUSE_MOVED, 150, 150));
 583         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 584                 ZoomEvent.ZOOM, 2, 3,
 585                 Double.NaN, Double.NaN, Double.NaN, Double.NaN,
 586                 true, false, true, false, true, false);
 587         assertFalse(zoomed);
 588         assertTrue(zoomed2);
 589 
 590         zoomed = false;
 591         zoomed2 = false;
 592         rect2.setOnZoomFinished(new EventHandler<ZoomEvent>() {
 593             @Override public void handle(ZoomEvent event) {
 594                 assertEquals(150.0, event.getSceneX(), 0.0001);
 595                 assertEquals(150.0, event.getSceneY(), 0.0001);
 596                 zoomed2 = true;
 597             }
 598         });
 599         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 600                 ZoomEvent.ZOOM_FINISHED, 2, 3,
 601                 Double.NaN, Double.NaN, Double.NaN, Double.NaN,
 602                 true, false, true, false, true, false);
 603         assertFalse(zoomed);
 604         assertTrue(zoomed2);
 605     }
 606 
 607     @Test
 608     public void finishedLocationShouldBeFixed() {
 609         Scene scene = createScene();
 610         Rectangle rect =
 611                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 612         rect.setOnZoomFinished(new EventHandler<ZoomEvent>() {
 613             @Override public void handle(ZoomEvent event) {
 614                 assertEquals(250.0, event.getSceneX(), 0.0001);
 615                 assertEquals(250.0, event.getSceneY(), 0.0001);
 616                 zoomed = true;
 617             }
 618         });
 619 
 620         zoomed = false;
 621 
 622         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 623                 ZoomEvent.ZOOM_STARTED, 2, 3,
 624                 150, 150, 150, 150, true, false, true, false, true, false);
 625 
 626         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 627                 ZoomEvent.ZOOM, 2, 3,
 628                 250, 250, 250, 250, true, false, true, false, true, false);
 629 
 630         assertFalse(zoomed);
 631 
 632         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 633                 ZoomEvent.ZOOM_FINISHED, 2, 3,
 634                 Double.NaN, Double.NaN, Double.NaN, Double.NaN,
 635                 true, false, true, false, true, false);
 636 
 637         assertTrue(zoomed);
 638     }
 639 
 640     @Test
 641     public void unknownLocalShouldBeFixedByMousePosition() {
 642         MouseEventGenerator gen = new MouseEventGenerator();
 643         Scene scene = createScene();
 644         Rectangle rect =
 645                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 646 
 647         rect.setOnZoom(new EventHandler<ZoomEvent>() {
 648             @Override public void handle(ZoomEvent event) {
 649                 assertEquals(150.0, event.getSceneX(), 0.0001);
 650                 assertEquals(150.0, event.getSceneY(), 0.0001);
 651                 zoomed = true;
 652             }
 653         });
 654 
 655         zoomed = false;
 656 
 657         scene.impl_processMouseEvent(
 658                 gen.generateMouseEvent(MouseEvent.MOUSE_MOVED, 250, 250));
 659 
 660         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 661                 ZoomEvent.ZOOM, 2, 3,
 662                 Double.NaN, Double.NaN, Double.NaN, Double.NaN,
 663                 true, false, true, false, true, false);
 664 
 665         assertFalse(zoomed);
 666 
 667         scene.impl_processMouseEvent(
 668                 gen.generateMouseEvent(MouseEvent.MOUSE_MOVED, 150, 150));
 669 
 670         ((StubScene) scene.impl_getPeer()).getListener().zoomEvent(
 671                 ZoomEvent.ZOOM, 2, 3,
 672                 Double.NaN, Double.NaN, Double.NaN, Double.NaN,
 673                 true, false, true, false, true, false);
 674 
 675         assertTrue(zoomed);
 676     }
 677 
 678     @Test public void testToString() {
 679         ZoomEvent e = new ZoomEvent(ZoomEvent.ZOOM,
 680             100, 100, 200, 200,
 681             false, false, false, false,
 682             true, false, 10, 20, null);
 683 
 684         String s = e.toString();
 685 
 686         assertNotNull(s);
 687         assertFalse(s.isEmpty());
 688     }
 689 
 690     private Scene createScene() {
 691         final Group root = new Group();
 692         
 693         final Scene scene = new Scene(root, 400, 400);
 694 
 695         Rectangle rect = new Rectangle(100, 100, 100, 100);
 696         Rectangle rect2 = new Rectangle(200, 200, 100, 100);
 697 
 698         root.getChildren().addAll(rect, rect2);
 699 
 700         Stage stage = new Stage();
 701         stage.setScene(scene);
 702         stage.show();
 703         
 704         return scene;
 705     }
 706 }