| Index: components/test/data/dom_distiller/pinch_tester.js
|
| diff --git a/components/test/data/dom_distiller/pinch_tester.js b/components/test/data/dom_distiller/pinch_tester.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c804dc896e82634fe3a5b4cc8fc5379b2cc80024
|
| --- /dev/null
|
| +++ b/components/test/data/dom_distiller/pinch_tester.js
|
| @@ -0,0 +1,284 @@
|
| +var pinchtest = (function() {
|
| + 'use strict';
|
| +
|
| + function assertTrue(condition, message) {
|
| + if (!condition) {
|
| + message = message || "Assertion failed";
|
| + console.trace();
|
| + throw new Error(message);
|
| + }
|
| + }
|
| +
|
| + function assertClose(a, b, message) {
|
| + if (Math.abs(a-b) > 1e-5) {
|
| + message = message || "Assertion failed";
|
| + console.log('"', a, '" and "', b, '" are not close.');
|
| + console.trace();
|
| + throw new Error(message);
|
| + }
|
| + }
|
| +
|
| + function isEquivalent(a, b) {
|
| + // Create arrays of property names
|
| + var aProps = Object.getOwnPropertyNames(a);
|
| + var bProps = Object.getOwnPropertyNames(b);
|
| +
|
| + // If number of properties is different,
|
| + // objects are not equivalent
|
| + if (aProps.length != bProps.length) {
|
| + return false;
|
| + }
|
| +
|
| + for (var i = 0; i < aProps.length; i++) {
|
| + var propName = aProps[i];
|
| +
|
| + // If values of same property are not equal,
|
| + // objects are not equivalent
|
| + if (a[propName] !== b[propName]) {
|
| + return false;
|
| + }
|
| + }
|
| +
|
| + // If we made it this far, objects
|
| + // are considered equivalent
|
| + return true;
|
| + }
|
| +
|
| + function assertEqual(a, b, message) {
|
| + if (!isEquivalent(a, b)) {
|
| + message = message || "Assertion failed";
|
| + console.log('"', a, '" and "', b, '" are not equal');
|
| + console.trace();
|
| + throw new Error(message);
|
| + }
|
| + }
|
| +
|
| + function makeTouch(e, offset) {
|
| + for (var i=0; i < e.length; i++) {
|
| + if (typeof(e[i]) === 'number') {
|
| + e[i] = [e[i], e[i]];
|
| + }
|
| + if (Array.isArray(e[i])) {
|
| + e[i] = {clientX: e[i][0], clientY: e[i][1]};
|
| + }
|
| + if (e[i].pageX === undefined) {
|
| + e[i].pageX = e[i].clientX;
|
| + }
|
| + if (e[i].pageY === undefined) {
|
| + e[i].pageY = e[i].clientY;
|
| + }
|
| + if (Array.isArray(offset)) {
|
| + e[i].clientX += offset[0];
|
| + e[i].clientY += offset[1];
|
| + }
|
| + }
|
| + return {
|
| + touches: e,
|
| + preventDefault: function(){}
|
| + };
|
| + }
|
| +
|
| + var eNull = makeTouch([]);
|
| +
|
| + function testZoomOut() {
|
| + pincher.reset();
|
| +
|
| + // Make sure start event doesn't change state
|
| + var oldState = pincher.status();
|
| + pincher.handleTouchStart(makeTouch([100]));
|
| + assertEqual(oldState, pincher.status());
|
| + pincher.handleTouchStart(makeTouch([100, 300]));
|
| + assertEqual(oldState, pincher.status());
|
| +
|
| + // Make sure extra move event doesn't change state
|
| + pincher.handleTouchMove(makeTouch([100, 300]));
|
| + assertEqual(oldState, pincher.status());
|
| +
|
| + pincher.handleTouchMove(makeTouch([150, 250]));
|
| +
|
| + // Make sure end event doesn't change state
|
| + oldState = pincher.status();
|
| + pincher.handleTouchEnd(makeTouch([250]));
|
| + assertEqual(oldState, pincher.status());
|
| + pincher.handleTouchEnd([]);
|
| + assertEqual(oldState, pincher.status());
|
| +
|
| + assertTrue(pincher.status().clampedScale < 0.9);
|
| + }
|
| +
|
| + function testZoomIn() {
|
| + pincher.reset();
|
| +
|
| + var oldState = pincher.status();
|
| + pincher.handleTouchStart(makeTouch([150]));
|
| + assertEqual(oldState, pincher.status());
|
| + pincher.handleTouchStart(makeTouch([150, 250]));
|
| + assertEqual(oldState, pincher.status());
|
| +
|
| + pincher.handleTouchMove(makeTouch([100, 300]));
|
| +
|
| + oldState = pincher.status();
|
| + pincher.handleTouchEnd(makeTouch([100]));
|
| + assertEqual(oldState, pincher.status());
|
| + pincher.handleTouchEnd([]);
|
| + assertEqual(oldState, pincher.status());
|
| +
|
| + assertTrue(pincher.status().clampedScale > 1.1);
|
| + }
|
| +
|
| + function testZoomOutAndPan() {
|
| + pincher.reset();
|
| + pincher.handleTouchStart(makeTouch([100]));
|
| + pincher.handleTouchStart(makeTouch([100, 300]));
|
| + pincher.handleTouchMove(makeTouch([150, 250]));
|
| + pincher.handleTouchMove(makeTouch([150, 250], [10, -5]));
|
| + pincher.handleTouchEnd(makeTouch([150], [10, -5]));
|
| + pincher.handleTouchEnd([]);
|
| +
|
| + assertClose(pincher.status().shiftX, 10);
|
| + assertClose(pincher.status().shiftY, -5);
|
| + assertTrue(pincher.status().clampedScale < 0.9);
|
| + }
|
| +
|
| + function testReversible() {
|
| + pincher.reset();
|
| + pincher.handleTouchStart(makeTouch([10]));
|
| + pincher.handleTouchStart(makeTouch([10, 30]));
|
| + pincher.handleTouchMove(makeTouch([0, 40]));
|
| + pincher.handleTouchEnd(makeTouch([40]));
|
| + pincher.handleTouchEnd([]);
|
| + pincher.handleTouchStart(makeTouch([40]));
|
| + pincher.handleTouchStart(makeTouch([40, 0]));
|
| + pincher.handleTouchMove(makeTouch([30, 10]));
|
| + pincher.handleTouchEnd(makeTouch([30]));
|
| + pincher.handleTouchEnd([]);
|
| + assertClose(pincher.status().clampedScale, 1);
|
| + }
|
| +
|
| + function testMultitouchZoomOut() {
|
| + pincher.reset();
|
| +
|
| + var oldState = pincher.status();
|
| + pincher.handleTouchStart(makeTouch([100]));
|
| + assertEqual(oldState, pincher.status());
|
| + pincher.handleTouchStart(makeTouch([100, 300]));
|
| + assertEqual(oldState, pincher.status());
|
| + pincher.handleTouchStart(makeTouch([0, 100, 300]));
|
| + assertEqual(oldState, pincher.status());
|
| + pincher.handleTouchStart(makeTouch([0, 100, 300, 400]));
|
| + assertEqual(oldState, pincher.status());
|
| +
|
| + // Multi-touch zoom out.
|
| + pincher.handleTouchMove(makeTouch([100, 150, 250, 300]));
|
| +
|
| + oldState = pincher.status();
|
| + pincher.handleTouchEnd(makeTouch([100, 150, 300]));
|
| + assertEqual(oldState, pincher.status());
|
| + pincher.handleTouchEnd(makeTouch([150, 300]));
|
| + assertEqual(oldState, pincher.status());
|
| + pincher.handleTouchEnd(makeTouch([300]));
|
| + assertEqual(oldState, pincher.status());
|
| + pincher.handleTouchEnd([]);
|
| + assertEqual(oldState, pincher.status());
|
| +
|
| + assertTrue(pincher.status().clampedScale < 0.9);
|
| + }
|
| +
|
| + function testZoomOutThenMulti() {
|
| + pincher.reset();
|
| +
|
| + var oldState = pincher.status();
|
| + pincher.handleTouchStart(makeTouch([100]));
|
| + assertEqual(oldState, pincher.status());
|
| + pincher.handleTouchStart(makeTouch([100, 300]));
|
| + assertEqual(oldState, pincher.status());
|
| +
|
| + // Zoom out.
|
| + pincher.handleTouchMove(makeTouch([150, 250]));
|
| + assertTrue(pincher.status().clampedScale < 0.9);
|
| +
|
| + // Make sure adding and removing more point doesn't change state
|
| + oldState = pincher.status();
|
| + pincher.handleTouchStart(makeTouch([150, 250, 600]));
|
| + assertEqual(oldState, pincher.status());
|
| + pincher.handleTouchEnd(makeTouch([150, 250]));
|
| + assertEqual(oldState, pincher.status());
|
| +
|
| + // More than two fingers.
|
| + pincher.handleTouchStart(makeTouch([150, 250, [150, 250]]));
|
| + pincher.handleTouchStart(makeTouch([150, 250, [150, 250], [250, 150]]));
|
| + assertEqual(oldState, pincher.status());
|
| +
|
| + pincher.handleTouchMove(makeTouch([100, 300, [100, 300], [300, 100]]));
|
| + assertClose(pincher.status().scale, 1);
|
| +
|
| + oldState = pincher.status();
|
| + pincher.handleTouchEnd(makeTouch([100, 300, [100, 300]]));
|
| + assertEqual(oldState, pincher.status());
|
| + pincher.handleTouchEnd(makeTouch([100, 300]));
|
| + assertEqual(oldState, pincher.status());
|
| + pincher.handleTouchEnd(makeTouch([300]));
|
| + assertEqual(oldState, pincher.status());
|
| + }
|
| +
|
| + function testCancel() {
|
| + pincher.reset();
|
| +
|
| + pincher.handleTouchStart(makeTouch([100]));
|
| + pincher.handleTouchStart(makeTouch([100, 300]));
|
| + pincher.handleTouchMove(makeTouch([150, 250]));
|
| + assertTrue(pincher.status().clampedScale < 0.9);
|
| +
|
| + var oldState = pincher.status();
|
| + pincher.handleTouchCancel([]);
|
| + assertEqual(oldState, pincher.status());
|
| +
|
| + pincher.handleTouchStart(makeTouch([150]));
|
| + pincher.handleTouchStart(makeTouch([150, 250]));
|
| + pincher.handleTouchMove(makeTouch([100, 300]));
|
| + assertClose(pincher.status().clampedScale, 1);
|
| + }
|
| +
|
| + function testSingularity() {
|
| + pincher.reset();
|
| +
|
| + pincher.handleTouchStart(makeTouch([100]));
|
| + pincher.handleTouchStart(makeTouch([100, 100]));
|
| + pincher.handleTouchMove(makeTouch([50, 150]));
|
| + assertTrue(pincher.status().clampedScale > 1.1);
|
| + assertTrue(pincher.status().clampedScale < 100);
|
| + assertTrue(pincher.status().scale < 100);
|
| +
|
| + pincher.handleTouchCancel([]);
|
| + }
|
| +
|
| + function testMinSpan() {
|
| + pincher.reset();
|
| +
|
| + pincher.handleTouchStart(makeTouch([50]));
|
| + pincher.handleTouchStart(makeTouch([50, 150]));
|
| + pincher.handleTouchMove(makeTouch([100, 100]));
|
| + assertTrue(pincher.status().clampedScale < 0.9);
|
| + assertTrue(pincher.status().clampedScale > 0);
|
| + assertTrue(pincher.status().scale > 0);
|
| +
|
| + pincher.handleTouchCancel([]);
|
| + }
|
| +
|
| + return {
|
| + run: function(){
|
| + testZoomOut();
|
| + testZoomIn();
|
| + testZoomOutAndPan();
|
| + testReversible();
|
| + testMultitouchZoomOut();
|
| + testZoomOutThenMulti();
|
| + testCancel();
|
| + testSingularity();
|
| + testMinSpan();
|
| + pincher.reset();
|
| +
|
| + return {success: true};
|
| + }
|
| + };
|
| +}());
|
|
|