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