modules/graphics/src/test/java/test/javafx/scene/input/TouchEventTest.java

Print this page


   1 /*
   2  * Copyright (c) 2012, 2015, 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 test.javafx.scene.input;
  27 

  28 import test.com.sun.javafx.pgstub.StubScene;
  29 import java.util.ArrayList;
  30 import java.util.Arrays;
  31 import java.util.Random;
  32 import javafx.event.Event;
  33 import javafx.scene.Group;
  34 import javafx.scene.Scene;
  35 import javafx.scene.shape.Rectangle;
  36 import javafx.stage.Stage;
  37 import javafx.event.EventHandler;
  38 import javafx.geometry.Point3D;
  39 import javafx.scene.ParentShim;
  40 import javafx.scene.input.PickResult;
  41 import javafx.scene.input.TouchEvent;
  42 import javafx.scene.input.TouchPoint;
  43 import org.junit.Assert;
  44 import org.junit.Ignore;
  45 import org.junit.Test;
  46 import static org.junit.Assert.*;
  47 


 190                     Assert.assertEquals(true, event.isAltDown());
 191                     Assert.assertEquals(false, event.isMetaDown());
 192                     break;
 193                 case 2:
 194                     Assert.assertEquals(false, event.isShiftDown());
 195                     Assert.assertEquals(true, event.isControlDown());
 196                     Assert.assertEquals(false, event.isAltDown());
 197                     Assert.assertEquals(true, event.isMetaDown());
 198                     break;
 199                 case 3:
 200                     Assert.assertEquals(false, event.isShiftDown());
 201                     Assert.assertEquals(true, event.isControlDown());
 202                     Assert.assertEquals(true, event.isAltDown());
 203                     Assert.assertEquals(false, event.isMetaDown());
 204                     break;
 205                 default:
 206                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 207             }
 208         });
 209 
 210         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 211                 System.currentTimeMillis(), 1, true, true, false, true, false);
 212         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 213                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 214         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 215 
 216         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 217                 System.currentTimeMillis(), 1, true, false, true, false, true);
 218         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 219                 TouchPoint.State.STATIONARY, 1, 110, 110, 110, 110);
 220         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 221 
 222         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 223                 System.currentTimeMillis(), 1, true, false, true, true, false);
 224         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 225                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
 226         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 227 
 228         assertEquals(3, touched);
 229     }
 230 
 231     @Test
 232     public void shouldCountTouchesCorrectly() {
 233         Scene scene = createScene();
 234         Rectangle rect =
 235                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 236 
 237         touched = 0;
 238         rect.addEventHandler(TouchEvent.ANY, event -> {
 239             touched++;
 240             switch(touched) {
 241                 case 1:
 242                     Assert.assertEquals(1, event.getTouchCount());
 243                     Assert.assertEquals(1, event.getTouchPoints().size());
 244                     break;
 245                 case 2:
 246                 case 3:
 247                     Assert.assertEquals(2, event.getTouchCount());
 248                     Assert.assertEquals(2, event.getTouchPoints().size());
 249                     break;
 250                 case 4:
 251                 case 5:
 252                     Assert.assertEquals(2, event.getTouchCount());
 253                     Assert.assertEquals(2, event.getTouchPoints().size());
 254                     break;
 255                 case 6:
 256                     Assert.assertEquals(1, event.getTouchCount());
 257                     Assert.assertEquals(1, event.getTouchPoints().size());
 258                     break;
 259                 default:
 260                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 261             }
 262         });
 263 
 264         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 265                 System.currentTimeMillis(), 1, true, true, false, true, false);
 266         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 267                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 268         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 269 
 270         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 271                 System.currentTimeMillis(), 2, true, false, true, false, true);
 272         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 273                 TouchPoint.State.STATIONARY, 1, 110, 110, 110, 110);
 274         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 275                 TouchPoint.State.PRESSED, 2, 120, 120, 110, 110);
 276         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 277 
 278         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 279                 System.currentTimeMillis(), 2, true, false, true, true, false);
 280         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 281                 TouchPoint.State.STATIONARY, 1, 110, 110, 110, 110);
 282         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 283                 TouchPoint.State.RELEASED, 2, 120, 120, 110, 110);
 284         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 285 
 286         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 287                 System.currentTimeMillis(), 1, true, false, true, true, false);
 288         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 289                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
 290         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 291 
 292         assertEquals(6, touched);
 293     }
 294 
 295     @Test
 296     public void shouldGenerateCorrectEventSetIDs() {
 297         Scene scene = createScene();
 298         Rectangle rect =
 299                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 300 
 301         touched = 0;
 302         rect.addEventHandler(TouchEvent.ANY, event -> {
 303             touched++;
 304             switch(touched) {
 305                 case 1:
 306                     Assert.assertEquals(1, event.getEventSetId());
 307                     break;
 308                 case 2:
 309                 case 3:
 310                     Assert.assertEquals(2, event.getEventSetId());
 311                     break;
 312                 case 4:
 313                 case 5:
 314                     Assert.assertEquals(3, event.getEventSetId());
 315                     break;
 316                 case 6:
 317                     Assert.assertEquals(4, event.getEventSetId());
 318                     break;
 319                 default:
 320                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 321             }
 322         });
 323 
 324         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 325                 System.currentTimeMillis(), 1, true, true, false, true, false);
 326         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 327                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 328         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 329 
 330         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 331                 System.currentTimeMillis(), 2, true, false, true, false, true);
 332         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 333                 TouchPoint.State.STATIONARY, 1, 110, 110, 110, 110);
 334         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 335                 TouchPoint.State.PRESSED, 2, 120, 120, 110, 110);
 336         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 337 
 338         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 339                 System.currentTimeMillis(), 2, true, false, true, true, false);
 340         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 341                 TouchPoint.State.STATIONARY, 1, 110, 110, 110, 110);
 342         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 343                 TouchPoint.State.RELEASED, 2, 120, 120, 110, 110);
 344         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 345 
 346         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 347                 System.currentTimeMillis(), 1, true, false, true, true, false);
 348         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 349                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
 350         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 351 
 352         assertEquals(6, touched);
 353     }
 354 
 355     @Test
 356     public void shouldReIDTouchPoints() {
 357         Scene scene = createScene();
 358         Rectangle rect =
 359                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 360 
 361         touched = 0;
 362         rect.setOnTouchPressed(event -> {
 363             touched++;
 364             switch(event.getTouchPoint().getId()) {
 365                 case 1:
 366                     Assert.assertEquals(110.0, event.getTouchPoint().getX(), 0.0001);
 367                     Assert.assertEquals(110.0, event.getTouchPoint().getY(), 0.0001);
 368                     assertEquals(1, touched);
 369                     break;
 370                 case 2:
 371                     Assert.assertEquals(120.0, event.getTouchPoint().getX(), 0.0001);
 372                     Assert.assertEquals(120.0, event.getTouchPoint().getY(), 0.0001);
 373                     assertEquals(2, touched);
 374                     break;
 375                 case 3:
 376                     Assert.assertEquals(130.0, event.getTouchPoint().getX(), 0.0001);
 377                     Assert.assertEquals(130.0, event.getTouchPoint().getY(), 0.0001);
 378                     assertEquals(3, touched);
 379                     break;
 380                 default:
 381                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 382             }
 383         });
 384 
 385         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 386                 System.currentTimeMillis(), 3, true, false, false, false, false);
 387         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 388                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
 389         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 390                 TouchPoint.State.PRESSED, 1, 120, 120, 120, 120);
 391         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 392                 TouchPoint.State.PRESSED, 152, 130, 130, 130, 130);
 393         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 394 
 395         assertEquals(3, touched);
 396     }
 397 
 398     @Test
 399     public void shouldNotReuseTouchPointID() {
 400         Scene scene = createScene();
 401         Rectangle rect =
 402                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 403 
 404         touched = 0;
 405         rect.setOnTouchPressed(event -> {
 406             touched++;
 407             switch(event.getTouchPoint().getId()) {
 408                 case 1:
 409                     Assert.assertEquals(110.0, event.getTouchPoint().getX(), 0.0001);
 410                     Assert.assertEquals(110.0, event.getTouchPoint().getY(), 0.0001);
 411                     assertEquals(1, touched);
 412                     break;
 413                 case 2:
 414                     Assert.assertEquals(120.0, event.getTouchPoint().getX(), 0.0001);
 415                     Assert.assertEquals(120.0, event.getTouchPoint().getY(), 0.0001);
 416                     assertEquals(2, touched);
 417                     break;
 418                 case 3:
 419                     Assert.assertEquals(130.0, event.getTouchPoint().getX(), 0.0001);
 420                     Assert.assertEquals(130.0, event.getTouchPoint().getY(), 0.0001);
 421                     assertEquals(3, touched);
 422                     break;
 423                 default:
 424                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 425             }
 426         });
 427 
 428         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 429                 System.currentTimeMillis(), 2, true, false, false, false, false);
 430         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 431                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
 432         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 433                 TouchPoint.State.PRESSED, 1, 120, 120, 120, 120);
 434         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 435 
 436         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 437                 System.currentTimeMillis(), 2, true, false, false, false, false);
 438         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 439                 TouchPoint.State.STATIONARY, 1368, 110, 110, 110, 110);
 440         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 441                 TouchPoint.State.RELEASED, 1, 120, 120, 120, 120);
 442         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 443 
 444         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 445                 System.currentTimeMillis(), 2, true, false, false, false, false);
 446         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 447                 TouchPoint.State.STATIONARY, 1368, 110, 110, 110, 110);
 448         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 449                 TouchPoint.State.PRESSED, 1, 130, 130, 130, 130);
 450         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 451 
 452         assertEquals(3, touched);
 453     }
 454 
 455     @Test
 456     public void shouldMaintainPressOrder() {
 457         Scene scene = createScene();
 458         Rectangle rect =
 459                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 460 
 461         touched = 0;
 462         rect.setOnTouchPressed(event -> {
 463             touched++;
 464             switch(event.getTouchPoint().getId()) {
 465                 case 1:
 466                     Assert.assertEquals(110.0, event.getTouchPoint().getX(), 0.0001);
 467                     Assert.assertEquals(110.0, event.getTouchPoint().getY(), 0.0001);
 468                     Assert.assertEquals(1, event.getTouchPoints().get(0).getId());
 469                     Assert.assertEquals(2, event.getTouchPoints().get(1).getId());
 470                     assertEquals(1, touched);
 471                     break;
 472                 case 2:
 473                     Assert.assertEquals(120.0, event.getTouchPoint().getX(), 0.0001);
 474                     Assert.assertEquals(120.0, event.getTouchPoint().getY(), 0.0001);
 475                     Assert.assertEquals(1, event.getTouchPoints().get(0).getId());
 476                     Assert.assertEquals(2, event.getTouchPoints().get(1).getId());
 477                     assertEquals(2, touched);
 478                     break;
 479                 case 3:
 480                     Assert.assertEquals(130.0, event.getTouchPoint().getX(), 0.0001);
 481                     Assert.assertEquals(130.0, event.getTouchPoint().getY(), 0.0001);
 482                     Assert.assertEquals(1, event.getTouchPoints().get(0).getId());
 483                     Assert.assertEquals(3, event.getTouchPoints().get(1).getId());
 484                     assertEquals(3, touched);
 485                     break;
 486                 default:
 487                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 488             }
 489         });
 490 
 491         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 492                 System.currentTimeMillis(), 2, true, false, false, false, false);
 493         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 494                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
 495         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 496                 TouchPoint.State.PRESSED, 1, 120, 120, 120, 120);
 497         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 498 
 499         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 500                 System.currentTimeMillis(), 2, true, false, false, false, false);
 501         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 502                 TouchPoint.State.RELEASED, 1, 120, 120, 120, 120);
 503         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 504                 TouchPoint.State.STATIONARY, 1368, 110, 110, 110, 110);
 505         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 506 
 507         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 508                 System.currentTimeMillis(), 2, true, false, false, false, false);
 509         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 510                 TouchPoint.State.PRESSED, 1, 130, 130, 130, 130);
 511         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 512                 TouchPoint.State.STATIONARY, 1368, 110, 110, 110, 110);
 513         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 514 
 515         assertEquals(3, touched);
 516     }
 517 
 518     @Test
 519     public void shouldMaintainIDMapping() {
 520         Scene scene = createScene();
 521         Rectangle rect =
 522                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 523 
 524         touched = 0;
 525         rect.setOnTouchPressed(event -> {
 526             touched++;
 527             switch(event.getTouchPoint().getId()) {
 528                 case 1:
 529                     Assert.assertEquals(110.0, event.getTouchPoint().getX(), 0.0001);
 530                     Assert.assertEquals(110.0, event.getTouchPoint().getY(), 0.0001);
 531                     Assert.assertEquals(1, event.getTouchPoints().get(0).getId());
 532                     Assert.assertEquals(2, event.getTouchPoints().get(1).getId());
 533                     assertEquals(1, touched);


 549             switch(event.getTouchPoint().getId()) {
 550                 case 1:
 551                     Assert.assertEquals(120.0, event.getTouchPoint().getX(), 0.0001);
 552                     Assert.assertEquals(120.0, event.getTouchPoint().getY(), 0.0001);
 553                     Assert.assertEquals(1, event.getTouchPoints().get(0).getId());
 554                     Assert.assertEquals(2, event.getTouchPoints().get(1).getId());
 555                     assertEquals(3, touched);
 556                     break;
 557                 case 2:
 558                     Assert.assertEquals(110.0, event.getTouchPoint().getX(), 0.0001);
 559                     Assert.assertEquals(110.0, event.getTouchPoint().getY(), 0.0001);
 560                     Assert.assertEquals(1, event.getTouchPoints().get(0).getId());
 561                     Assert.assertEquals(2, event.getTouchPoints().get(1).getId());
 562                     assertEquals(4, touched);
 563                     break;
 564                 default:
 565                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 566             }
 567         });
 568 
 569         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 570                 System.currentTimeMillis(), 2, true, false, false, false, false);
 571         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 572                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
 573         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 574                 TouchPoint.State.PRESSED, 127, 120, 120, 120, 120);
 575         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 576 
 577         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 578                 System.currentTimeMillis(), 2, true, false, false, false, false);
 579         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 580                 TouchPoint.State.MOVED, 127, 110, 110, 110, 110);
 581         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 582                 TouchPoint.State.MOVED, 1368, 120, 120, 120, 120);
 583         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 584 
 585         assertEquals(4, touched);
 586     }
 587 
 588     @Test
 589     public void shouldMaintainIDMappingInDynamicConditions() {
 590         Scene scene = createScene();
 591         Rectangle rect =
 592                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 593 
 594         touched = 0;
 595         rect.setOnTouchPressed(event -> {
 596             touched++;
 597             switch(event.getTouchPoint().getId()) {
 598                 case 1:
 599                     Assert.assertEquals(110.0, event.getTouchPoint().getX(), 0.0001);
 600                     Assert.assertEquals(110.0, event.getTouchPoint().getY(), 0.0001);
 601                     Assert.assertEquals(1, event.getTouchPoints().get(0).getId());
 602                     Assert.assertEquals(2, event.getTouchPoints().get(1).getId());
 603                     assertEquals(1, touched);


 626             switch(event.getTouchPoint().getId()) {
 627                 case 2:
 628                     Assert.assertEquals(120.0, event.getTouchPoint().getX(), 0.0001);
 629                     Assert.assertEquals(120.0, event.getTouchPoint().getY(), 0.0001);
 630                     Assert.assertEquals(2, event.getTouchPoints().get(0).getId());
 631                     Assert.assertEquals(3, event.getTouchPoints().get(1).getId());
 632                     assertEquals(4, touched);
 633                     break;
 634                 case 3:
 635                     Assert.assertEquals(160.0, event.getTouchPoint().getX(), 0.0001);
 636                     Assert.assertEquals(160.0, event.getTouchPoint().getY(), 0.0001);
 637                     Assert.assertEquals(2, event.getTouchPoints().get(0).getId());
 638                     Assert.assertEquals(3, event.getTouchPoints().get(1).getId());
 639                     assertEquals(5, touched);
 640                     break;
 641                 default:
 642                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 643             }
 644         });
 645 
 646         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 647                 System.currentTimeMillis(), 2, true, false, false, false, false);
 648         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 649                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
 650         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 651                 TouchPoint.State.PRESSED, 127, 120, 120, 120, 120);
 652         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 653 
 654         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 655                 System.currentTimeMillis(), 2, true, false, false, false, false);
 656         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 657                 TouchPoint.State.STATIONARY, 127, 120, 120, 120, 120);
 658         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 659                 TouchPoint.State.RELEASED, 1368, 120, 120, 120, 120);
 660         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 661 
 662         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 663                 System.currentTimeMillis(), 2, true, false, false, false, false);
 664         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 665                 TouchPoint.State.PRESSED, 11, 160, 160, 160, 160);
 666         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 667                 TouchPoint.State.STATIONARY, 127, 120, 120, 120, 120);
 668         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 669 
 670         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 671                 System.currentTimeMillis(), 2, true, false, false, false, false);
 672         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 673                 TouchPoint.State.MOVED, 11, 160, 160, 160, 160);
 674         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 675                 TouchPoint.State.MOVED, 127, 120, 120, 120, 120);
 676         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 677 
 678         assertEquals(5, touched);
 679     }
 680 
 681     @Test
 682     public void shouldResetIDsAfterGesture() {
 683         Scene scene = createScene();
 684         Rectangle rect =
 685                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 686 
 687         touched = 0;
 688         rect.addEventHandler(TouchEvent.ANY, event -> {
 689             touched++;
 690             switch(touched) {
 691                 case 1:
 692                 case 2:
 693                     Assert.assertEquals(1, event.getEventSetId());
 694                     Assert.assertEquals(touched, event.getTouchPoint().getId());
 695                     break;
 696                 case 3:
 697                 case 4:
 698                     Assert.assertEquals(2, event.getEventSetId());
 699                     Assert.assertEquals(touched - 2, event.getTouchPoint().getId());
 700                     break;
 701                 case 5:
 702                 case 6:
 703                     Assert.assertEquals(1, event.getEventSetId());
 704                     Assert.assertEquals(touched - 4, event.getTouchPoint().getId());
 705                     break;
 706                 case 7:
 707                 case 8:
 708                     Assert.assertEquals(2, event.getEventSetId());
 709                     Assert.assertEquals(touched - 6, event.getTouchPoint().getId());
 710                     break;
 711                 default:
 712                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 713             }
 714         });
 715 
 716         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 717                 System.currentTimeMillis(), 2, true, true, false, true, false);
 718         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 719                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 720         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 721                 TouchPoint.State.PRESSED, 2, 120, 120, 110, 110);
 722         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 723 
 724         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 725                 System.currentTimeMillis(), 2, true, false, true, true, false);
 726         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 727                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
 728         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 729                 TouchPoint.State.RELEASED, 2, 120, 120, 110, 110);
 730         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 731 
 732         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 733                 System.currentTimeMillis(), 2, true, true, false, true, false);
 734         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 735                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 736         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 737                 TouchPoint.State.PRESSED, 2, 120, 120, 110, 110);
 738         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 739 
 740         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 741                 System.currentTimeMillis(), 2, true, false, true, true, false);
 742         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 743                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
 744         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 745                 TouchPoint.State.RELEASED, 2, 120, 120, 110, 110);
 746         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 747 
 748 
 749         assertEquals(8, touched);
 750     }
 751 
 752     @Test
 753     public void touchPointsShouldContainTouchPoint() {
 754         Scene scene = createScene();
 755         Rectangle rect =
 756                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 757 
 758         touched = 0;
 759         rect.addEventHandler(TouchEvent.ANY, event -> {
 760             touched++;
 761             switch(touched) {
 762                 case 1:
 763                 case 3:
 764                     assertSame(event.getTouchPoint(), event.getTouchPoints().get(0));
 765                     break;
 766                 case 2:
 767                 case 4:
 768                     assertSame(event.getTouchPoint(), event.getTouchPoints().get(1));
 769                     break;
 770                 default:
 771                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 772             }
 773         });
 774 
 775         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 776                 System.currentTimeMillis(), 2, true, true, false, true, false);
 777         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 778                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 779         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 780                 TouchPoint.State.PRESSED, 2, 120, 120, 110, 110);
 781         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 782 
 783         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 784                 System.currentTimeMillis(), 2, true, true, false, true, false);
 785         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 786                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
 787         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 788                 TouchPoint.State.RELEASED, 2, 120, 120, 110, 110);
 789         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 790 
 791         assertEquals(4, touched);
 792     }
 793 
 794     @Test
 795     public void touchPointsShouldHaveCorrectTarget() {
 796         Scene scene = createScene();
 797 
 798         final Rectangle rect1 =
 799                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 800 
 801         final Rectangle rect2 =
 802                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
 803 
 804         touched = 0;
 805         rect1.addEventHandler(TouchEvent.ANY, event -> {
 806             touched++;
 807             assertSame(rect1, event.getTouchPoint().getTarget());
 808             assertSame(rect2, event.getTouchPoints().get(1).getTarget());
 809         });
 810         rect2.addEventHandler(TouchEvent.ANY, event -> {
 811             touched++;
 812             assertSame(rect2, event.getTouchPoint().getTarget());
 813             assertSame(rect1, event.getTouchPoints().get(0).getTarget());
 814         });
 815 
 816         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 817                 System.currentTimeMillis(), 2, true, true, false, true, false);
 818         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 819                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 820         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 821                 TouchPoint.State.PRESSED, 2, 220, 220, 220, 220);
 822         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 823 
 824         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 825                 System.currentTimeMillis(), 2, true, true, false, true, false);
 826         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 827                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
 828         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 829                 TouchPoint.State.RELEASED, 2, 220, 220, 220, 220);
 830         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 831 
 832         assertEquals(4, touched);
 833     }
 834 
 835     @Test
 836     public void shouldCompute3dCoordinates() {
 837         Scene scene = createScene();
 838         Rectangle rect =
 839                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 840         rect.setTranslateZ(50);
 841 
 842         touched = 0;
 843         rect.addEventHandler(TouchEvent.ANY, event -> {
 844             touched++;
 845             Assert.assertEquals(110, event.getTouchPoint().getX(), 0.00001);
 846             Assert.assertEquals(110, event.getTouchPoint().getY(), 0.00001);
 847             Assert.assertEquals(0, event.getTouchPoint().getZ(), 0.00001);
 848         });
 849 
 850         scene.addEventHandler(TouchEvent.ANY, event -> {
 851             touched++;
 852             Assert.assertEquals(110, event.getTouchPoint().getX(), 0.00001);
 853             Assert.assertEquals(110, event.getTouchPoint().getY(), 0.00001);
 854             Assert.assertEquals(50, event.getTouchPoint().getZ(), 0.00001);
 855         });
 856 
 857         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 858                 System.currentTimeMillis(), 1, true, true, false, true, false);
 859         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 860                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 861         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 862 
 863         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 864                 System.currentTimeMillis(), 1, true, false, true, false, true);
 865         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 866                 TouchPoint.State.STATIONARY, 1, 110, 110, 110, 110);
 867         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 868 
 869         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 870                 System.currentTimeMillis(), 1, true, false, true, true, false);
 871         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 872                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
 873         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 874 
 875         assertEquals(6, touched);
 876     }
 877 
 878     @Test
 879     public void touchPointsShouldHaveCorrectPickResult() {
 880         Scene scene = createScene();
 881 
 882         final Rectangle rect1 =
 883                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 884 
 885         final Rectangle rect2 =
 886                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
 887 
 888         touched = 0;
 889         rect1.addEventHandler(TouchEvent.ANY, event -> {
 890             touched++;
 891             assertSame(rect1, event.getTouchPoint().getTarget());
 892             assertSame(rect2, event.getTouchPoints().get(1).getTarget());
 893             PickResult res1 = event.getTouchPoint().getPickResult();


 944                     assertEquals(0, res1.getIntersectedPoint().getZ(), 0.00001);
 945                     break;
 946                 case 4:
 947                     assertNotNull(res1);
 948                     assertSame(rect2, res1.getIntersectedNode());
 949                     assertEquals(220, res1.getIntersectedPoint().getX(), 0.00001);
 950                     assertEquals(220, res1.getIntersectedPoint().getY(), 0.00001);
 951                     assertEquals(0, res1.getIntersectedPoint().getZ(), 0.00001);
 952 
 953                     assertNotNull(res2);
 954                     assertSame(rect1, res2.getIntersectedNode());
 955                     assertEquals(110, res2.getIntersectedPoint().getX(), 0.00001);
 956                     assertEquals(110, res2.getIntersectedPoint().getY(), 0.00001);
 957                     assertEquals(0, res1.getIntersectedPoint().getZ(), 0.00001);
 958                     break;
 959                 default:
 960                     fail("Wrong event delivered");
 961             }
 962         });
 963 
 964         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 965                 System.currentTimeMillis(), 2, true, true, false, true, false);
 966         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 967                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 968         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 969                 TouchPoint.State.PRESSED, 2, 220, 220, 220, 220);
 970         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 971 
 972         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
 973                 System.currentTimeMillis(), 2, true, true, false, true, false);
 974         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 975                 TouchPoint.State.MOVED, 1, 220, 220, 220, 220);
 976         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
 977                 TouchPoint.State.MOVED, 2, 110, 110, 110, 110);
 978         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
 979 
 980         assertEquals(4, touched);
 981     }
 982 
 983     @Test
 984     public void testTouchPointsBelongsTo() {
 985         final Scene scene = createScene();
 986 
 987         final Rectangle rect1 =
 988                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 989 
 990         final Rectangle rect2 =
 991                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
 992 
 993         touched = 0;
 994         rect1.addEventHandler(TouchEvent.ANY, event -> {
 995             touched++;
 996             assertTrue(event.getTouchPoint().belongsTo(rect1));
 997             assertTrue(event.getTouchPoint().belongsTo(scene.getRoot()));
 998             assertTrue(event.getTouchPoint().belongsTo(scene));
 999             assertFalse(event.getTouchPoint().belongsTo(rect2));
1000 
1001             assertFalse(event.getTouchPoints().get(1).belongsTo(rect1));
1002             assertTrue(event.getTouchPoints().get(1).belongsTo(scene.getRoot()));
1003             assertTrue(event.getTouchPoints().get(1).belongsTo(scene));
1004             assertTrue(event.getTouchPoints().get(1).belongsTo(rect2));
1005         });
1006         rect2.addEventHandler(TouchEvent.ANY, event -> {
1007             touched++;
1008             assertTrue(event.getTouchPoint().belongsTo(rect2));
1009             assertTrue(event.getTouchPoint().belongsTo(scene.getRoot()));
1010             assertTrue(event.getTouchPoint().belongsTo(scene));
1011             assertFalse(event.getTouchPoint().belongsTo(rect1));
1012 
1013             assertFalse(event.getTouchPoints().get(0).belongsTo(rect2));
1014             assertTrue(event.getTouchPoints().get(0).belongsTo(scene.getRoot()));
1015             assertTrue(event.getTouchPoints().get(0).belongsTo(scene));
1016             assertTrue(event.getTouchPoints().get(0).belongsTo(rect1));
1017         });
1018 
1019         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1020                 System.currentTimeMillis(), 2, true, true, false, true, false);
1021         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1022                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
1023         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1024                 TouchPoint.State.PRESSED, 2, 220, 220, 220, 220);
1025         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1026 
1027         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1028                 System.currentTimeMillis(), 2, true, true, false, true, false);
1029         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1030                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
1031         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1032                 TouchPoint.State.RELEASED, 2, 220, 220, 220, 220);
1033         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1034 
1035         assertEquals(4, touched);
1036     }
1037 
1038     @Test
1039     public void shouldPickAndGrabTouchPoints() {
1040         Scene scene = createScene();
1041         final Rectangle rect1 =
1042                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1043 
1044         final Rectangle rect2 =
1045                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
1046 
1047         touched = 0;
1048         rect1.addEventHandler(TouchEvent.ANY, event -> {
1049             touched++;
1050             switch(touched) {
1051                 case 1:
1052                     Assert.assertEquals(1, event.getTouchPoint().getId());
1053                     Assert.assertEquals(150.0, event.getTouchPoint().getX(), 0.0001);


1080                     Assert.assertEquals(265.0, event.getTouchPoint().getY(), 0.0001);
1081                     Assert.assertEquals(260.0, event.getTouchPoint().getSceneX(), 0.0001);
1082                     Assert.assertEquals(265.0, event.getTouchPoint().getSceneY(), 0.0001);
1083                     Assert.assertEquals(1260.0, event.getTouchPoint().getScreenX(), 0.0001);
1084                     Assert.assertEquals(1265.0, event.getTouchPoint().getScreenY(), 0.0001);
1085                     break;
1086                 case 4:
1087                     Assert.assertEquals(2, event.getTouchPoint().getId());
1088                     Assert.assertEquals(160.0, event.getTouchPoint().getX(), 0.0001);
1089                     Assert.assertEquals(165.0, event.getTouchPoint().getY(), 0.0001);
1090                     Assert.assertEquals(160.0, event.getTouchPoint().getSceneX(), 0.0001);
1091                     Assert.assertEquals(165.0, event.getTouchPoint().getSceneY(), 0.0001);
1092                     Assert.assertEquals(1160.0, event.getTouchPoint().getScreenX(), 0.0001);
1093                     Assert.assertEquals(1165.0, event.getTouchPoint().getScreenY(), 0.0001);
1094                     break;
1095                 default:
1096                     fail("Wrong touch point delivery");
1097             }
1098         });
1099 
1100         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1101                 System.currentTimeMillis(), 2, true, true, false, true, false);
1102         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1103                 TouchPoint.State.PRESSED, 3, 150, 155, 1150, 1155);
1104         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1105                 TouchPoint.State.PRESSED, 4, 260, 265, 1260, 1265);
1106         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1107 
1108         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1109                 System.currentTimeMillis(), 2, true, true, false, true, false);
1110         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1111                 TouchPoint.State.MOVED, 3, 250, 255, 1250, 1255);
1112         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1113                 TouchPoint.State.MOVED, 4, 160, 165, 1160, 1165);
1114         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1115 
1116         assertEquals(4, touched);
1117     }
1118 
1119     @Test
1120     public void ungrabShouldEnablePickingForTouchPoints() {
1121         Scene scene = createScene();
1122         Rectangle rect1 =
1123                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1124 
1125         Rectangle rect2 =
1126                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
1127 
1128         touched = 0;
1129         rect1.addEventHandler(TouchEvent.ANY, event -> {
1130             touched++;
1131             switch(touched) {
1132                 case 1:
1133                     Assert.assertEquals(1, event.getTouchPoint().getId());
1134                     Assert.assertEquals(150.0, event.getTouchPoint().getX(), 0.0001);


1163                     Assert.assertEquals(260.0, event.getTouchPoint().getSceneX(), 0.0001);
1164                     Assert.assertEquals(265.0, event.getTouchPoint().getSceneY(), 0.0001);
1165                     Assert.assertEquals(1260.0, event.getTouchPoint().getScreenX(), 0.0001);
1166                     Assert.assertEquals(1265.0, event.getTouchPoint().getScreenY(), 0.0001);
1167                     event.getTouchPoint().ungrab();
1168                     break;
1169                 case 3:
1170                     Assert.assertEquals(1, event.getTouchPoint().getId());
1171                     Assert.assertEquals(250.0, event.getTouchPoint().getX(), 0.0001);
1172                     Assert.assertEquals(255.0, event.getTouchPoint().getY(), 0.0001);
1173                     Assert.assertEquals(250.0, event.getTouchPoint().getSceneX(), 0.0001);
1174                     Assert.assertEquals(255.0, event.getTouchPoint().getSceneY(), 0.0001);
1175                     Assert.assertEquals(1250.0, event.getTouchPoint().getScreenX(), 0.0001);
1176                     Assert.assertEquals(1255.0, event.getTouchPoint().getScreenY(), 0.0001);
1177                     break;
1178                 default:
1179                     fail("Wrong touch point delivery");
1180             }
1181         });
1182 
1183         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1184                 System.currentTimeMillis(), 2, true, true, false, true, false);
1185         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1186                 TouchPoint.State.PRESSED, 3, 150, 155, 1150, 1155);
1187         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1188                 TouchPoint.State.PRESSED, 4, 260, 265, 1260, 1265);
1189         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1190 
1191         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1192                 System.currentTimeMillis(), 2, true, true, false, true, false);
1193         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1194                 TouchPoint.State.MOVED, 3, 250, 255, 1250, 1255);
1195         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1196                 TouchPoint.State.MOVED, 4, 160, 165, 1160, 1165);
1197         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1198 
1199         assertEquals(4, touched);
1200     }
1201 
1202     @Test
1203     public void grabWithArgShouldAffectDelivery() {
1204         Scene scene = createScene();
1205         final Rectangle rect1 =
1206                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1207 
1208         final Rectangle rect2 =
1209                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
1210 
1211         touched = 0;
1212         rect1.addEventHandler(TouchEvent.ANY, event -> {
1213             touched++;
1214             switch(touched) {
1215                 case 1:
1216                     Assert.assertEquals(1, event.getTouchPoint().getId());
1217                     Assert.assertEquals(150.0, event.getTouchPoint().getX(), 0.0001);


1245             }
1246         });
1247 
1248         rect2.addEventHandler(TouchEvent.ANY, event -> {
1249             touched++;
1250             switch(touched) {
1251                 case 2:
1252                     Assert.assertEquals(2, event.getTouchPoint().getId());
1253                     Assert.assertEquals(260.0, event.getTouchPoint().getX(), 0.0001);
1254                     Assert.assertEquals(265.0, event.getTouchPoint().getY(), 0.0001);
1255                     Assert.assertEquals(260.0, event.getTouchPoint().getSceneX(), 0.0001);
1256                     Assert.assertEquals(265.0, event.getTouchPoint().getSceneY(), 0.0001);
1257                     Assert.assertEquals(1260.0, event.getTouchPoint().getScreenX(), 0.0001);
1258                     Assert.assertEquals(1265.0, event.getTouchPoint().getScreenY(), 0.0001);
1259                     break;
1260                 default:
1261                     fail("Wrong touch point delivery");
1262             }
1263         });
1264 
1265         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1266                 System.currentTimeMillis(), 2, true, true, false, true, false);
1267         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1268                 TouchPoint.State.PRESSED, 3, 150, 155, 1150, 1155);
1269         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1270                 TouchPoint.State.PRESSED, 4, 260, 265, 1260, 1265);
1271         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1272 
1273         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1274                 System.currentTimeMillis(), 2, true, true, false, true, false);
1275         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1276                 TouchPoint.State.MOVED, 3, 250, 255, 1250, 1255);
1277         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1278                 TouchPoint.State.MOVED, 4, 160, 165, 1160, 1165);
1279         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1280 
1281         assertEquals(4, touched);
1282     }
1283 
1284     @Test
1285     public void grabWithoutArgShouldAffectDelivery() {
1286         Scene scene = createScene();
1287         final Rectangle rect1 =
1288                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1289 
1290         final Rectangle rect2 =
1291                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
1292 
1293         touched = 0;
1294         rect1.addEventHandler(TouchEvent.ANY, event -> {
1295             touched++;
1296             switch(touched) {
1297                 case 1:
1298                     Assert.assertEquals(1, event.getTouchPoint().getId());
1299                     Assert.assertEquals(150.0, event.getTouchPoint().getX(), 0.0001);


1327             }
1328         });
1329 
1330         rect2.addEventHandler(TouchEvent.ANY, event -> {
1331             touched++;
1332             switch(touched) {
1333                 case 2:
1334                     Assert.assertEquals(2, event.getTouchPoint().getId());
1335                     Assert.assertEquals(260.0, event.getTouchPoint().getX(), 0.0001);
1336                     Assert.assertEquals(265.0, event.getTouchPoint().getY(), 0.0001);
1337                     Assert.assertEquals(260.0, event.getTouchPoint().getSceneX(), 0.0001);
1338                     Assert.assertEquals(265.0, event.getTouchPoint().getSceneY(), 0.0001);
1339                     Assert.assertEquals(1260.0, event.getTouchPoint().getScreenX(), 0.0001);
1340                     Assert.assertEquals(1265.0, event.getTouchPoint().getScreenY(), 0.0001);
1341                     break;
1342                 default:
1343                     fail("Wrong touch point delivery");
1344             }
1345         });
1346 
1347         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1348                 System.currentTimeMillis(), 2, true, true, false, true, false);
1349         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1350                 TouchPoint.State.PRESSED, 3, 150, 155, 1150, 1155);
1351         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1352                 TouchPoint.State.PRESSED, 4, 260, 265, 1260, 1265);
1353         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1354 
1355         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1356                 System.currentTimeMillis(), 2, true, true, false, true, false);
1357         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1358                 TouchPoint.State.MOVED, 3, 250, 255, 1250, 1255);
1359         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1360                 TouchPoint.State.MOVED, 4, 160, 165, 1160, 1165);
1361         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1362 
1363         assertEquals(4, touched);
1364     }
1365 
1366     @Test
1367     public void pointsShouldBeTransformedCorrectly() {
1368         Scene scene = createScene();
1369         Rectangle rect =
1370                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1371         rect.setTranslateX(15);
1372         rect.setTranslateY(5);
1373 
1374         touched = 0;
1375         rect.addEventHandler(TouchEvent.ANY, event -> {
1376             touched++;
1377             switch(touched) {
1378                 case 1:
1379                     Assert.assertEquals(115.0, event.getTouchPoint().getX(), 0.0001);
1380                     Assert.assertEquals(125.0, event.getTouchPoint().getY(), 0.0001);
1381                     Assert.assertEquals(130.0, event.getTouchPoint().getSceneX(), 0.0001);
1382                     Assert.assertEquals(130.0, event.getTouchPoint().getSceneY(), 0.0001);
1383                     break;
1384                 case 2:
1385                 case 3:
1386                 case 4:
1387                 case 5:
1388                     Assert.assertEquals(115.0, event.getTouchPoints().get(0).getX(), 0.0001);
1389                     Assert.assertEquals(125.0, event.getTouchPoints().get(0).getY(), 0.0001);
1390                     Assert.assertEquals(130.0, event.getTouchPoints().get(0).getSceneX(), 0.0001);
1391                     Assert.assertEquals(130.0, event.getTouchPoints().get(0).getSceneY(), 0.0001);
1392                     Assert.assertEquals(125.0, event.getTouchPoints().get(1).getX(), 0.0001);
1393                     Assert.assertEquals(135.0, event.getTouchPoints().get(1).getY(), 0.0001);
1394                     Assert.assertEquals(140.0, event.getTouchPoints().get(1).getSceneX(), 0.0001);
1395                     Assert.assertEquals(140.0, event.getTouchPoints().get(1).getSceneY(), 0.0001);
1396                     break;
1397                 default:
1398                     fail("Wrong touch point id " + event.getTouchPoint().getId());
1399             }
1400         });
1401 
1402         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1403                 System.currentTimeMillis(), 1, true, true, false, true, false);
1404         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1405                 TouchPoint.State.PRESSED, 1, 130, 130, 130, 130);
1406         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1407 
1408         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1409                 System.currentTimeMillis(), 2, true, true, false, true, false);
1410         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1411                 TouchPoint.State.STATIONARY, 1, 130, 130, 130, 130);
1412         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1413                 TouchPoint.State.PRESSED, 2, 140, 140, 140, 140);
1414         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1415 
1416         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1417                 System.currentTimeMillis(), 2, true, true, false, true, false);
1418         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1419                 TouchPoint.State.RELEASED, 1, 130, 130, 130, 130);
1420         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1421                 TouchPoint.State.RELEASED, 2, 140, 140, 140, 140);
1422         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1423 
1424 
1425         assertEquals(5, touched);
1426     }
1427 
1428     @Test
1429     public void shouldIgnoreIndirectTouchEvents() {
1430         Scene scene = createScene();
1431         Rectangle rect =
1432                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1433 
1434         rect.addEventHandler(TouchEvent.ANY, event -> fail("Delivered indirect touch event"));
1435 
1436         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1437                 System.currentTimeMillis(), 1, false, true, false, true, false);
1438         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1439                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
1440         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1441 
1442         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1443                 System.currentTimeMillis(), 1, false, true, false, true, false);
1444         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1445                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
1446         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1447     }
1448 
1449     @Test(expected=RuntimeException.class)
1450     public void shouldThrowREOnWrongSmallId() {
1451         Scene scene = createScene();
1452         Rectangle rect =
1453                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1454 
1455         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1456                 System.currentTimeMillis(), 1, true, false, false, false, false);
1457         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1458                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
1459         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1460 
1461         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1462                 System.currentTimeMillis(), 1, true, false, false, false, false);
1463         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1464                 TouchPoint.State.MOVED, 2, 110, 110, 110, 110);
1465         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1466     }
1467 
1468     @Test(expected=RuntimeException.class)
1469     public void shouldThrowREOnWrongLargeId() {
1470         Scene scene = createScene();
1471         Rectangle rect =
1472                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1473 
1474         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1475                 System.currentTimeMillis(), 1, true, false, false, false, false);
1476         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1477                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
1478         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1479 
1480         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1481                 System.currentTimeMillis(), 1, true, false, false, false, false);
1482         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1483                 TouchPoint.State.MOVED, 127, 110, 110, 110, 110);
1484         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1485     }
1486 
1487     @Test(expected=RuntimeException.class)
1488     public void shouldThrowREOnBigTPNumber() {
1489         Scene scene = createScene();
1490         Rectangle rect =
1491                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1492 
1493         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1494                 System.currentTimeMillis(), 1, true, false, false, false, false);
1495         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1496                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
1497         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1498                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
1499         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1500     }
1501 
1502     @Test(expected=RuntimeException.class)
1503     public void shouldThrowREOnSmallTPNumber() {
1504         Scene scene = createScene();
1505         Rectangle rect =
1506                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1507 
1508         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1509                 System.currentTimeMillis(), 2, true, false, false, false, false);
1510         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1511                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
1512         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1513     }
1514 
1515     @Test(expected=RuntimeException.class)
1516     public void shouldThrowREOnLostRelease() {
1517         Scene scene = createScene();
1518         Rectangle rect =
1519                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1520 
1521         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1522                 System.currentTimeMillis(), 1, true, false, false, false, false);
1523         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1524                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
1525         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1526 
1527         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1528                 System.currentTimeMillis(), 1, true, false, false, false, false);
1529         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1530                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
1531         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1532     }
1533 
1534     // Reenable once indirect events are used
1535     @Ignore("For now we've decided to ingore indirect events completely.")
1536     @Test(expected=RuntimeException.class)
1537     public void shouldThrowREOnLostIndirectRelease() {
1538         Scene scene = createScene();
1539         Rectangle rect =
1540                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1541 
1542         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1543                 System.currentTimeMillis(), 1, false, false, false, false, false);
1544         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1545                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
1546         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1547 
1548         ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1549                 System.currentTimeMillis(), 1, false, false, false, false, false);
1550         ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1551                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
1552         ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1553     }
1554 
1555     private Scene createScene() {
1556         final Group root = new Group();
1557 
1558         final Scene scene = new Scene(root, 400, 400);
1559 
1560         Rectangle rect = new Rectangle(100, 100, 100, 100);
1561         Rectangle rect2 = new Rectangle(200, 200, 100, 100);
1562 
1563         ParentShim.getChildren(root).addAll(rect, rect2);
1564 
1565         Stage stage = new Stage();
1566         stage.setScene(scene);
1567         stage.show();
1568 
1569         return scene;
1570     }
1571 
1572     @Test


1611                     }
1612                 } else {
1613                     int which = rand.nextInt(count);
1614                     int k = 0;
1615                     for (int j = 0; j < available; j++) {
1616                         if (active[j]) {
1617                             k++;
1618                             if (k == which) {
1619                                 active[j] = false;
1620                                 removed = j;
1621                                 count--;
1622                                 break;
1623                             }
1624                         }
1625                     }
1626                 }
1627             }
1628 
1629             int reporting = count + (removed >= 0 ? 1 : 0);
1630 
1631             ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1632                     System.currentTimeMillis(), reporting, true, false, false, false, false);
1633 
1634             for (int j = 0; j < available; j++) {
1635                 if (active[j] || removed == j) {
1636                     TouchPoint.State state = TouchPoint.State.MOVED;
1637                     if (added == j) {
1638                         state = TouchPoint.State.PRESSED;
1639                     } else if (removed == j) {
1640                         state = TouchPoint.State.RELEASED;
1641                     } else {
1642                     }
1643 
1644                     ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1645                             state, ids[j], 150, 150, 150, 150);
1646                 }
1647             }
1648 
1649             ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1650             removed = -1;
1651             added = -1;
1652         }
1653         long timer2 = System.currentTimeMillis();
1654         System.out.println("*************************************************");
1655         System.out.println("Benchmark1 time: " + (timer2 - timer));
1656         System.out.println("*************************************************");
1657         System.out.println("");
1658     }
1659 
1660     @Test
1661     @Ignore("This is a benchmark, not any functional test. Run it individually if you wish.")
1662     public void crazyOrderingBenchmark() {
1663         long[] ids = new long[] { 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000 };
1664         boolean[] active = new boolean[] { false, false, false, false, false,
1665                 false, false, false, false, false };
1666         int count = 0;
1667         int tick = 5;
1668         int available = 10;
1669         Random rand = new Random();


1709                     }
1710                 } else {
1711                     int which = rand.nextInt(count);
1712                     int k = 0;
1713                     for (int j = 0; j < available; j++) {
1714                         if (active[j]) {
1715                             k++;
1716                             if (k == which) {
1717                                 active[j] = false;
1718                                 removed = j;
1719                                 count--;
1720                                 break;
1721                             }
1722                         }
1723                     }
1724                 }
1725             }
1726 
1727             int reporting = count + (removed >= 0 ? 1 : 0);
1728 
1729             ((StubScene) scene.impl_getPeer()).getListener().touchEventBegin(
1730                     System.currentTimeMillis(), reporting, true, false, false, false, false);
1731 
1732             for (int j = 0; j < available; j++) {
1733                 if (active[j] || removed == j) {
1734                     TouchPoint.State state = TouchPoint.State.MOVED;
1735                     if (added == j) {
1736                         state = TouchPoint.State.PRESSED;
1737                     } else if (removed == j) {
1738                         state = TouchPoint.State.RELEASED;
1739                     }
1740 
1741                     ((StubScene) scene.impl_getPeer()).getListener().touchEventNext(
1742                             state, ids[j], 150, 150, 150, 150);
1743                 }
1744             }
1745 
1746             ((StubScene) scene.impl_getPeer()).getListener().touchEventEnd();
1747             removed = -1;
1748             added = -1;
1749         }
1750         long timer2 = System.currentTimeMillis();
1751         System.out.println("*************************************************");
1752         System.out.println("Benchmark2 time: " + (timer2 - timer));
1753         System.out.println("*************************************************");
1754         System.out.println("");
1755     }
1756 
1757 }
   1 /*
   2  * Copyright (c) 2012, 2016, 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 test.javafx.scene.input;
  27 
  28 import com.sun.javafx.scene.SceneHelper;
  29 import test.com.sun.javafx.pgstub.StubScene;
  30 import java.util.ArrayList;
  31 import java.util.Arrays;
  32 import java.util.Random;
  33 import javafx.event.Event;
  34 import javafx.scene.Group;
  35 import javafx.scene.Scene;
  36 import javafx.scene.shape.Rectangle;
  37 import javafx.stage.Stage;
  38 import javafx.event.EventHandler;
  39 import javafx.geometry.Point3D;
  40 import javafx.scene.ParentShim;
  41 import javafx.scene.input.PickResult;
  42 import javafx.scene.input.TouchEvent;
  43 import javafx.scene.input.TouchPoint;
  44 import org.junit.Assert;
  45 import org.junit.Ignore;
  46 import org.junit.Test;
  47 import static org.junit.Assert.*;
  48 


 191                     Assert.assertEquals(true, event.isAltDown());
 192                     Assert.assertEquals(false, event.isMetaDown());
 193                     break;
 194                 case 2:
 195                     Assert.assertEquals(false, event.isShiftDown());
 196                     Assert.assertEquals(true, event.isControlDown());
 197                     Assert.assertEquals(false, event.isAltDown());
 198                     Assert.assertEquals(true, event.isMetaDown());
 199                     break;
 200                 case 3:
 201                     Assert.assertEquals(false, event.isShiftDown());
 202                     Assert.assertEquals(true, event.isControlDown());
 203                     Assert.assertEquals(true, event.isAltDown());
 204                     Assert.assertEquals(false, event.isMetaDown());
 205                     break;
 206                 default:
 207                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 208             }
 209         });
 210 
 211         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 212                 System.currentTimeMillis(), 1, true, true, false, true, false);
 213         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 214                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 215         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 216 
 217         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 218                 System.currentTimeMillis(), 1, true, false, true, false, true);
 219         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 220                 TouchPoint.State.STATIONARY, 1, 110, 110, 110, 110);
 221         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 222 
 223         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 224                 System.currentTimeMillis(), 1, true, false, true, true, false);
 225         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 226                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
 227         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 228 
 229         assertEquals(3, touched);
 230     }
 231 
 232     @Test
 233     public void shouldCountTouchesCorrectly() {
 234         Scene scene = createScene();
 235         Rectangle rect =
 236                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 237 
 238         touched = 0;
 239         rect.addEventHandler(TouchEvent.ANY, event -> {
 240             touched++;
 241             switch(touched) {
 242                 case 1:
 243                     Assert.assertEquals(1, event.getTouchCount());
 244                     Assert.assertEquals(1, event.getTouchPoints().size());
 245                     break;
 246                 case 2:
 247                 case 3:
 248                     Assert.assertEquals(2, event.getTouchCount());
 249                     Assert.assertEquals(2, event.getTouchPoints().size());
 250                     break;
 251                 case 4:
 252                 case 5:
 253                     Assert.assertEquals(2, event.getTouchCount());
 254                     Assert.assertEquals(2, event.getTouchPoints().size());
 255                     break;
 256                 case 6:
 257                     Assert.assertEquals(1, event.getTouchCount());
 258                     Assert.assertEquals(1, event.getTouchPoints().size());
 259                     break;
 260                 default:
 261                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 262             }
 263         });
 264 
 265         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 266                 System.currentTimeMillis(), 1, true, true, false, true, false);
 267         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 268                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 269         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 270 
 271         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 272                 System.currentTimeMillis(), 2, true, false, true, false, true);
 273         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 274                 TouchPoint.State.STATIONARY, 1, 110, 110, 110, 110);
 275         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 276                 TouchPoint.State.PRESSED, 2, 120, 120, 110, 110);
 277         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 278 
 279         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 280                 System.currentTimeMillis(), 2, true, false, true, true, false);
 281         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 282                 TouchPoint.State.STATIONARY, 1, 110, 110, 110, 110);
 283         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 284                 TouchPoint.State.RELEASED, 2, 120, 120, 110, 110);
 285         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 286 
 287         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 288                 System.currentTimeMillis(), 1, true, false, true, true, false);
 289         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 290                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
 291         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 292 
 293         assertEquals(6, touched);
 294     }
 295 
 296     @Test
 297     public void shouldGenerateCorrectEventSetIDs() {
 298         Scene scene = createScene();
 299         Rectangle rect =
 300                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 301 
 302         touched = 0;
 303         rect.addEventHandler(TouchEvent.ANY, event -> {
 304             touched++;
 305             switch(touched) {
 306                 case 1:
 307                     Assert.assertEquals(1, event.getEventSetId());
 308                     break;
 309                 case 2:
 310                 case 3:
 311                     Assert.assertEquals(2, event.getEventSetId());
 312                     break;
 313                 case 4:
 314                 case 5:
 315                     Assert.assertEquals(3, event.getEventSetId());
 316                     break;
 317                 case 6:
 318                     Assert.assertEquals(4, event.getEventSetId());
 319                     break;
 320                 default:
 321                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 322             }
 323         });
 324 
 325         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 326                 System.currentTimeMillis(), 1, true, true, false, true, false);
 327         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 328                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 329         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 330 
 331         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 332                 System.currentTimeMillis(), 2, true, false, true, false, true);
 333         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 334                 TouchPoint.State.STATIONARY, 1, 110, 110, 110, 110);
 335         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 336                 TouchPoint.State.PRESSED, 2, 120, 120, 110, 110);
 337         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 338 
 339         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 340                 System.currentTimeMillis(), 2, true, false, true, true, false);
 341         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 342                 TouchPoint.State.STATIONARY, 1, 110, 110, 110, 110);
 343         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 344                 TouchPoint.State.RELEASED, 2, 120, 120, 110, 110);
 345         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 346 
 347         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 348                 System.currentTimeMillis(), 1, true, false, true, true, false);
 349         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 350                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
 351         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 352 
 353         assertEquals(6, touched);
 354     }
 355 
 356     @Test
 357     public void shouldReIDTouchPoints() {
 358         Scene scene = createScene();
 359         Rectangle rect =
 360                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 361 
 362         touched = 0;
 363         rect.setOnTouchPressed(event -> {
 364             touched++;
 365             switch(event.getTouchPoint().getId()) {
 366                 case 1:
 367                     Assert.assertEquals(110.0, event.getTouchPoint().getX(), 0.0001);
 368                     Assert.assertEquals(110.0, event.getTouchPoint().getY(), 0.0001);
 369                     assertEquals(1, touched);
 370                     break;
 371                 case 2:
 372                     Assert.assertEquals(120.0, event.getTouchPoint().getX(), 0.0001);
 373                     Assert.assertEquals(120.0, event.getTouchPoint().getY(), 0.0001);
 374                     assertEquals(2, touched);
 375                     break;
 376                 case 3:
 377                     Assert.assertEquals(130.0, event.getTouchPoint().getX(), 0.0001);
 378                     Assert.assertEquals(130.0, event.getTouchPoint().getY(), 0.0001);
 379                     assertEquals(3, touched);
 380                     break;
 381                 default:
 382                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 383             }
 384         });
 385 
 386         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 387                 System.currentTimeMillis(), 3, true, false, false, false, false);
 388         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 389                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
 390         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 391                 TouchPoint.State.PRESSED, 1, 120, 120, 120, 120);
 392         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 393                 TouchPoint.State.PRESSED, 152, 130, 130, 130, 130);
 394         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 395 
 396         assertEquals(3, touched);
 397     }
 398 
 399     @Test
 400     public void shouldNotReuseTouchPointID() {
 401         Scene scene = createScene();
 402         Rectangle rect =
 403                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 404 
 405         touched = 0;
 406         rect.setOnTouchPressed(event -> {
 407             touched++;
 408             switch(event.getTouchPoint().getId()) {
 409                 case 1:
 410                     Assert.assertEquals(110.0, event.getTouchPoint().getX(), 0.0001);
 411                     Assert.assertEquals(110.0, event.getTouchPoint().getY(), 0.0001);
 412                     assertEquals(1, touched);
 413                     break;
 414                 case 2:
 415                     Assert.assertEquals(120.0, event.getTouchPoint().getX(), 0.0001);
 416                     Assert.assertEquals(120.0, event.getTouchPoint().getY(), 0.0001);
 417                     assertEquals(2, touched);
 418                     break;
 419                 case 3:
 420                     Assert.assertEquals(130.0, event.getTouchPoint().getX(), 0.0001);
 421                     Assert.assertEquals(130.0, event.getTouchPoint().getY(), 0.0001);
 422                     assertEquals(3, touched);
 423                     break;
 424                 default:
 425                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 426             }
 427         });
 428 
 429         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 430                 System.currentTimeMillis(), 2, true, false, false, false, false);
 431         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 432                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
 433         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 434                 TouchPoint.State.PRESSED, 1, 120, 120, 120, 120);
 435         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 436 
 437         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 438                 System.currentTimeMillis(), 2, true, false, false, false, false);
 439         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 440                 TouchPoint.State.STATIONARY, 1368, 110, 110, 110, 110);
 441         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 442                 TouchPoint.State.RELEASED, 1, 120, 120, 120, 120);
 443         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 444 
 445         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 446                 System.currentTimeMillis(), 2, true, false, false, false, false);
 447         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 448                 TouchPoint.State.STATIONARY, 1368, 110, 110, 110, 110);
 449         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 450                 TouchPoint.State.PRESSED, 1, 130, 130, 130, 130);
 451         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 452 
 453         assertEquals(3, touched);
 454     }
 455 
 456     @Test
 457     public void shouldMaintainPressOrder() {
 458         Scene scene = createScene();
 459         Rectangle rect =
 460                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 461 
 462         touched = 0;
 463         rect.setOnTouchPressed(event -> {
 464             touched++;
 465             switch(event.getTouchPoint().getId()) {
 466                 case 1:
 467                     Assert.assertEquals(110.0, event.getTouchPoint().getX(), 0.0001);
 468                     Assert.assertEquals(110.0, event.getTouchPoint().getY(), 0.0001);
 469                     Assert.assertEquals(1, event.getTouchPoints().get(0).getId());
 470                     Assert.assertEquals(2, event.getTouchPoints().get(1).getId());
 471                     assertEquals(1, touched);
 472                     break;
 473                 case 2:
 474                     Assert.assertEquals(120.0, event.getTouchPoint().getX(), 0.0001);
 475                     Assert.assertEquals(120.0, event.getTouchPoint().getY(), 0.0001);
 476                     Assert.assertEquals(1, event.getTouchPoints().get(0).getId());
 477                     Assert.assertEquals(2, event.getTouchPoints().get(1).getId());
 478                     assertEquals(2, touched);
 479                     break;
 480                 case 3:
 481                     Assert.assertEquals(130.0, event.getTouchPoint().getX(), 0.0001);
 482                     Assert.assertEquals(130.0, event.getTouchPoint().getY(), 0.0001);
 483                     Assert.assertEquals(1, event.getTouchPoints().get(0).getId());
 484                     Assert.assertEquals(3, event.getTouchPoints().get(1).getId());
 485                     assertEquals(3, touched);
 486                     break;
 487                 default:
 488                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 489             }
 490         });
 491 
 492         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 493                 System.currentTimeMillis(), 2, true, false, false, false, false);
 494         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 495                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
 496         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 497                 TouchPoint.State.PRESSED, 1, 120, 120, 120, 120);
 498         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 499 
 500         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 501                 System.currentTimeMillis(), 2, true, false, false, false, false);
 502         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 503                 TouchPoint.State.RELEASED, 1, 120, 120, 120, 120);
 504         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 505                 TouchPoint.State.STATIONARY, 1368, 110, 110, 110, 110);
 506         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 507 
 508         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 509                 System.currentTimeMillis(), 2, true, false, false, false, false);
 510         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 511                 TouchPoint.State.PRESSED, 1, 130, 130, 130, 130);
 512         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 513                 TouchPoint.State.STATIONARY, 1368, 110, 110, 110, 110);
 514         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 515 
 516         assertEquals(3, touched);
 517     }
 518 
 519     @Test
 520     public void shouldMaintainIDMapping() {
 521         Scene scene = createScene();
 522         Rectangle rect =
 523                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 524 
 525         touched = 0;
 526         rect.setOnTouchPressed(event -> {
 527             touched++;
 528             switch(event.getTouchPoint().getId()) {
 529                 case 1:
 530                     Assert.assertEquals(110.0, event.getTouchPoint().getX(), 0.0001);
 531                     Assert.assertEquals(110.0, event.getTouchPoint().getY(), 0.0001);
 532                     Assert.assertEquals(1, event.getTouchPoints().get(0).getId());
 533                     Assert.assertEquals(2, event.getTouchPoints().get(1).getId());
 534                     assertEquals(1, touched);


 550             switch(event.getTouchPoint().getId()) {
 551                 case 1:
 552                     Assert.assertEquals(120.0, event.getTouchPoint().getX(), 0.0001);
 553                     Assert.assertEquals(120.0, event.getTouchPoint().getY(), 0.0001);
 554                     Assert.assertEquals(1, event.getTouchPoints().get(0).getId());
 555                     Assert.assertEquals(2, event.getTouchPoints().get(1).getId());
 556                     assertEquals(3, touched);
 557                     break;
 558                 case 2:
 559                     Assert.assertEquals(110.0, event.getTouchPoint().getX(), 0.0001);
 560                     Assert.assertEquals(110.0, event.getTouchPoint().getY(), 0.0001);
 561                     Assert.assertEquals(1, event.getTouchPoints().get(0).getId());
 562                     Assert.assertEquals(2, event.getTouchPoints().get(1).getId());
 563                     assertEquals(4, touched);
 564                     break;
 565                 default:
 566                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 567             }
 568         });
 569 
 570         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 571                 System.currentTimeMillis(), 2, true, false, false, false, false);
 572         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 573                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
 574         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 575                 TouchPoint.State.PRESSED, 127, 120, 120, 120, 120);
 576         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 577 
 578         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 579                 System.currentTimeMillis(), 2, true, false, false, false, false);
 580         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 581                 TouchPoint.State.MOVED, 127, 110, 110, 110, 110);
 582         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 583                 TouchPoint.State.MOVED, 1368, 120, 120, 120, 120);
 584         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 585 
 586         assertEquals(4, touched);
 587     }
 588 
 589     @Test
 590     public void shouldMaintainIDMappingInDynamicConditions() {
 591         Scene scene = createScene();
 592         Rectangle rect =
 593                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 594 
 595         touched = 0;
 596         rect.setOnTouchPressed(event -> {
 597             touched++;
 598             switch(event.getTouchPoint().getId()) {
 599                 case 1:
 600                     Assert.assertEquals(110.0, event.getTouchPoint().getX(), 0.0001);
 601                     Assert.assertEquals(110.0, event.getTouchPoint().getY(), 0.0001);
 602                     Assert.assertEquals(1, event.getTouchPoints().get(0).getId());
 603                     Assert.assertEquals(2, event.getTouchPoints().get(1).getId());
 604                     assertEquals(1, touched);


 627             switch(event.getTouchPoint().getId()) {
 628                 case 2:
 629                     Assert.assertEquals(120.0, event.getTouchPoint().getX(), 0.0001);
 630                     Assert.assertEquals(120.0, event.getTouchPoint().getY(), 0.0001);
 631                     Assert.assertEquals(2, event.getTouchPoints().get(0).getId());
 632                     Assert.assertEquals(3, event.getTouchPoints().get(1).getId());
 633                     assertEquals(4, touched);
 634                     break;
 635                 case 3:
 636                     Assert.assertEquals(160.0, event.getTouchPoint().getX(), 0.0001);
 637                     Assert.assertEquals(160.0, event.getTouchPoint().getY(), 0.0001);
 638                     Assert.assertEquals(2, event.getTouchPoints().get(0).getId());
 639                     Assert.assertEquals(3, event.getTouchPoints().get(1).getId());
 640                     assertEquals(5, touched);
 641                     break;
 642                 default:
 643                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 644             }
 645         });
 646 
 647         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 648                 System.currentTimeMillis(), 2, true, false, false, false, false);
 649         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 650                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
 651         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 652                 TouchPoint.State.PRESSED, 127, 120, 120, 120, 120);
 653         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 654 
 655         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 656                 System.currentTimeMillis(), 2, true, false, false, false, false);
 657         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 658                 TouchPoint.State.STATIONARY, 127, 120, 120, 120, 120);
 659         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 660                 TouchPoint.State.RELEASED, 1368, 120, 120, 120, 120);
 661         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 662 
 663         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 664                 System.currentTimeMillis(), 2, true, false, false, false, false);
 665         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 666                 TouchPoint.State.PRESSED, 11, 160, 160, 160, 160);
 667         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 668                 TouchPoint.State.STATIONARY, 127, 120, 120, 120, 120);
 669         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 670 
 671         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 672                 System.currentTimeMillis(), 2, true, false, false, false, false);
 673         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 674                 TouchPoint.State.MOVED, 11, 160, 160, 160, 160);
 675         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 676                 TouchPoint.State.MOVED, 127, 120, 120, 120, 120);
 677         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 678 
 679         assertEquals(5, touched);
 680     }
 681 
 682     @Test
 683     public void shouldResetIDsAfterGesture() {
 684         Scene scene = createScene();
 685         Rectangle rect =
 686                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 687 
 688         touched = 0;
 689         rect.addEventHandler(TouchEvent.ANY, event -> {
 690             touched++;
 691             switch(touched) {
 692                 case 1:
 693                 case 2:
 694                     Assert.assertEquals(1, event.getEventSetId());
 695                     Assert.assertEquals(touched, event.getTouchPoint().getId());
 696                     break;
 697                 case 3:
 698                 case 4:
 699                     Assert.assertEquals(2, event.getEventSetId());
 700                     Assert.assertEquals(touched - 2, event.getTouchPoint().getId());
 701                     break;
 702                 case 5:
 703                 case 6:
 704                     Assert.assertEquals(1, event.getEventSetId());
 705                     Assert.assertEquals(touched - 4, event.getTouchPoint().getId());
 706                     break;
 707                 case 7:
 708                 case 8:
 709                     Assert.assertEquals(2, event.getEventSetId());
 710                     Assert.assertEquals(touched - 6, event.getTouchPoint().getId());
 711                     break;
 712                 default:
 713                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 714             }
 715         });
 716 
 717         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 718                 System.currentTimeMillis(), 2, true, true, false, true, false);
 719         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 720                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 721         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 722                 TouchPoint.State.PRESSED, 2, 120, 120, 110, 110);
 723         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 724 
 725         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 726                 System.currentTimeMillis(), 2, true, false, true, true, false);
 727         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 728                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
 729         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 730                 TouchPoint.State.RELEASED, 2, 120, 120, 110, 110);
 731         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 732 
 733         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 734                 System.currentTimeMillis(), 2, true, true, false, true, false);
 735         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 736                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 737         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 738                 TouchPoint.State.PRESSED, 2, 120, 120, 110, 110);
 739         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 740 
 741         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 742                 System.currentTimeMillis(), 2, true, false, true, true, false);
 743         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 744                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
 745         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 746                 TouchPoint.State.RELEASED, 2, 120, 120, 110, 110);
 747         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 748 
 749 
 750         assertEquals(8, touched);
 751     }
 752 
 753     @Test
 754     public void touchPointsShouldContainTouchPoint() {
 755         Scene scene = createScene();
 756         Rectangle rect =
 757                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 758 
 759         touched = 0;
 760         rect.addEventHandler(TouchEvent.ANY, event -> {
 761             touched++;
 762             switch(touched) {
 763                 case 1:
 764                 case 3:
 765                     assertSame(event.getTouchPoint(), event.getTouchPoints().get(0));
 766                     break;
 767                 case 2:
 768                 case 4:
 769                     assertSame(event.getTouchPoint(), event.getTouchPoints().get(1));
 770                     break;
 771                 default:
 772                     fail("Wrong touch point id " + event.getTouchPoint().getId());
 773             }
 774         });
 775 
 776         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 777                 System.currentTimeMillis(), 2, true, true, false, true, false);
 778         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 779                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 780         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 781                 TouchPoint.State.PRESSED, 2, 120, 120, 110, 110);
 782         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 783 
 784         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 785                 System.currentTimeMillis(), 2, true, true, false, true, false);
 786         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 787                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
 788         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 789                 TouchPoint.State.RELEASED, 2, 120, 120, 110, 110);
 790         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 791 
 792         assertEquals(4, touched);
 793     }
 794 
 795     @Test
 796     public void touchPointsShouldHaveCorrectTarget() {
 797         Scene scene = createScene();
 798 
 799         final Rectangle rect1 =
 800                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 801 
 802         final Rectangle rect2 =
 803                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
 804 
 805         touched = 0;
 806         rect1.addEventHandler(TouchEvent.ANY, event -> {
 807             touched++;
 808             assertSame(rect1, event.getTouchPoint().getTarget());
 809             assertSame(rect2, event.getTouchPoints().get(1).getTarget());
 810         });
 811         rect2.addEventHandler(TouchEvent.ANY, event -> {
 812             touched++;
 813             assertSame(rect2, event.getTouchPoint().getTarget());
 814             assertSame(rect1, event.getTouchPoints().get(0).getTarget());
 815         });
 816 
 817         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 818                 System.currentTimeMillis(), 2, true, true, false, true, false);
 819         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 820                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 821         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 822                 TouchPoint.State.PRESSED, 2, 220, 220, 220, 220);
 823         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 824 
 825         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 826                 System.currentTimeMillis(), 2, true, true, false, true, false);
 827         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 828                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
 829         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 830                 TouchPoint.State.RELEASED, 2, 220, 220, 220, 220);
 831         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 832 
 833         assertEquals(4, touched);
 834     }
 835 
 836     @Test
 837     public void shouldCompute3dCoordinates() {
 838         Scene scene = createScene();
 839         Rectangle rect =
 840                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 841         rect.setTranslateZ(50);
 842 
 843         touched = 0;
 844         rect.addEventHandler(TouchEvent.ANY, event -> {
 845             touched++;
 846             Assert.assertEquals(110, event.getTouchPoint().getX(), 0.00001);
 847             Assert.assertEquals(110, event.getTouchPoint().getY(), 0.00001);
 848             Assert.assertEquals(0, event.getTouchPoint().getZ(), 0.00001);
 849         });
 850 
 851         scene.addEventHandler(TouchEvent.ANY, event -> {
 852             touched++;
 853             Assert.assertEquals(110, event.getTouchPoint().getX(), 0.00001);
 854             Assert.assertEquals(110, event.getTouchPoint().getY(), 0.00001);
 855             Assert.assertEquals(50, event.getTouchPoint().getZ(), 0.00001);
 856         });
 857 
 858         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 859                 System.currentTimeMillis(), 1, true, true, false, true, false);
 860         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 861                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 862         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 863 
 864         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 865                 System.currentTimeMillis(), 1, true, false, true, false, true);
 866         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 867                 TouchPoint.State.STATIONARY, 1, 110, 110, 110, 110);
 868         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 869 
 870         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 871                 System.currentTimeMillis(), 1, true, false, true, true, false);
 872         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 873                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
 874         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 875 
 876         assertEquals(6, touched);
 877     }
 878 
 879     @Test
 880     public void touchPointsShouldHaveCorrectPickResult() {
 881         Scene scene = createScene();
 882 
 883         final Rectangle rect1 =
 884                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 885 
 886         final Rectangle rect2 =
 887                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
 888 
 889         touched = 0;
 890         rect1.addEventHandler(TouchEvent.ANY, event -> {
 891             touched++;
 892             assertSame(rect1, event.getTouchPoint().getTarget());
 893             assertSame(rect2, event.getTouchPoints().get(1).getTarget());
 894             PickResult res1 = event.getTouchPoint().getPickResult();


 945                     assertEquals(0, res1.getIntersectedPoint().getZ(), 0.00001);
 946                     break;
 947                 case 4:
 948                     assertNotNull(res1);
 949                     assertSame(rect2, res1.getIntersectedNode());
 950                     assertEquals(220, res1.getIntersectedPoint().getX(), 0.00001);
 951                     assertEquals(220, res1.getIntersectedPoint().getY(), 0.00001);
 952                     assertEquals(0, res1.getIntersectedPoint().getZ(), 0.00001);
 953 
 954                     assertNotNull(res2);
 955                     assertSame(rect1, res2.getIntersectedNode());
 956                     assertEquals(110, res2.getIntersectedPoint().getX(), 0.00001);
 957                     assertEquals(110, res2.getIntersectedPoint().getY(), 0.00001);
 958                     assertEquals(0, res1.getIntersectedPoint().getZ(), 0.00001);
 959                     break;
 960                 default:
 961                     fail("Wrong event delivered");
 962             }
 963         });
 964 
 965         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 966                 System.currentTimeMillis(), 2, true, true, false, true, false);
 967         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 968                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
 969         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 970                 TouchPoint.State.PRESSED, 2, 220, 220, 220, 220);
 971         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 972 
 973         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
 974                 System.currentTimeMillis(), 2, true, true, false, true, false);
 975         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 976                 TouchPoint.State.MOVED, 1, 220, 220, 220, 220);
 977         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
 978                 TouchPoint.State.MOVED, 2, 110, 110, 110, 110);
 979         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
 980 
 981         assertEquals(4, touched);
 982     }
 983 
 984     @Test
 985     public void testTouchPointsBelongsTo() {
 986         final Scene scene = createScene();
 987 
 988         final Rectangle rect1 =
 989                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
 990 
 991         final Rectangle rect2 =
 992                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
 993 
 994         touched = 0;
 995         rect1.addEventHandler(TouchEvent.ANY, event -> {
 996             touched++;
 997             assertTrue(event.getTouchPoint().belongsTo(rect1));
 998             assertTrue(event.getTouchPoint().belongsTo(scene.getRoot()));
 999             assertTrue(event.getTouchPoint().belongsTo(scene));
1000             assertFalse(event.getTouchPoint().belongsTo(rect2));
1001 
1002             assertFalse(event.getTouchPoints().get(1).belongsTo(rect1));
1003             assertTrue(event.getTouchPoints().get(1).belongsTo(scene.getRoot()));
1004             assertTrue(event.getTouchPoints().get(1).belongsTo(scene));
1005             assertTrue(event.getTouchPoints().get(1).belongsTo(rect2));
1006         });
1007         rect2.addEventHandler(TouchEvent.ANY, event -> {
1008             touched++;
1009             assertTrue(event.getTouchPoint().belongsTo(rect2));
1010             assertTrue(event.getTouchPoint().belongsTo(scene.getRoot()));
1011             assertTrue(event.getTouchPoint().belongsTo(scene));
1012             assertFalse(event.getTouchPoint().belongsTo(rect1));
1013 
1014             assertFalse(event.getTouchPoints().get(0).belongsTo(rect2));
1015             assertTrue(event.getTouchPoints().get(0).belongsTo(scene.getRoot()));
1016             assertTrue(event.getTouchPoints().get(0).belongsTo(scene));
1017             assertTrue(event.getTouchPoints().get(0).belongsTo(rect1));
1018         });
1019 
1020         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1021                 System.currentTimeMillis(), 2, true, true, false, true, false);
1022         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1023                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
1024         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1025                 TouchPoint.State.PRESSED, 2, 220, 220, 220, 220);
1026         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1027 
1028         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1029                 System.currentTimeMillis(), 2, true, true, false, true, false);
1030         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1031                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
1032         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1033                 TouchPoint.State.RELEASED, 2, 220, 220, 220, 220);
1034         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1035 
1036         assertEquals(4, touched);
1037     }
1038 
1039     @Test
1040     public void shouldPickAndGrabTouchPoints() {
1041         Scene scene = createScene();
1042         final Rectangle rect1 =
1043                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1044 
1045         final Rectangle rect2 =
1046                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
1047 
1048         touched = 0;
1049         rect1.addEventHandler(TouchEvent.ANY, event -> {
1050             touched++;
1051             switch(touched) {
1052                 case 1:
1053                     Assert.assertEquals(1, event.getTouchPoint().getId());
1054                     Assert.assertEquals(150.0, event.getTouchPoint().getX(), 0.0001);


1081                     Assert.assertEquals(265.0, event.getTouchPoint().getY(), 0.0001);
1082                     Assert.assertEquals(260.0, event.getTouchPoint().getSceneX(), 0.0001);
1083                     Assert.assertEquals(265.0, event.getTouchPoint().getSceneY(), 0.0001);
1084                     Assert.assertEquals(1260.0, event.getTouchPoint().getScreenX(), 0.0001);
1085                     Assert.assertEquals(1265.0, event.getTouchPoint().getScreenY(), 0.0001);
1086                     break;
1087                 case 4:
1088                     Assert.assertEquals(2, event.getTouchPoint().getId());
1089                     Assert.assertEquals(160.0, event.getTouchPoint().getX(), 0.0001);
1090                     Assert.assertEquals(165.0, event.getTouchPoint().getY(), 0.0001);
1091                     Assert.assertEquals(160.0, event.getTouchPoint().getSceneX(), 0.0001);
1092                     Assert.assertEquals(165.0, event.getTouchPoint().getSceneY(), 0.0001);
1093                     Assert.assertEquals(1160.0, event.getTouchPoint().getScreenX(), 0.0001);
1094                     Assert.assertEquals(1165.0, event.getTouchPoint().getScreenY(), 0.0001);
1095                     break;
1096                 default:
1097                     fail("Wrong touch point delivery");
1098             }
1099         });
1100 
1101         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1102                 System.currentTimeMillis(), 2, true, true, false, true, false);
1103         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1104                 TouchPoint.State.PRESSED, 3, 150, 155, 1150, 1155);
1105         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1106                 TouchPoint.State.PRESSED, 4, 260, 265, 1260, 1265);
1107         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1108 
1109         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1110                 System.currentTimeMillis(), 2, true, true, false, true, false);
1111         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1112                 TouchPoint.State.MOVED, 3, 250, 255, 1250, 1255);
1113         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1114                 TouchPoint.State.MOVED, 4, 160, 165, 1160, 1165);
1115         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1116 
1117         assertEquals(4, touched);
1118     }
1119 
1120     @Test
1121     public void ungrabShouldEnablePickingForTouchPoints() {
1122         Scene scene = createScene();
1123         Rectangle rect1 =
1124                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1125 
1126         Rectangle rect2 =
1127                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
1128 
1129         touched = 0;
1130         rect1.addEventHandler(TouchEvent.ANY, event -> {
1131             touched++;
1132             switch(touched) {
1133                 case 1:
1134                     Assert.assertEquals(1, event.getTouchPoint().getId());
1135                     Assert.assertEquals(150.0, event.getTouchPoint().getX(), 0.0001);


1164                     Assert.assertEquals(260.0, event.getTouchPoint().getSceneX(), 0.0001);
1165                     Assert.assertEquals(265.0, event.getTouchPoint().getSceneY(), 0.0001);
1166                     Assert.assertEquals(1260.0, event.getTouchPoint().getScreenX(), 0.0001);
1167                     Assert.assertEquals(1265.0, event.getTouchPoint().getScreenY(), 0.0001);
1168                     event.getTouchPoint().ungrab();
1169                     break;
1170                 case 3:
1171                     Assert.assertEquals(1, event.getTouchPoint().getId());
1172                     Assert.assertEquals(250.0, event.getTouchPoint().getX(), 0.0001);
1173                     Assert.assertEquals(255.0, event.getTouchPoint().getY(), 0.0001);
1174                     Assert.assertEquals(250.0, event.getTouchPoint().getSceneX(), 0.0001);
1175                     Assert.assertEquals(255.0, event.getTouchPoint().getSceneY(), 0.0001);
1176                     Assert.assertEquals(1250.0, event.getTouchPoint().getScreenX(), 0.0001);
1177                     Assert.assertEquals(1255.0, event.getTouchPoint().getScreenY(), 0.0001);
1178                     break;
1179                 default:
1180                     fail("Wrong touch point delivery");
1181             }
1182         });
1183 
1184         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1185                 System.currentTimeMillis(), 2, true, true, false, true, false);
1186         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1187                 TouchPoint.State.PRESSED, 3, 150, 155, 1150, 1155);
1188         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1189                 TouchPoint.State.PRESSED, 4, 260, 265, 1260, 1265);
1190         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1191 
1192         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1193                 System.currentTimeMillis(), 2, true, true, false, true, false);
1194         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1195                 TouchPoint.State.MOVED, 3, 250, 255, 1250, 1255);
1196         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1197                 TouchPoint.State.MOVED, 4, 160, 165, 1160, 1165);
1198         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1199 
1200         assertEquals(4, touched);
1201     }
1202 
1203     @Test
1204     public void grabWithArgShouldAffectDelivery() {
1205         Scene scene = createScene();
1206         final Rectangle rect1 =
1207                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1208 
1209         final Rectangle rect2 =
1210                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
1211 
1212         touched = 0;
1213         rect1.addEventHandler(TouchEvent.ANY, event -> {
1214             touched++;
1215             switch(touched) {
1216                 case 1:
1217                     Assert.assertEquals(1, event.getTouchPoint().getId());
1218                     Assert.assertEquals(150.0, event.getTouchPoint().getX(), 0.0001);


1246             }
1247         });
1248 
1249         rect2.addEventHandler(TouchEvent.ANY, event -> {
1250             touched++;
1251             switch(touched) {
1252                 case 2:
1253                     Assert.assertEquals(2, event.getTouchPoint().getId());
1254                     Assert.assertEquals(260.0, event.getTouchPoint().getX(), 0.0001);
1255                     Assert.assertEquals(265.0, event.getTouchPoint().getY(), 0.0001);
1256                     Assert.assertEquals(260.0, event.getTouchPoint().getSceneX(), 0.0001);
1257                     Assert.assertEquals(265.0, event.getTouchPoint().getSceneY(), 0.0001);
1258                     Assert.assertEquals(1260.0, event.getTouchPoint().getScreenX(), 0.0001);
1259                     Assert.assertEquals(1265.0, event.getTouchPoint().getScreenY(), 0.0001);
1260                     break;
1261                 default:
1262                     fail("Wrong touch point delivery");
1263             }
1264         });
1265 
1266         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1267                 System.currentTimeMillis(), 2, true, true, false, true, false);
1268         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1269                 TouchPoint.State.PRESSED, 3, 150, 155, 1150, 1155);
1270         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1271                 TouchPoint.State.PRESSED, 4, 260, 265, 1260, 1265);
1272         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1273 
1274         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1275                 System.currentTimeMillis(), 2, true, true, false, true, false);
1276         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1277                 TouchPoint.State.MOVED, 3, 250, 255, 1250, 1255);
1278         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1279                 TouchPoint.State.MOVED, 4, 160, 165, 1160, 1165);
1280         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1281 
1282         assertEquals(4, touched);
1283     }
1284 
1285     @Test
1286     public void grabWithoutArgShouldAffectDelivery() {
1287         Scene scene = createScene();
1288         final Rectangle rect1 =
1289                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1290 
1291         final Rectangle rect2 =
1292                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(1);
1293 
1294         touched = 0;
1295         rect1.addEventHandler(TouchEvent.ANY, event -> {
1296             touched++;
1297             switch(touched) {
1298                 case 1:
1299                     Assert.assertEquals(1, event.getTouchPoint().getId());
1300                     Assert.assertEquals(150.0, event.getTouchPoint().getX(), 0.0001);


1328             }
1329         });
1330 
1331         rect2.addEventHandler(TouchEvent.ANY, event -> {
1332             touched++;
1333             switch(touched) {
1334                 case 2:
1335                     Assert.assertEquals(2, event.getTouchPoint().getId());
1336                     Assert.assertEquals(260.0, event.getTouchPoint().getX(), 0.0001);
1337                     Assert.assertEquals(265.0, event.getTouchPoint().getY(), 0.0001);
1338                     Assert.assertEquals(260.0, event.getTouchPoint().getSceneX(), 0.0001);
1339                     Assert.assertEquals(265.0, event.getTouchPoint().getSceneY(), 0.0001);
1340                     Assert.assertEquals(1260.0, event.getTouchPoint().getScreenX(), 0.0001);
1341                     Assert.assertEquals(1265.0, event.getTouchPoint().getScreenY(), 0.0001);
1342                     break;
1343                 default:
1344                     fail("Wrong touch point delivery");
1345             }
1346         });
1347 
1348         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1349                 System.currentTimeMillis(), 2, true, true, false, true, false);
1350         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1351                 TouchPoint.State.PRESSED, 3, 150, 155, 1150, 1155);
1352         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1353                 TouchPoint.State.PRESSED, 4, 260, 265, 1260, 1265);
1354         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1355 
1356         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1357                 System.currentTimeMillis(), 2, true, true, false, true, false);
1358         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1359                 TouchPoint.State.MOVED, 3, 250, 255, 1250, 1255);
1360         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1361                 TouchPoint.State.MOVED, 4, 160, 165, 1160, 1165);
1362         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1363 
1364         assertEquals(4, touched);
1365     }
1366 
1367     @Test
1368     public void pointsShouldBeTransformedCorrectly() {
1369         Scene scene = createScene();
1370         Rectangle rect =
1371                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1372         rect.setTranslateX(15);
1373         rect.setTranslateY(5);
1374 
1375         touched = 0;
1376         rect.addEventHandler(TouchEvent.ANY, event -> {
1377             touched++;
1378             switch(touched) {
1379                 case 1:
1380                     Assert.assertEquals(115.0, event.getTouchPoint().getX(), 0.0001);
1381                     Assert.assertEquals(125.0, event.getTouchPoint().getY(), 0.0001);
1382                     Assert.assertEquals(130.0, event.getTouchPoint().getSceneX(), 0.0001);
1383                     Assert.assertEquals(130.0, event.getTouchPoint().getSceneY(), 0.0001);
1384                     break;
1385                 case 2:
1386                 case 3:
1387                 case 4:
1388                 case 5:
1389                     Assert.assertEquals(115.0, event.getTouchPoints().get(0).getX(), 0.0001);
1390                     Assert.assertEquals(125.0, event.getTouchPoints().get(0).getY(), 0.0001);
1391                     Assert.assertEquals(130.0, event.getTouchPoints().get(0).getSceneX(), 0.0001);
1392                     Assert.assertEquals(130.0, event.getTouchPoints().get(0).getSceneY(), 0.0001);
1393                     Assert.assertEquals(125.0, event.getTouchPoints().get(1).getX(), 0.0001);
1394                     Assert.assertEquals(135.0, event.getTouchPoints().get(1).getY(), 0.0001);
1395                     Assert.assertEquals(140.0, event.getTouchPoints().get(1).getSceneX(), 0.0001);
1396                     Assert.assertEquals(140.0, event.getTouchPoints().get(1).getSceneY(), 0.0001);
1397                     break;
1398                 default:
1399                     fail("Wrong touch point id " + event.getTouchPoint().getId());
1400             }
1401         });
1402 
1403         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1404                 System.currentTimeMillis(), 1, true, true, false, true, false);
1405         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1406                 TouchPoint.State.PRESSED, 1, 130, 130, 130, 130);
1407         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1408 
1409         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1410                 System.currentTimeMillis(), 2, true, true, false, true, false);
1411         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1412                 TouchPoint.State.STATIONARY, 1, 130, 130, 130, 130);
1413         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1414                 TouchPoint.State.PRESSED, 2, 140, 140, 140, 140);
1415         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1416 
1417         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1418                 System.currentTimeMillis(), 2, true, true, false, true, false);
1419         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1420                 TouchPoint.State.RELEASED, 1, 130, 130, 130, 130);
1421         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1422                 TouchPoint.State.RELEASED, 2, 140, 140, 140, 140);
1423         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1424 
1425 
1426         assertEquals(5, touched);
1427     }
1428 
1429     @Test
1430     public void shouldIgnoreIndirectTouchEvents() {
1431         Scene scene = createScene();
1432         Rectangle rect =
1433                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1434 
1435         rect.addEventHandler(TouchEvent.ANY, event -> fail("Delivered indirect touch event"));
1436 
1437         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1438                 System.currentTimeMillis(), 1, false, true, false, true, false);
1439         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1440                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
1441         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1442 
1443         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1444                 System.currentTimeMillis(), 1, false, true, false, true, false);
1445         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1446                 TouchPoint.State.RELEASED, 1, 110, 110, 110, 110);
1447         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1448     }
1449 
1450     @Test(expected=RuntimeException.class)
1451     public void shouldThrowREOnWrongSmallId() {
1452         Scene scene = createScene();
1453         Rectangle rect =
1454                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1455 
1456         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1457                 System.currentTimeMillis(), 1, true, false, false, false, false);
1458         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1459                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
1460         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1461 
1462         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1463                 System.currentTimeMillis(), 1, true, false, false, false, false);
1464         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1465                 TouchPoint.State.MOVED, 2, 110, 110, 110, 110);
1466         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1467     }
1468 
1469     @Test(expected=RuntimeException.class)
1470     public void shouldThrowREOnWrongLargeId() {
1471         Scene scene = createScene();
1472         Rectangle rect =
1473                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1474 
1475         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1476                 System.currentTimeMillis(), 1, true, false, false, false, false);
1477         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1478                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
1479         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1480 
1481         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1482                 System.currentTimeMillis(), 1, true, false, false, false, false);
1483         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1484                 TouchPoint.State.MOVED, 127, 110, 110, 110, 110);
1485         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1486     }
1487 
1488     @Test(expected=RuntimeException.class)
1489     public void shouldThrowREOnBigTPNumber() {
1490         Scene scene = createScene();
1491         Rectangle rect =
1492                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1493 
1494         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1495                 System.currentTimeMillis(), 1, true, false, false, false, false);
1496         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1497                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
1498         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1499                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
1500         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1501     }
1502 
1503     @Test(expected=RuntimeException.class)
1504     public void shouldThrowREOnSmallTPNumber() {
1505         Scene scene = createScene();
1506         Rectangle rect =
1507                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1508 
1509         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1510                 System.currentTimeMillis(), 2, true, false, false, false, false);
1511         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1512                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
1513         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1514     }
1515 
1516     @Test(expected=RuntimeException.class)
1517     public void shouldThrowREOnLostRelease() {
1518         Scene scene = createScene();
1519         Rectangle rect =
1520                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1521 
1522         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1523                 System.currentTimeMillis(), 1, true, false, false, false, false);
1524         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1525                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
1526         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1527 
1528         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1529                 System.currentTimeMillis(), 1, true, false, false, false, false);
1530         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1531                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
1532         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1533     }
1534 
1535     // Reenable once indirect events are used
1536     @Ignore("For now we've decided to ingore indirect events completely.")
1537     @Test(expected=RuntimeException.class)
1538     public void shouldThrowREOnLostIndirectRelease() {
1539         Scene scene = createScene();
1540         Rectangle rect =
1541                 (Rectangle) scene.getRoot().getChildrenUnmodifiable().get(0);
1542 
1543         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1544                 System.currentTimeMillis(), 1, false, false, false, false, false);
1545         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1546                 TouchPoint.State.PRESSED, 1368, 110, 110, 110, 110);
1547         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1548 
1549         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1550                 System.currentTimeMillis(), 1, false, false, false, false, false);
1551         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1552                 TouchPoint.State.PRESSED, 1, 110, 110, 110, 110);
1553         ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1554     }
1555 
1556     private Scene createScene() {
1557         final Group root = new Group();
1558 
1559         final Scene scene = new Scene(root, 400, 400);
1560 
1561         Rectangle rect = new Rectangle(100, 100, 100, 100);
1562         Rectangle rect2 = new Rectangle(200, 200, 100, 100);
1563 
1564         ParentShim.getChildren(root).addAll(rect, rect2);
1565 
1566         Stage stage = new Stage();
1567         stage.setScene(scene);
1568         stage.show();
1569 
1570         return scene;
1571     }
1572 
1573     @Test


1612                     }
1613                 } else {
1614                     int which = rand.nextInt(count);
1615                     int k = 0;
1616                     for (int j = 0; j < available; j++) {
1617                         if (active[j]) {
1618                             k++;
1619                             if (k == which) {
1620                                 active[j] = false;
1621                                 removed = j;
1622                                 count--;
1623                                 break;
1624                             }
1625                         }
1626                     }
1627                 }
1628             }
1629 
1630             int reporting = count + (removed >= 0 ? 1 : 0);
1631 
1632             ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1633                     System.currentTimeMillis(), reporting, true, false, false, false, false);
1634 
1635             for (int j = 0; j < available; j++) {
1636                 if (active[j] || removed == j) {
1637                     TouchPoint.State state = TouchPoint.State.MOVED;
1638                     if (added == j) {
1639                         state = TouchPoint.State.PRESSED;
1640                     } else if (removed == j) {
1641                         state = TouchPoint.State.RELEASED;
1642                     } else {
1643                     }
1644 
1645                     ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1646                             state, ids[j], 150, 150, 150, 150);
1647                 }
1648             }
1649 
1650             ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1651             removed = -1;
1652             added = -1;
1653         }
1654         long timer2 = System.currentTimeMillis();
1655         System.out.println("*************************************************");
1656         System.out.println("Benchmark1 time: " + (timer2 - timer));
1657         System.out.println("*************************************************");
1658         System.out.println("");
1659     }
1660 
1661     @Test
1662     @Ignore("This is a benchmark, not any functional test. Run it individually if you wish.")
1663     public void crazyOrderingBenchmark() {
1664         long[] ids = new long[] { 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000 };
1665         boolean[] active = new boolean[] { false, false, false, false, false,
1666                 false, false, false, false, false };
1667         int count = 0;
1668         int tick = 5;
1669         int available = 10;
1670         Random rand = new Random();


1710                     }
1711                 } else {
1712                     int which = rand.nextInt(count);
1713                     int k = 0;
1714                     for (int j = 0; j < available; j++) {
1715                         if (active[j]) {
1716                             k++;
1717                             if (k == which) {
1718                                 active[j] = false;
1719                                 removed = j;
1720                                 count--;
1721                                 break;
1722                             }
1723                         }
1724                     }
1725                 }
1726             }
1727 
1728             int reporting = count + (removed >= 0 ? 1 : 0);
1729 
1730             ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventBegin(
1731                     System.currentTimeMillis(), reporting, true, false, false, false, false);
1732 
1733             for (int j = 0; j < available; j++) {
1734                 if (active[j] || removed == j) {
1735                     TouchPoint.State state = TouchPoint.State.MOVED;
1736                     if (added == j) {
1737                         state = TouchPoint.State.PRESSED;
1738                     } else if (removed == j) {
1739                         state = TouchPoint.State.RELEASED;
1740                     }
1741 
1742                     ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventNext(
1743                             state, ids[j], 150, 150, 150, 150);
1744                 }
1745             }
1746 
1747             ((StubScene) SceneHelper.getPeer(scene)).getListener().touchEventEnd();
1748             removed = -1;
1749             added = -1;
1750         }
1751         long timer2 = System.currentTimeMillis();
1752         System.out.println("*************************************************");
1753         System.out.println("Benchmark2 time: " + (timer2 - timer));
1754         System.out.println("*************************************************");
1755         System.out.println("");
1756     }
1757 
1758 }