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