scale_test.dart 5.58 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1 2 3 4
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

Adam Barth's avatar
Adam Barth committed
5
import 'package:flutter_test/flutter_test.dart';
6
import 'package:flutter/gestures.dart';
7 8 9 10 11
import 'package:test/test.dart';

void main() {
  test('Should recognize scale gestures', () {
    PointerRouter router = new PointerRouter();
Ian Hickson's avatar
Ian Hickson committed
12 13 14 15 16 17 18 19 20
    GestureArena gestureArena = new GestureArena();
    ScaleGestureRecognizer scale = new ScaleGestureRecognizer(
      router: router,
      gestureArena: gestureArena
    );
    TapGestureRecognizer tap = new TapGestureRecognizer(
      router: router,
      gestureArena: gestureArena
    );
21 22

    bool didStartScale = false;
Ian Hickson's avatar
Ian Hickson committed
23 24
    Point updatedFocalPoint;
    scale.onStart = (Point focalPoint) {
25 26 27 28 29
      didStartScale = true;
      updatedFocalPoint = focalPoint;
    };

    double updatedScale;
Ian Hickson's avatar
Ian Hickson committed
30
    scale.onUpdate = (double scale, Point focalPoint) {
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
      updatedScale = scale;
      updatedFocalPoint = focalPoint;
    };

    bool didEndScale = false;
    scale.onEnd = () {
      didEndScale = true;
    };

    bool didTap = false;
    tap.onTap = () {
      didTap = true;
    };

    TestPointer pointer1 = new TestPointer(1);

Ian Hickson's avatar
Ian Hickson committed
47
    PointerDownEvent down = pointer1.down(const Point(10.0, 10.0));
48 49 50
    scale.addPointer(down);
    tap.addPointer(down);

Ian Hickson's avatar
Ian Hickson committed
51
    gestureArena.close(1);
52 53 54 55 56 57 58 59 60 61 62 63 64 65
    expect(didStartScale, isFalse);
    expect(updatedScale, isNull);
    expect(updatedFocalPoint, isNull);
    expect(didEndScale, isFalse);
    expect(didTap, isFalse);

    // One-finger panning
    router.route(down);
    expect(didStartScale, isFalse);
    expect(updatedScale, isNull);
    expect(updatedFocalPoint, isNull);
    expect(didEndScale, isFalse);
    expect(didTap, isFalse);

Ian Hickson's avatar
Ian Hickson committed
66
    router.route(pointer1.move(const Point(20.0, 30.0)));
67 68
    expect(didStartScale, isTrue);
    didStartScale = false;
Ian Hickson's avatar
Ian Hickson committed
69
    expect(updatedFocalPoint, const Point(20.0, 30.0));
70 71 72 73 74 75 76 77
    updatedFocalPoint = null;
    expect(updatedScale, 1.0);
    updatedScale = null;
    expect(didEndScale, isFalse);
    expect(didTap, isFalse);

    // Two-finger scaling
    TestPointer pointer2 = new TestPointer(2);
Ian Hickson's avatar
Ian Hickson committed
78
    PointerDownEvent down2 = pointer2.down(const Point(10.0, 20.0));
79 80
    scale.addPointer(down2);
    tap.addPointer(down2);
Ian Hickson's avatar
Ian Hickson committed
81
    gestureArena.close(2);
82 83 84 85 86 87 88 89 90
    router.route(down2);

    expect(didEndScale, isTrue);
    didEndScale = false;
    expect(updatedScale, isNull);
    expect(updatedFocalPoint, isNull);
    expect(didStartScale, isFalse);

    // Zoom in
Ian Hickson's avatar
Ian Hickson committed
91
    router.route(pointer2.move(const Point(0.0, 10.0)));
92 93
    expect(didStartScale, isTrue);
    didStartScale = false;
Ian Hickson's avatar
Ian Hickson committed
94
    expect(updatedFocalPoint, const Point(10.0, 20.0));
95 96 97 98 99 100 101
    updatedFocalPoint = null;
    expect(updatedScale, 2.0);
    updatedScale = null;
    expect(didEndScale, isFalse);
    expect(didTap, isFalse);

    // Zoom out
Ian Hickson's avatar
Ian Hickson committed
102 103
    router.route(pointer2.move(const Point(15.0, 25.0)));
    expect(updatedFocalPoint, const Point(17.5, 27.5));
104 105 106 107 108 109 110
    updatedFocalPoint = null;
    expect(updatedScale, 0.5);
    updatedScale = null;
    expect(didTap, isFalse);

    // Three-finger scaling
    TestPointer pointer3 = new TestPointer(3);
Ian Hickson's avatar
Ian Hickson committed
111
    PointerDownEvent down3 = pointer3.down(const Point(25.0, 35.0));
112 113
    scale.addPointer(down3);
    tap.addPointer(down3);
Ian Hickson's avatar
Ian Hickson committed
114
    gestureArena.close(3);
115 116 117 118 119 120 121 122 123
    router.route(down3);

    expect(didEndScale, isTrue);
    didEndScale = false;
    expect(updatedScale, isNull);
    expect(updatedFocalPoint, isNull);
    expect(didStartScale, isFalse);

    // Zoom in
Ian Hickson's avatar
Ian Hickson committed
124
    router.route(pointer3.move(const Point(55.0, 65.0)));
125 126
    expect(didStartScale, isTrue);
    didStartScale = false;
Ian Hickson's avatar
Ian Hickson committed
127
    expect(updatedFocalPoint, const Point(30.0, 40.0));
128 129 130 131 132 133 134
    updatedFocalPoint = null;
    expect(updatedScale, 5.0);
    updatedScale = null;
    expect(didEndScale, isFalse);
    expect(didTap, isFalse);

    // Return to original positions but with different fingers
Ian Hickson's avatar
Ian Hickson committed
135 136 137
    router.route(pointer1.move(const Point(25.0, 35.0)));
    router.route(pointer2.move(const Point(20.0, 30.0)));
    router.route(pointer3.move(const Point(15.0, 25.0)));
138
    expect(didStartScale, isFalse);
Ian Hickson's avatar
Ian Hickson committed
139
    expect(updatedFocalPoint, const Point(20.0, 30.0));
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
    updatedFocalPoint = null;
    expect(updatedScale, 1.0);
    updatedScale = null;
    expect(didEndScale, isFalse);
    expect(didTap, isFalse);

    router.route(pointer1.up());
    expect(didStartScale, isFalse);
    expect(updatedFocalPoint, isNull);
    expect(updatedScale, isNull);
    expect(didEndScale, isTrue);
    didEndScale = false;
    expect(didTap, isFalse);

    // Continue scaling with two fingers
Ian Hickson's avatar
Ian Hickson committed
155
    router.route(pointer3.move(const Point(10.0, 20.0)));
156 157
    expect(didStartScale, isTrue);
    didStartScale = false;
Ian Hickson's avatar
Ian Hickson committed
158
    expect(updatedFocalPoint, const Point(15.0, 25.0));
159 160 161 162 163 164 165 166 167 168 169 170 171
    updatedFocalPoint = null;
    expect(updatedScale, 2.0);
    updatedScale = null;

    router.route(pointer2.up());
    expect(didStartScale, isFalse);
    expect(updatedFocalPoint, isNull);
    expect(updatedScale, isNull);
    expect(didEndScale, isTrue);
    didEndScale = false;
    expect(didTap, isFalse);

    // Continue panning with one finger
Ian Hickson's avatar
Ian Hickson committed
172
    router.route(pointer3.move(const Point(0.0, 0.0)));
173 174
    expect(didStartScale, isTrue);
    didStartScale = false;
Ian Hickson's avatar
Ian Hickson committed
175
    expect(updatedFocalPoint, const Point(0.0, 0.0));
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
    updatedFocalPoint = null;
    expect(updatedScale, 1.0);
    updatedScale = null;

    // We are done
    router.route(pointer3.up());
    expect(didStartScale, isFalse);
    expect(updatedFocalPoint, isNull);
    expect(updatedScale, isNull);
    expect(didEndScale, isTrue);
    didEndScale = false;
    expect(didTap, isFalse);

    scale.dispose();
    tap.dispose();
  });
}