1 /* 2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package test.robot.com.sun.glass.ui.monocle; 27 28 import com.sun.glass.ui.monocle.TestLog; 29 import test.robot.com.sun.glass.ui.monocle.ParameterizedTestBase; 30 import test.robot.com.sun.glass.ui.monocle.input.devices.TestTouchDevice; 31 import test.robot.com.sun.glass.ui.monocle.input.devices.TestTouchDevices; 32 import org.junit.*; 33 import org.junit.runners.Parameterized; 34 35 import java.util.Collection; 36 37 /** Zoom tests with two touch points */ 38 public class ZoomTest extends ParameterizedTestBase { 39 40 public ZoomTest(TestTouchDevice device) { 41 super(device); 42 } 43 44 @Parameterized.Parameters 45 public static Collection<Object[]> data() { 46 return TestTouchDevices.getTouchDeviceParameters(2); 47 } 48 49 @Before 50 public void verifyZoomEnabled() { 51 Assume.assumeTrue(Boolean.getBoolean("com.sun.javafx.gestures.zoom")); 52 } 53 54 private void tapToStopInertia() throws Exception { 55 int point1X = (int) Math.round(width * 0.1); 56 int point1Y = (int) Math.round(height * 0.3); 57 Assert.assertEquals(0, device.getPressedPoints()); 58 TestLog.reset(); 59 int p = device.addPoint(point1X, point1Y); 60 device.sync(); 61 device.removePoint(p); 62 device.sync(); 63 TestLog.waitForLog("Mouse clicked: %d, %d", point1X, point1Y); 64 } 65 66 /** 67 * Touch down two fingers, 68 * drag upper finger up in order move but not enough for zooming, 69 * drag again to zoom in (make it twice bigger) 70 */ 71 @Test 72 public void testZoomInSmallStepBigStep() throws Exception { 73 int x1 = (int) Math.round(width / 2); 74 int y1 = (int) Math.round(height * 0.3); 75 int x2 = (int) Math.round(width / 2); 76 int y2 = (int) Math.round(height * 0.7); 77 int step = (int) Math.round(height * 0.1); 78 int smallStep = (int) device.getTapRadius() + 1; 79 double threshold = 0; 80 String s = System.getProperty("com.sun.javafx.gestures.zoom.threshold"); 81 if (s != null) { 82 threshold = Double.valueOf(s); 83 } else { 84 threshold = 0.1; 85 } 86 Assume.assumeTrue(((y2 - y1) * threshold) > smallStep); 87 88 TestLog.reset(); 89 //tap two fingers 90 int p1 = device.addPoint(x1, y1); 91 int p2 = device.addPoint(x2, y2); 92 device.sync(); 93 94 //verify pressing two fingers 95 TestLog.waitForLogContaining("TouchPoint: PRESSED %d, %d", x1, y1); 96 TestLog.waitForLogContaining("TouchPoint: PRESSED %d, %d", x2, y2); 97 98 //drag upper finger up in order move but not enough for zooming 99 int newy1 = y1 - smallStep; 100 int newy2 = 0; 101 TestLog.reset(); 102 device.setPoint(p1, x1, newy1); 103 device.sync(); 104 105 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x1, newy1); 106 TestLog.waitForLogContaining("TouchPoint: STATIONARY %d, %d", x2, y2); 107 Assert.assertEquals(0, TestLog.countLogContaining("Zoom started")); 108 109 //drag upper finger up and lower down in order to zoom in 110 newy1 = y1 - step; 111 newy2 = y2 + step; 112 TestLog.reset(); 113 device.setPoint(p1, x1, newy1); 114 device.setPoint(p2, x2, newy2); 115 device.sync(); 116 double factor0 = 1.0; 117 double factor1 = (double) (newy2 - newy1)/(y2 - y1); 118 119 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x1, newy1); 120 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x2, newy2); 121 TestLog.waitForLogContaining("Zoom started, factor: " + factor0 122 + ", total factor: " + factor0 + ", inertia value: false"); 123 TestLog.waitForLogContaining("Zoom, factor: " + factor1 124 + ", total factor: " + factor1 + ", inertia value: false"); 125 126 step = step * 2; 127 newy1 = y1 - step; 128 newy2 = y2 + step; 129 TestLog.reset(); 130 device.setPoint(p1, x1, newy1); 131 device.setPoint(p2, x2, newy2); 132 device.sync(); 133 double factor2 = (double) (newy2 - newy1)/(y2 - y1 + step); 134 135 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x1, newy1); 136 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x2, newy2); 137 TestLog.waitForLogContaining("Zoom, factor: " + factor2 138 + ", total factor: " + (factor1 * factor2) 139 + ", inertia value: false"); 140 141 //release first finger 142 TestLog.reset(); 143 device.removePoint(p1); 144 device.sync(); 145 TestLog.waitForLogContaining("TouchPoint: RELEASED %d, %d", x1, newy1); 146 TestLog.waitForLogContaining("TouchPoint: STATIONARY %d, %d", x2, newy2); 147 TestLog.waitForLogContaining("Zoom finished, factor: " + factor0 148 + ", total factor: " + (factor1 * factor2) 149 + ", inertia value: false"); 150 //release second finger 151 TestLog.reset(); 152 device.removePoint(p2); 153 device.sync(); 154 TestLog.waitForLogContaining("Touch released: %d, %d", x2, newy2); 155 TestLog.waitForLogContaining("TouchPoint: RELEASED %d, %d", x2, newy2); 156 TestLog.waitForLog("Mouse released: %d, %d", x2, newy2); 157 TestLog.waitForLog("Mouse clicked: %d, %d", x2, newy2); 158 Assert.assertEquals(1, TestLog.countLogContaining("Mouse clicked: " 159 + x2 +", " + newy2)); 160 tapToStopInertia(); 161 } 162 163 /** 164 * Touch down two fingers, zoom in (make it twice bigger) 165 */ 166 @Test 167 public void testZoomIn() throws Exception { 168 int x1 = (int) Math.round(width / 2); 169 int y1 = (int) Math.round(height * 0.3); 170 int x2 = (int) Math.round(width / 2); 171 int y2 = (int) Math.round(height * 0.7); 172 int step = (int) Math.round(height * 0.1); 173 174 TestLog.reset(); 175 //tap two fingers 176 int p1 = device.addPoint(x1, y1); 177 int p2 = device.addPoint(x2, y2); 178 device.sync(); 179 180 //verify pressing two fingers 181 TestLog.waitForLogContaining("TouchPoint: PRESSED %d, %d", x1, y1); 182 TestLog.waitForLogContaining("TouchPoint: PRESSED %d, %d", x2, y2); 183 184 //drag upper finger up and lower down in order to zoom in 185 int newy1 = y1 - step; 186 int newy2 = y2 + step; 187 TestLog.reset(); 188 device.setPoint(p1, x1, newy1); 189 device.setPoint(p2, x2, newy2); 190 device.sync(); 191 double factor0 = 1.0; 192 double factor1 = (double) (newy2 - newy1)/(y2 - y1); 193 194 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x1, newy1); 195 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x2, newy2); 196 TestLog.waitForLogContaining("Zoom started, factor: " + factor0 197 + ", total factor: " + factor0 + ", inertia value: false"); 198 TestLog.waitForLogContaining("Zoom, factor: " + factor1 199 + ", total factor: " + factor1 + ", inertia value: false"); 200 201 step = step * 2; 202 newy1 = y1 - step; 203 newy2 = y2 + step; 204 TestLog.reset(); 205 device.setPoint(p1, x1, newy1); 206 device.setPoint(p2, x2, newy2); 207 device.sync(); 208 double factor2 = (double) (newy2 - newy1)/(y2 - y1 + step); 209 210 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x1, newy1); 211 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x2, newy2); 212 TestLog.waitForLogContaining("Zoom, factor: " + factor2 213 + ", total factor: " + (factor1 * factor2) 214 + ", inertia value: false"); 215 216 //release first finger 217 TestLog.reset(); 218 device.removePoint(p1); 219 device.sync(); 220 TestLog.waitForLogContaining("TouchPoint: RELEASED %d, %d", 221 x1, newy1); 222 TestLog.waitForLogContaining("TouchPoint: STATIONARY %d, %d", 223 x2, newy2); 224 TestLog.waitForLogContaining("Zoom finished, factor: " + factor0 225 + ", total factor: " + (factor1 * factor2) 226 + ", inertia value: false"); 227 228 //release second finger 229 TestLog.reset(); 230 device.removePoint(p2); 231 device.sync(); 232 TestLog.waitForLogContaining("Touch released: %d, %d", x2, newy2); 233 TestLog.waitForLogContaining("TouchPoint: RELEASED %d, %d", 234 x2, newy2); 235 TestLog.waitForLog("Mouse released: %d, %d", x2, newy2); 236 TestLog.waitForLog("Mouse clicked: %d, %d", x2, newy2); 237 Assert.assertEquals(1, TestLog.countLogContaining("Mouse clicked: " 238 + x2 +", " + newy2)); 239 tapToStopInertia(); 240 } 241 242 /** 243 * Touch down two fingers, zoom out (make it quarter of original size) 244 */ 245 @Test 246 public void testZoomOut() throws Exception { 247 int x1 = (int) Math.round(width / 2); 248 int y1 = (int) Math.round(height * 0.1); 249 int x2 = (int) Math.round(width / 2); 250 int y2 = (int) Math.round(height * 0.9); 251 int step = (int) Math.round(height * 0.1); 252 double factor0 = 1.0; 253 254 //tap two fingers 255 TestLog.reset(); 256 int p1 = device.addPoint(x1, y1); 257 int p2 = device.addPoint(x2, y2); 258 device.sync(); 259 260 //verify pressing two fingers 261 TestLog.waitForLogContaining("TouchPoint: PRESSED %d, %d", x1, y1); 262 TestLog.waitForLogContaining("TouchPoint: PRESSED %d, %d", x2, y2); 263 264 //drag upper finger down and lower - up, in order to zoom out 265 TestLog.reset(); 266 int newy1 = y1 + step; 267 int newy2 = y2 - step; 268 device.setPoint(p1, x1, newy1); 269 device.setPoint(p2, x2, newy2); 270 device.sync(); 271 double factor1 = (double) (newy2 - newy1)/(y2 - y1); 272 273 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x1, newy1); 274 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x2, newy2); 275 TestLog.waitForLogContaining("Zoom started, factor: " + factor0 276 + ", total factor: " + factor0 + ", inertia value: false"); 277 TestLog.waitForLogContaining("Zoom, factor: " + factor1 278 + ", total factor: " + factor1 + ", inertia value: false"); 279 280 TestLog.reset(); 281 y1 = y1 + step; 282 y2 = y2 - step; 283 newy1 = y1 + step; 284 newy2 = y2 - step; 285 286 device.setPoint(p1, x1, newy1); 287 device.setPoint(p2, x2, newy2); 288 device.sync(); 289 double factor2 = (double) (newy2 - newy1)/(y2 - y1); 290 291 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x1, newy1); 292 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x2, newy2); 293 TestLog.waitForLogContaining("Zoom, factor: " + factor2 294 + ", total factor: " + (factor1 * factor2) 295 + ", inertia value: false"); 296 297 TestLog.reset(); 298 y1 = y1 + step; 299 y2 = y2 - step; 300 newy1 = y1 + step; 301 newy2 = y2 - step; 302 303 device.setPoint(p1, x1, newy1); 304 device.setPoint(p2, x2, newy2); 305 device.sync(); 306 double factor3 = (double) (newy2 - newy1)/(y2 - y1); 307 308 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x1, newy1); 309 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x2, newy2); 310 TestLog.waitForLogContaining("Zoom, factor: " + factor3 311 + ", total factor: " + (factor1 * factor2 * factor3) 312 + ", inertia value: false"); 313 314 //release first finger 315 TestLog.reset(); 316 device.removePoint(p1); 317 device.sync(); 318 TestLog.waitForLogContaining("TouchPoint: RELEASED %d, %d", 319 x1, newy1); 320 TestLog.waitForLogContaining("TouchPoint: STATIONARY %d, %d", 321 x2, newy2); 322 TestLog.waitForLogContaining("Zoom finished, factor: " + factor0 323 + ", total factor: " + (factor1 * factor2 * factor3) 324 + ", inertia value: false"); 325 326 //release second finger 327 TestLog.reset(); 328 device.removePoint(p2); 329 device.sync(); 330 TestLog.waitForLogContaining("Touch released: %d, %d", x2, newy2); 331 TestLog.waitForLogContaining("TouchPoint: RELEASED %d, %d", 332 x2, newy2); 333 TestLog.waitForLog("Mouse released: %d, %d", x2, newy2); 334 TestLog.waitForLog("Mouse clicked: %d, %d", x2, newy2); 335 Assert.assertEquals(1, TestLog.countLogContaining("Mouse clicked: " 336 + x2 +", " + newy2)); 337 tapToStopInertia(); 338 } 339 340 /** 341 * Touch down two fingers, 342 * drag upper finger down in order move but not enough for zooming, 343 * drag again to zoom out (quarter of original size) 344 */ 345 @Test 346 public void testZoomOutSmallStepBigStep() throws Exception { 347 int x1 = (int) Math.round(width / 2); 348 int y1 = (int) Math.round(height * 0.1); 349 int x2 = (int) Math.round(width / 2); 350 int y2 = (int) Math.round(height * 0.9); 351 int step = (int) Math.round(height * 0.1); 352 int smallStep = (int) device.getTapRadius() + 1; 353 double threshold = 0; 354 String s = System.getProperty("com.sun.javafx.gestures.zoom.threshold"); 355 if (s != null) { 356 threshold = Double.valueOf(s); 357 } else { 358 threshold = 0.1; 359 } 360 Assume.assumeTrue(((y2 - y1) * threshold) > smallStep); 361 double factor0 = 1.0; 362 363 TestLog.reset(); 364 //tap two fingers 365 int p1 = device.addPoint(x1, y1); 366 int p2 = device.addPoint(x2, y2); 367 device.sync(); 368 369 //verify pressing two fingers 370 TestLog.waitForLogContaining("TouchPoint: PRESSED %d, %d", x1, y1); 371 TestLog.waitForLogContaining("TouchPoint: PRESSED %d, %d", x2, y2); 372 373 //drag upper finger down in order move but not enough for zooming 374 TestLog.reset(); 375 int newy1 = y1 + smallStep; 376 int newy2 = 0; 377 378 device.setPoint(p1, x1, newy1); 379 device.sync(); 380 381 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x1, newy1); 382 TestLog.waitForLogContaining("TouchPoint: STATIONARY %d, %d", x2, y2); 383 Assert.assertEquals(0, TestLog.countLogContaining("Zoom started")); 384 385 //drag upper finger up and lower down in order to zoom in 386 TestLog.reset(); 387 newy1 = y1 + step; 388 newy2 = y2 - step; 389 device.setPoint(p1, x1, newy1); 390 device.setPoint(p2, x2, newy2); 391 device.sync(); 392 double factor1 = (double) (newy2 - newy1)/(y2 - y1); 393 394 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x1, newy1); 395 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x2, newy2); 396 TestLog.waitForLogContaining("Zoom started, factor: " + factor0 397 + ", total factor: " + factor0 + ", inertia value: false"); 398 TestLog.waitForLogContaining("Zoom, factor: " + factor1 399 + ", total factor: " + factor1 + ", inertia value: false"); 400 TestLog.reset(); 401 y1 = y1 + step; 402 y2 = y2 - step; 403 newy1 = y1 + step; 404 newy2 = y2 - step; 405 device.setPoint(p1, x1, newy1); 406 device.setPoint(p2, x2, newy2); 407 device.sync(); 408 double factor2 = (double) (newy2 - newy1)/(y2 - y1); 409 410 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x1, newy1); 411 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x2, newy2); 412 TestLog.waitForLogContaining("Zoom, factor: " + factor2 413 + ", total factor: " + (factor1 * factor2) 414 + ", inertia value: false"); 415 416 TestLog.reset(); 417 y1 = y1 + step; 418 y2 = y2 - step; 419 newy1 = y1 + step; 420 newy2 = y2 - step; 421 device.setPoint(p1, x1, newy1); 422 device.setPoint(p2, x2, newy2); 423 device.sync(); 424 double factor3 = (double) (newy2 - newy1)/(y2 - y1); 425 426 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x1, newy1); 427 TestLog.waitForLogContaining("TouchPoint: MOVED %d, %d", x2, newy2); 428 TestLog.waitForLogContaining("Zoom, factor: " + factor3 429 + ", total factor: " + (factor1 * factor2 * factor3) 430 + ", inertia value: false"); 431 432 //release first finger 433 TestLog.reset(); 434 device.removePoint(p1); 435 device.sync(); 436 TestLog.waitForLogContaining("TouchPoint: RELEASED %d, %d", 437 x1, newy1); 438 TestLog.waitForLogContaining("TouchPoint: STATIONARY %d, %d", 439 x2, newy2); 440 TestLog.waitForLogContaining("Zoom finished, factor: " + factor0 441 + ", total factor: " + (factor1 * factor2 * factor3) 442 + ", inertia value: false"); 443 444 //release second finger 445 TestLog.reset(); 446 device.removePoint(p2); 447 device.sync(); 448 TestLog.waitForLogContaining("Touch released: %d, %d", x2, newy2); 449 TestLog.waitForLogContaining("TouchPoint: RELEASED %d, %d", 450 x2, newy2); 451 TestLog.waitForLog("Mouse released: %d, %d", x2, newy2); 452 TestLog.waitForLog("Mouse clicked: %d, %d", x2, newy2); 453 Assert.assertEquals(1, TestLog.countLogContaining("Mouse clicked: " 454 + x2 +", " + newy2)); 455 tapToStopInertia(); 456 } 457 }