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