1 /*
   2  * Copyright (c) 2000, 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 ScrollEventTest {
  42 
  43     private boolean scrolled;
  44     private boolean scrolled2;
  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         ScrollEvent e = new ScrollEvent(
  55                 ScrollEvent.SCROLL_STARTED, 10, 20, 30, 40,
  56                 false, true, false, true, false, true,
  57                 2, 3, 4, 5, ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, 6,
  58                 ScrollEvent.VerticalTextScrollUnits.PAGES, 7, 8, pickRes);
  59 
  60         assertSame(ScrollEvent.SCROLL_STARTED, e.getEventType());
  61         assertSame(pickRes, e.getPickResult());
  62         assertEquals(18, e.getX(), 10e-20);
  63         assertEquals(27, e.getY(), 10e-20);
  64         assertEquals(150, e.getZ(), 10e-20);
  65         assertEquals(10, e.getSceneX(), 10e-20);
  66         assertEquals(20, e.getSceneY(), 10e-20);
  67         assertEquals(30, e.getScreenX(), 10e-20);
  68         assertEquals(40, e.getScreenY(), 10e-20);
  69         assertFalse(e.isShiftDown());
  70         assertTrue(e.isControlDown());
  71         assertFalse(e.isAltDown());
  72         assertTrue(e.isMetaDown());
  73         assertFalse(e.isDirect());
  74         assertTrue(e.isInertia());
  75         assertEquals(2.0, e.getDeltaX(), 10e-20);
  76         assertEquals(3.0, e.getDeltaY(), 10e-20);
  77         assertEquals(4.0, e.getTotalDeltaX(), 10e-20);
  78         assertEquals(5.0, e.getTotalDeltaY(), 10e-20);
  79         assertSame(ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, e.getTextDeltaXUnits());
  80         assertEquals(6.0, e.getTextDeltaX(), 10e-20);
  81         assertSame(ScrollEvent.VerticalTextScrollUnits.PAGES, e.getTextDeltaYUnits());
  82         assertEquals(7.0, e.getTextDeltaY(), 10e-20);
  83         assertEquals(8.0, e.getTouchCount(), 10e-20);
  84         assertSame(Event.NULL_SOURCE_TARGET, e.getSource());
  85         assertSame(Event.NULL_SOURCE_TARGET, e.getTarget());
  86         assertFalse(e.isConsumed());
  87 
  88         e = new ScrollEvent(
  89                 ScrollEvent.SCROLL_STARTED, 10, 20, 30, 40,
  90                 true, false, true, false, true, false,
  91                 2, 3, 4, 5, ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, 6,
  92                 ScrollEvent.VerticalTextScrollUnits.PAGES, 7, 8, pickRes);
  93         assertTrue(e.isShiftDown());
  94         assertFalse(e.isControlDown());
  95         assertTrue(e.isAltDown());
  96         assertFalse(e.isMetaDown());
  97         assertTrue(e.isDirect());
  98         assertFalse(e.isInertia());
  99     }
 100 
 101     @Test public void testShortConstructorWithoutPickResult() {
 102         ScrollEvent e = new ScrollEvent(
 103                 ScrollEvent.SCROLL_STARTED, 10, 20, 30, 40,
 104                 false, true, false, true, false, true,
 105                 2, 3, 4, 5, ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, 6,
 106                 ScrollEvent.VerticalTextScrollUnits.PAGES, 7, 8, null);
 107 
 108         assertEquals(10, e.getX(), 10e-20);
 109         assertEquals(20, e.getY(), 10e-20);
 110         assertEquals(0, e.getZ(), 10e-20);
 111         assertEquals(10, e.getSceneX(), 10e-20);
 112         assertEquals(20, e.getSceneY(), 10e-20);
 113         assertEquals(30, e.getScreenX(), 10e-20);
 114         assertEquals(40, e.getScreenY(), 10e-20);
 115         assertNotNull(e.getPickResult());
 116         assertNotNull(e.getPickResult().getIntersectedPoint());
 117         assertEquals(10, e.getPickResult().getIntersectedPoint().getX(), 10e-20);
 118         assertEquals(20, e.getPickResult().getIntersectedPoint().getY(), 10e-20);
 119         assertEquals(0, e.getPickResult().getIntersectedPoint().getZ(), 10e-20);
 120         assertSame(Event.NULL_SOURCE_TARGET, e.getSource());
 121         assertSame(Event.NULL_SOURCE_TARGET, e.getTarget());
 122     }
 123 
 124     @Test public void testLongConstructor() {
 125         Rectangle node = new Rectangle(10, 10);
 126         node.setTranslateX(3);
 127         node.setTranslateY(2);
 128         node.setTranslateZ(50);
 129         Rectangle n1 = new Rectangle(10, 10);
 130         Rectangle n2 = new Rectangle(10, 10);
 131 
 132         pickRes = new PickResult(node, new Point3D(15, 25, 100), 33);
 133         ScrollEvent e = new ScrollEvent(n1, n2,
 134                 ScrollEvent.SCROLL_STARTED, 10, 20, 30, 40,
 135                 false, true, false, true, false, true,
 136                 2, 3, 4, 5, ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, 6,
 137                 ScrollEvent.VerticalTextScrollUnits.PAGES, 7, 8, pickRes);
 138 
 139         assertSame(n1, e.getSource());
 140         assertSame(n2, e.getTarget());
 141         assertSame(ScrollEvent.SCROLL_STARTED, e.getEventType());
 142         assertSame(pickRes, e.getPickResult());
 143         assertEquals(18, e.getX(), 10e-20);
 144         assertEquals(27, e.getY(), 10e-20);
 145         assertEquals(150, e.getZ(), 10e-20);
 146         assertEquals(10, e.getSceneX(), 10e-20);
 147         assertEquals(20, e.getSceneY(), 10e-20);
 148         assertEquals(30, e.getScreenX(), 10e-20);
 149         assertEquals(40, e.getScreenY(), 10e-20);
 150         assertFalse(e.isShiftDown());
 151         assertTrue(e.isControlDown());
 152         assertFalse(e.isAltDown());
 153         assertTrue(e.isMetaDown());
 154         assertFalse(e.isDirect());
 155         assertTrue(e.isInertia());
 156         assertEquals(2.0, e.getDeltaX(), 10e-20);
 157         assertEquals(3.0, e.getDeltaY(), 10e-20);
 158         assertEquals(4.0, e.getTotalDeltaX(), 10e-20);
 159         assertEquals(5.0, e.getTotalDeltaY(), 10e-20);
 160         assertSame(ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, e.getTextDeltaXUnits());
 161         assertEquals(6.0, e.getTextDeltaX(), 10e-20);
 162         assertSame(ScrollEvent.VerticalTextScrollUnits.PAGES, e.getTextDeltaYUnits());
 163         assertEquals(7.0, e.getTextDeltaY(), 10e-20);
 164         assertEquals(8.0, e.getTouchCount(), 10e-20);
 165         assertFalse(e.isConsumed());
 166 
 167         e = new ScrollEvent(n1, n2,
 168                 ScrollEvent.SCROLL_STARTED, 10, 20, 30, 40,
 169                 true, false, true, false, true, false,
 170                 2, 3, 4, 5, ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, 6,
 171                 ScrollEvent.VerticalTextScrollUnits.PAGES, 7, 8, pickRes);
 172         assertTrue(e.isShiftDown());
 173         assertFalse(e.isControlDown());
 174         assertTrue(e.isAltDown());
 175         assertFalse(e.isMetaDown());
 176         assertTrue(e.isDirect());
 177         assertFalse(e.isInertia());
 178     }
 179 
 180     @Test public void testLongConstructorWithoutPickResult() {
 181         Rectangle n1 = new Rectangle(10, 10);
 182         Rectangle n2 = new Rectangle(10, 10);
 183         ScrollEvent e = new ScrollEvent(n1, n2,
 184                 ScrollEvent.SCROLL_STARTED, 10, 20, 30, 40,
 185                 false, true, false, true, false, true,
 186                 2, 3, 4, 5, ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, 6,
 187                 ScrollEvent.VerticalTextScrollUnits.PAGES, 7, 8, null);
 188 
 189         assertSame(n1, e.getSource());
 190         assertSame(n2, e.getTarget());
 191         assertEquals(10, e.getX(), 10e-20);
 192         assertEquals(20, e.getY(), 10e-20);
 193         assertEquals(0, e.getZ(), 10e-20);
 194         assertEquals(10, e.getSceneX(), 10e-20);
 195         assertEquals(20, e.getSceneY(), 10e-20);
 196         assertEquals(30, e.getScreenX(), 10e-20);
 197         assertEquals(40, e.getScreenY(), 10e-20);
 198         assertNotNull(e.getPickResult());
 199         assertNotNull(e.getPickResult().getIntersectedPoint());
 200         assertEquals(10, e.getPickResult().getIntersectedPoint().getX(), 10e-20);
 201         assertEquals(20, e.getPickResult().getIntersectedPoint().getY(), 10e-20);
 202         assertEquals(0, e.getPickResult().getIntersectedPoint().getZ(), 10e-20);
 203     }
 204 
 205 
 206     @Test
 207     public void shouldDeliverScrollEventToPickedNode() {
 208         Scene scene = createScene();
 209         Rectangle rect = 
 210                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 211         
 212         scrolled = false;
 213         rect.setOnScroll(event -> {
 214             scrolled = true;
 215         });
 216         
 217         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 218                 ScrollEvent.SCROLL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
 219                 50, 50, 50, 50, false, false, false, false, false, false);
 220         
 221         assertFalse(scrolled);
 222 
 223         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 224                 ScrollEvent.SCROLL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
 225                 150, 150, 150, 150, false, false, false, false, false, false);
 226         
 227         assertTrue(scrolled);
 228     }
 229     
 230     @Test
 231     public void shouldUseMultiplier() {
 232         Scene scene = createScene();
 233         Rectangle rect = 
 234                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 235         
 236         scrolled = false;
 237         rect.setOnScroll(event -> {
 238             Assert.assertEquals(66.0, event.getDeltaX(), 0.0001);
 239             Assert.assertEquals(99.0, event.getDeltaY(), 0.0001);
 240             Assert.assertEquals(132.0, event.getTotalDeltaX(), 0.0001);
 241             Assert.assertEquals(198.0, event.getTotalDeltaY(), 0.0001);
 242             scrolled = true;
 243         });
 244         
 245         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 246                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 1, 1, 1, 1, 1,
 247                 150, 150, 150, 150, false, false, false, false, false, false);
 248         
 249         assertTrue(scrolled);
 250     }
 251 
 252     @Test
 253     public void shouldUseTextDeltasForUnitsAndValues() {
 254         Scene scene = createScene();
 255         Rectangle rect = 
 256                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 257         
 258         scrolled = false;
 259         rect.setOnScroll(event -> {
 260             Assert.assertEquals(0.0, event.getTextDeltaX(), 0.0001);
 261             Assert.assertEquals(0.0, event.getTextDeltaY(), 0.0001);
 262             assertSame(ScrollEvent.HorizontalTextScrollUnits.NONE, event.getTextDeltaXUnits());
 263             assertSame(ScrollEvent.VerticalTextScrollUnits.NONE, event.getTextDeltaYUnits());
 264             scrolled = true;
 265         });
 266         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 267                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 0, 0, 0, 0,
 268                 150, 150, 150, 150, false, false, false, false, false, false);
 269         assertTrue(scrolled);
 270 
 271         scrolled = false;
 272         rect.setOnScroll(event -> {
 273             Assert.assertEquals(8.0, event.getTextDeltaX(), 0.0001);
 274             Assert.assertEquals(15.0, event.getTextDeltaY(), 0.0001);
 275             assertSame(ScrollEvent.HorizontalTextScrollUnits.CHARACTERS, event.getTextDeltaXUnits());
 276             assertSame(ScrollEvent.VerticalTextScrollUnits.LINES, event.getTextDeltaYUnits());
 277             scrolled = true;
 278         });
 279         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 280                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 1, 4, 5, 3, 3,
 281                 150, 150, 150, 150, false, false, false, false, false, false);
 282         assertTrue(scrolled);
 283         
 284         scrolled = false;
 285         rect.setOnScroll(event -> {
 286             Assert.assertEquals(0.0, event.getTextDeltaX(), 0.0001);
 287             Assert.assertEquals(3.0, event.getTextDeltaY(), 0.0001);
 288             assertSame(ScrollEvent.HorizontalTextScrollUnits.NONE, event.getTextDeltaXUnits());
 289             assertSame(ScrollEvent.VerticalTextScrollUnits.PAGES, event.getTextDeltaYUnits());
 290             scrolled = true;
 291         });
 292         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 293                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 5, -1, -1, 3, 3,
 294                 150, 150, 150, 150, false, false, false, false, false, false);
 295         assertTrue(scrolled);
 296         
 297     }
 298     
 299     @Test
 300     public void shouldPassModifiers() {
 301         Scene scene = createScene();
 302         Rectangle rect = 
 303                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 304         
 305         scrolled = false;
 306         rect.setOnScroll(event -> {
 307             assertTrue(event.isShiftDown());
 308             assertFalse(event.isControlDown());
 309             assertTrue(event.isAltDown());
 310             assertFalse(event.isMetaDown());
 311             scrolled = true;
 312         });
 313         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 314                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 1, 1, 1, 3, 3,
 315                 150, 150, 150, 150, true, false, true, false, false, false);
 316         assertTrue(scrolled);
 317 
 318         scrolled = false;
 319         rect.setOnScroll(event -> {
 320             assertFalse(event.isShiftDown());
 321             assertTrue(event.isControlDown());
 322             assertFalse(event.isAltDown());
 323             assertTrue(event.isMetaDown());
 324             scrolled = true;
 325         });
 326         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 327                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 1, 1, 1, 3, 3,
 328                 150, 150, 150, 150, false, true, false, true, false, false);
 329         assertTrue(scrolled);
 330     }
 331 
 332     @Test
 333     public void shouldPassDirect() {
 334         Scene scene = createScene();
 335         Rectangle rect =
 336                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 337 
 338         scrolled = false;
 339         rect.setOnScroll(event -> {
 340             assertTrue(event.isDirect());
 341             scrolled = true;
 342         });
 343         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 344                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 1, 1, 1, 3, 3,
 345                 150, 150, 150, 150, true, false, true, false, true, false);
 346         assertTrue(scrolled);
 347 
 348         scrolled = false;
 349         rect.setOnScroll(event -> {
 350             assertFalse(event.isDirect());
 351             scrolled = true;
 352         });
 353         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 354                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 1, 1, 1, 3, 3,
 355                 150, 150, 150, 150, false, true, false, true, false, false);
 356         assertTrue(scrolled);
 357     }
 358 
 359     @Test
 360     public void shouldPassInertia() {
 361         Scene scene = createScene();
 362         Rectangle rect =
 363                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 364 
 365         scrolled = false;
 366         rect.setOnScroll(event -> {
 367             assertTrue(event.isInertia());
 368             scrolled = true;
 369         });
 370         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 371                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 1, 1, 1, 3, 3,
 372                 150, 150, 150, 150, true, false, true, false, false, true);
 373         assertTrue(scrolled);
 374 
 375         scrolled = false;
 376         rect.setOnScroll(event -> {
 377             assertFalse(event.isInertia());
 378             scrolled = true;
 379         });
 380         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 381                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 1, 1, 1, 3, 3,
 382                 150, 150, 150, 150, false, true, false, true, false, false);
 383         assertTrue(scrolled);
 384     }
 385 
 386     @Test
 387     public void shouldPassTouchCount() {
 388         Scene scene = createScene();
 389         Rectangle rect =
 390                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 391 
 392         scrolled = false;
 393         rect.setOnScroll(event -> {
 394             Assert.assertEquals(0, event.getTouchCount());
 395             scrolled = true;
 396         });
 397         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 398                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 399                 150, 150, 150, 150, true, false, true, false, true, false);
 400         assertTrue(scrolled);
 401 
 402         scrolled = false;
 403         rect.setOnScroll(event -> {
 404             Assert.assertEquals(5, event.getTouchCount());
 405             scrolled = true;
 406         });
 407         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 408                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 5, 1, 1, 3, 3,
 409                 150, 150, 150, 150, true, false, true, false, true, false);
 410         assertTrue(scrolled);
 411     }
 412     
 413     @Test
 414     public void shouldPassEventType() {
 415         Scene scene = createScene();
 416         Rectangle rect =
 417                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 418 
 419         scrolled = false;
 420         rect.setOnScrollStarted(event -> {
 421             scrolled = true;
 422         });
 423         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 424                 ScrollEvent.SCROLL_STARTED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 425                 150, 150, 150, 150, true, false, true, false, true, false);
 426         assertTrue(scrolled);
 427 
 428         scrolled = false;
 429         rect.setOnScrollFinished(event -> {
 430             scrolled = true;
 431         });
 432         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 433                 ScrollEvent.SCROLL_FINISHED, 2, 3, 4, 6, 33, 33, 5, 1, 1, 3, 3,
 434                 150, 150, 150, 150, true, false, true, false, true, false);
 435         assertTrue(scrolled);
 436     }
 437 
 438     @Test
 439     public void handlingAnyShouldGetAllTypes() {
 440         Scene scene = createScene();
 441         Rectangle rect =
 442                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 443 
 444         rect.addEventHandler(ScrollEvent.ANY, event -> {
 445             scrolled = true;
 446         });
 447 
 448         scrolled = false;
 449         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 450                 ScrollEvent.SCROLL_STARTED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 451                 150, 150, 150, 150, true, false, true, false, true, false);
 452         assertTrue(scrolled);
 453 
 454         scrolled = false;
 455         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 456                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 5, 1, 1, 3, 3,
 457                 150, 150, 150, 150, true, false, true, false, true, false);
 458         assertTrue(scrolled);
 459 
 460         scrolled = false;
 461         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 462                 ScrollEvent.SCROLL_FINISHED, 2, 3, 4, 6, 33, 33, 5, 1, 1, 3, 3,
 463                 150, 150, 150, 150, true, false, true, false, true, false);
 464         assertTrue(scrolled);
 465     }
 466 
 467     @Test
 468     public void shouldDeliverWholeGestureToOneNode() {
 469         Scene scene = createScene();
 470         Rectangle rect1 =
 471                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 472         Rectangle rect2 =
 473                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
 474 
 475         rect1.addEventHandler(ScrollEvent.ANY, event -> {
 476             scrolled = true;
 477         });
 478         rect2.addEventHandler(ScrollEvent.ANY, event -> {
 479             scrolled2 = true;
 480         });
 481 
 482         scrolled = false;
 483         scrolled2 = false;
 484         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 485                 ScrollEvent.SCROLL_STARTED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 486                 150, 150, 150, 150, true, false, true, false, true, false);
 487         assertTrue(scrolled);
 488         assertFalse(scrolled2);
 489 
 490         scrolled = false;
 491         scrolled2 = false;
 492         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 493                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 494                 250, 250, 250, 250, true, false, true, false, true, false);
 495         assertTrue(scrolled);
 496         assertFalse(scrolled2);
 497 
 498         scrolled = false;
 499         scrolled2 = false;
 500         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 501                 ScrollEvent.SCROLL_FINISHED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 502                 250, 250, 250, 250, true, false, true, false, true, false);
 503         assertTrue(scrolled);
 504         assertFalse(scrolled2);
 505 
 506         // inertia
 507         scrolled = false;
 508         scrolled2 = false;
 509         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 510                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 511                 250, 250, 250, 250, true, false, true, false, true, true);
 512         assertTrue(scrolled);
 513         assertFalse(scrolled2);
 514     }
 515 
 516     @Test
 517     public void shouldCompute3dCoordinates() {
 518         Scene scene = createScene();
 519         Rectangle rect =
 520                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 521         rect.setTranslateZ(50);
 522 
 523         scrolled = false;
 524         scrolled2 = false;
 525         rect.setOnScroll(event -> {
 526             Assert.assertEquals(150, event.getX(), 0.00001);
 527             Assert.assertEquals(150, event.getY(), 0.00001);
 528             Assert.assertEquals(0, event.getZ(), 0.00001);
 529             scrolled = true;
 530         });
 531 
 532         scene.setOnScroll(event -> {
 533             Assert.assertEquals(150, event.getX(), 0.00001);
 534             Assert.assertEquals(150, event.getY(), 0.00001);
 535             Assert.assertEquals(50, event.getZ(), 0.00001);
 536             scrolled2 = true;
 537         });
 538 
 539         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 540                 ScrollEvent.SCROLL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
 541                 150, 150, 150, 150, false, false, false, false, false, false);
 542 
 543         assertTrue(scrolled);
 544         assertTrue(scrolled2);
 545     }
 546 
 547     @Test
 548     public void shouldContainPickResult() {
 549         Scene scene = createScene();
 550         Rectangle rect1 =
 551                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 552         Rectangle rect2 =
 553                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
 554 
 555         rect1.addEventHandler(ScrollEvent.ANY, event -> {
 556             pickRes = event.getPickResult();
 557             scrolled = true;
 558         });
 559         rect2.addEventHandler(ScrollEvent.ANY, event -> {
 560             pickRes = event.getPickResult();
 561             scrolled2 = true;
 562         });
 563 
 564         scrolled = false;
 565         scrolled2 = false;
 566         pickRes = null;
 567         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 568                 ScrollEvent.SCROLL_STARTED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 569                 150, 150, 150, 150, true, false, true, false, true, false);
 570         assertTrue(scrolled);
 571         assertFalse(scrolled2);
 572         assertNotNull(pickRes);
 573         assertSame(rect1, pickRes.getIntersectedNode());
 574         assertEquals(150, pickRes.getIntersectedPoint().getX(), 0.00001);
 575         assertEquals(150, pickRes.getIntersectedPoint().getY(), 0.00001);
 576         assertEquals(0, pickRes.getIntersectedPoint().getZ(), 0.00001);
 577 
 578         scrolled = false;
 579         scrolled2 = false;
 580         pickRes = null;
 581         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 582                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 583                 250, 250, 250, 250, true, false, true, false, true, false);
 584         assertTrue(scrolled);
 585         assertFalse(scrolled2);
 586         assertNotNull(pickRes);
 587         assertSame(rect2, pickRes.getIntersectedNode());
 588         assertEquals(250, pickRes.getIntersectedPoint().getX(), 0.00001);
 589         assertEquals(250, pickRes.getIntersectedPoint().getY(), 0.00001);
 590         assertEquals(0, pickRes.getIntersectedPoint().getZ(), 0.00001);
 591 
 592         scrolled = false;
 593         scrolled2 = false;
 594         pickRes = null;
 595         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 596                 ScrollEvent.SCROLL_FINISHED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 597                 250, 250, 250, 250, true, false, true, false, true, false);
 598         assertTrue(scrolled);
 599         assertFalse(scrolled2);
 600         assertNotNull(pickRes);
 601         assertSame(rect2, pickRes.getIntersectedNode());
 602         assertEquals(250, pickRes.getIntersectedPoint().getX(), 0.00001);
 603         assertEquals(250, pickRes.getIntersectedPoint().getY(), 0.00001);
 604         assertEquals(0, pickRes.getIntersectedPoint().getZ(), 0.00001);
 605 
 606         // inertia
 607         scrolled = false;
 608         scrolled2 = false;
 609         pickRes = null;
 610         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 611                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 612                 250, 250, 250, 250, true, false, true, false, true, true);
 613         assertTrue(scrolled);
 614         assertFalse(scrolled2);
 615         assertNotNull(pickRes);
 616         assertSame(rect2, pickRes.getIntersectedNode());
 617         assertEquals(250, pickRes.getIntersectedPoint().getX(), 0.00001);
 618         assertEquals(250, pickRes.getIntersectedPoint().getY(), 0.00001);
 619         assertEquals(0, pickRes.getIntersectedPoint().getZ(), 0.00001);
 620     }
 621 
 622     @Test
 623     public void shouldPickForMouseWheelDuringInertia() {
 624         Scene scene = createScene();
 625         Rectangle rect1 =
 626                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 627         Rectangle rect2 =
 628                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
 629 
 630         rect1.addEventHandler(ScrollEvent.ANY, event -> {
 631             scrolled = true;
 632         });
 633         rect2.addEventHandler(ScrollEvent.ANY, event -> {
 634             scrolled2 = true;
 635         });
 636 
 637         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 638                 ScrollEvent.SCROLL_STARTED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 639                 150, 150, 150, 150, true, false, true, false, true, false);
 640         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 641                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 642                 250, 250, 250, 250, true, false, true, false, true, false);
 643         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 644                 ScrollEvent.SCROLL_FINISHED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 645                 250, 250, 250, 250, true, false, true, false, true, false);
 646 
 647         // inertia
 648         scrolled = false;
 649         scrolled2 = false;
 650         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 651                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 652                 250, 250, 250, 250, true, false, true, false, true, true);
 653         assertTrue(scrolled);
 654         assertFalse(scrolled2);
 655 
 656         // wheel
 657         scrolled = false;
 658         scrolled2 = false;
 659         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 660                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 661                 250, 250, 250, 250, true, false, true, false, true, false);
 662         assertFalse(scrolled);
 663         assertTrue(scrolled2);
 664 
 665         // inertia
 666         scrolled = false;
 667         scrolled2 = false;
 668         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 669                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 670                 250, 250, 250, 250, true, false, true, false, true, true);
 671         assertTrue(scrolled);
 672         assertFalse(scrolled2);
 673     }
 674 
 675     @Test
 676     public void unknownLocationShouldBeReplacedByMouseLocation() {
 677         Scene scene = createScene();
 678         Rectangle rect1 =
 679                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 680         Rectangle rect2 =
 681                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
 682         rect1.addEventHandler(ScrollEvent.ANY, event -> {
 683             scrolled = true;
 684         });
 685 
 686         MouseEventGenerator generator = new MouseEventGenerator();
 687 
 688         scrolled = false;
 689         scrolled2 = false;
 690         rect2.setOnScrollStarted(event -> {
 691             Assert.assertEquals(250.0, event.getSceneX(), 0.0001);
 692             Assert.assertEquals(250.0, event.getSceneY(), 0.0001);
 693             scrolled2 = true;
 694         });
 695         scene.impl_processMouseEvent(generator.generateMouseEvent(
 696                 MouseEvent.MOUSE_MOVED, 250, 250));
 697         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 698                 ScrollEvent.SCROLL_STARTED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 699                 Double.NaN, Double.NaN, Double.NaN, Double.NaN,
 700                 true, false, true, false, true, false);
 701         assertFalse(scrolled);
 702         assertTrue(scrolled2);
 703 
 704         scrolled = false;
 705         scrolled2 = false;
 706         rect2.setOnScroll(event -> {
 707             Assert.assertEquals(150.0, event.getSceneX(), 0.0001);
 708             Assert.assertEquals(150.0, event.getSceneY(), 0.0001);
 709             scrolled2 = true;
 710         });
 711         scene.impl_processMouseEvent(generator.generateMouseEvent(
 712                 MouseEvent.MOUSE_MOVED, 150, 150));
 713         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 714                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 715                 Double.NaN, Double.NaN, Double.NaN, Double.NaN,
 716                 true, false, true, false, true, false);
 717         assertFalse(scrolled);
 718         assertTrue(scrolled2);
 719 
 720         scrolled = false;
 721         scrolled2 = false;
 722         rect2.setOnScrollFinished(event -> {
 723             Assert.assertEquals(150.0, event.getSceneX(), 0.0001);
 724             Assert.assertEquals(150.0, event.getSceneY(), 0.0001);
 725             scrolled2 = true;
 726         });
 727         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 728                 ScrollEvent.SCROLL_FINISHED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 729                 Double.NaN, Double.NaN, Double.NaN, Double.NaN,
 730                 true, false, true, false, true, false);
 731         assertFalse(scrolled);
 732         assertTrue(scrolled2);
 733     }
 734 
 735     @Test
 736     public void finishedLocationShouldBeFixed() {
 737         Scene scene = createScene();
 738         Rectangle rect =
 739                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 740         rect.setOnScrollFinished(event -> {
 741             Assert.assertEquals(250.0, event.getSceneX(), 0.0001);
 742             Assert.assertEquals(250.0, event.getSceneY(), 0.0001);
 743             scrolled = true;
 744         });
 745 
 746         scrolled = false;
 747 
 748         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 749                 ScrollEvent.SCROLL_STARTED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 750                 150, 150, 150, 150, true, false, true, false, true, false);
 751 
 752         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 753                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 754                 250, 250, 250, 250, true, false, true, false, true, false);
 755 
 756         assertFalse(scrolled);
 757 
 758         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 759                 ScrollEvent.SCROLL_FINISHED, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 760                 Double.NaN, Double.NaN, Double.NaN, Double.NaN,
 761                 true, false, true, false, true, false);
 762 
 763         assertTrue(scrolled);
 764     }
 765 
 766     @Test
 767     public void unknownLocalShouldBeFixedByMousePosition() {
 768         MouseEventGenerator gen = new MouseEventGenerator();
 769         Scene scene = createScene();
 770         Rectangle rect =
 771                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 772 
 773         rect.setOnScroll(event -> {
 774             Assert.assertEquals(150.0, event.getSceneX(), 0.0001);
 775             Assert.assertEquals(150.0, event.getSceneY(), 0.0001);
 776             scrolled = true;
 777         });
 778 
 779         scrolled = false;
 780 
 781         scene.impl_processMouseEvent(
 782                 gen.generateMouseEvent(MouseEvent.MOUSE_MOVED, 250, 250));
 783 
 784         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 785                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 786                 Double.NaN, Double.NaN, Double.NaN, Double.NaN,
 787                 true, false, true, false, true, false);
 788 
 789         assertFalse(scrolled);
 790 
 791         scene.impl_processMouseEvent(
 792                 gen.generateMouseEvent(MouseEvent.MOUSE_MOVED, 150, 150));
 793 
 794         ((StubScene) scene.impl_getPeer()).getListener().scrollEvent(
 795                 ScrollEvent.SCROLL, 2, 3, 4, 6, 33, 33, 0, 1, 1, 3, 3,
 796                 Double.NaN, Double.NaN, Double.NaN, Double.NaN,
 797                 true, false, true, false, true, false);
 798 
 799         assertTrue(scrolled);
 800     }
 801 
 802     @Test public void testToString() {
 803         ScrollEvent e = new ScrollEvent(ScrollEvent.SCROLL,
 804             100, 100, 200, 200,
 805             false, false, false, false,
 806             true, false, 10, 10, 20, 20,ScrollEvent.HorizontalTextScrollUnits.NONE, 0,
 807             ScrollEvent.VerticalTextScrollUnits.NONE, 0,
 808             3, null);
 809 
 810         String s = e.toString();
 811 
 812         assertNotNull(s);
 813         assertFalse(s.isEmpty());
 814     }
 815 
 816     private Scene createScene() {
 817         final Group root = new Group();
 818         
 819         final Scene scene = new Scene(root, 400, 400);
 820 
 821         Rectangle rect = new Rectangle(100, 100, 100, 100);
 822         Rectangle rect2 = new Rectangle(200, 200, 100, 100);
 823 
 824         root.getChildren().addAll(rect, rect2);
 825 
 826         Stage stage = new Stage();
 827         stage.setScene(scene);
 828         stage.show();
 829         
 830         return scene;
 831     }
 832 }