188 lines
5.5 KiB
Dart

// 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.
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/gestures.dart';
import 'gesture_tester.dart';
void main() {
setUp(ensureGestureBinding);
testGesture('Should recognize scale gestures', (GestureTester tester) {
ScaleGestureRecognizer scale = new ScaleGestureRecognizer();
TapGestureRecognizer tap = new TapGestureRecognizer();
bool didStartScale = false;
Point updatedFocalPoint;
scale.onStart = (ScaleStartDetails details) {
didStartScale = true;
updatedFocalPoint = details.focalPoint;
};
double updatedScale;
scale.onUpdate = (ScaleUpdateDetails details) {
updatedScale = details.scale;
updatedFocalPoint = details.focalPoint;
};
bool didEndScale = false;
scale.onEnd = (ScaleEndDetails details) {
didEndScale = true;
};
bool didTap = false;
tap.onTap = () {
didTap = true;
};
TestPointer pointer1 = new TestPointer(1);
PointerDownEvent down = pointer1.down(const Point(10.0, 10.0));
scale.addPointer(down);
tap.addPointer(down);
tester.closeArena(1);
expect(didStartScale, isFalse);
expect(updatedScale, isNull);
expect(updatedFocalPoint, isNull);
expect(didEndScale, isFalse);
expect(didTap, isFalse);
// One-finger panning
tester.route(down);
expect(didStartScale, isFalse);
expect(updatedScale, isNull);
expect(updatedFocalPoint, isNull);
expect(didEndScale, isFalse);
expect(didTap, isFalse);
tester.route(pointer1.move(const Point(20.0, 30.0)));
expect(didStartScale, isTrue);
didStartScale = false;
expect(updatedFocalPoint, const Point(20.0, 30.0));
updatedFocalPoint = null;
expect(updatedScale, 1.0);
updatedScale = null;
expect(didEndScale, isFalse);
expect(didTap, isFalse);
// Two-finger scaling
TestPointer pointer2 = new TestPointer(2);
PointerDownEvent down2 = pointer2.down(const Point(10.0, 20.0));
scale.addPointer(down2);
tap.addPointer(down2);
tester.closeArena(2);
tester.route(down2);
expect(didEndScale, isTrue);
didEndScale = false;
expect(updatedScale, isNull);
expect(updatedFocalPoint, isNull);
expect(didStartScale, isFalse);
// Zoom in
tester.route(pointer2.move(const Point(0.0, 10.0)));
expect(didStartScale, isTrue);
didStartScale = false;
expect(updatedFocalPoint, const Point(10.0, 20.0));
updatedFocalPoint = null;
expect(updatedScale, 2.0);
updatedScale = null;
expect(didEndScale, isFalse);
expect(didTap, isFalse);
// Zoom out
tester.route(pointer2.move(const Point(15.0, 25.0)));
expect(updatedFocalPoint, const Point(17.5, 27.5));
updatedFocalPoint = null;
expect(updatedScale, 0.5);
updatedScale = null;
expect(didTap, isFalse);
// Three-finger scaling
TestPointer pointer3 = new TestPointer(3);
PointerDownEvent down3 = pointer3.down(const Point(25.0, 35.0));
scale.addPointer(down3);
tap.addPointer(down3);
tester.closeArena(3);
tester.route(down3);
expect(didEndScale, isTrue);
didEndScale = false;
expect(updatedScale, isNull);
expect(updatedFocalPoint, isNull);
expect(didStartScale, isFalse);
// Zoom in
tester.route(pointer3.move(const Point(55.0, 65.0)));
expect(didStartScale, isTrue);
didStartScale = false;
expect(updatedFocalPoint, const Point(30.0, 40.0));
updatedFocalPoint = null;
expect(updatedScale, 5.0);
updatedScale = null;
expect(didEndScale, isFalse);
expect(didTap, isFalse);
// Return to original positions but with different fingers
tester.route(pointer1.move(const Point(25.0, 35.0)));
tester.route(pointer2.move(const Point(20.0, 30.0)));
tester.route(pointer3.move(const Point(15.0, 25.0)));
expect(didStartScale, isFalse);
expect(updatedFocalPoint, const Point(20.0, 30.0));
updatedFocalPoint = null;
expect(updatedScale, 1.0);
updatedScale = null;
expect(didEndScale, isFalse);
expect(didTap, isFalse);
tester.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
tester.route(pointer3.move(const Point(10.0, 20.0)));
expect(didStartScale, isTrue);
didStartScale = false;
expect(updatedFocalPoint, const Point(15.0, 25.0));
updatedFocalPoint = null;
expect(updatedScale, 2.0);
updatedScale = null;
tester.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
tester.route(pointer3.move(const Point(0.0, 0.0)));
expect(didStartScale, isTrue);
didStartScale = false;
expect(updatedFocalPoint, const Point(0.0, 0.0));
updatedFocalPoint = null;
expect(updatedScale, 1.0);
updatedScale = null;
// We are done
tester.route(pointer3.up());
expect(didStartScale, isFalse);
expect(updatedFocalPoint, isNull);
expect(updatedScale, isNull);
expect(didEndScale, isTrue);
didEndScale = false;
expect(didTap, isFalse);
scale.dispose();
tap.dispose();
});
}