import 'dart:ui' as ui; import 'package:flutter/gestures.dart'; import 'package:test/test.dart'; import '../engine/mock_events.dart'; void main() { test('Should recognize scale gestures', () { PointerRouter router = new PointerRouter(); ScaleGestureRecognizer scale = new ScaleGestureRecognizer(router: router); TapGestureRecognizer tap = new TapGestureRecognizer(router: router); bool didStartScale = false; ui.Point updatedFocalPoint; scale.onStart = (ui.Point focalPoint) { didStartScale = true; updatedFocalPoint = focalPoint; }; double updatedScale; scale.onUpdate = (double scale, ui.Point focalPoint) { updatedScale = scale; updatedFocalPoint = focalPoint; }; bool didEndScale = false; scale.onEnd = () { didEndScale = true; }; bool didTap = false; tap.onTap = () { didTap = true; }; TestPointer pointer1 = new TestPointer(1); PointerInputEvent down = pointer1.down(new Point(10.0, 10.0)); scale.addPointer(down); tap.addPointer(down); GestureArena.instance.close(1); 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); router.route(pointer1.move(new Point(20.0, 30.0))); expect(didStartScale, isTrue); didStartScale = false; expect(updatedFocalPoint, new ui.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); PointerInputEvent down2 = pointer2.down(new Point(10.0, 20.0)); scale.addPointer(down2); tap.addPointer(down2); GestureArena.instance.close(2); router.route(down2); expect(didEndScale, isTrue); didEndScale = false; expect(updatedScale, isNull); expect(updatedFocalPoint, isNull); expect(didStartScale, isFalse); // Zoom in router.route(pointer2.move(new Point(0.0, 10.0))); expect(didStartScale, isTrue); didStartScale = false; expect(updatedFocalPoint, new ui.Point(10.0, 20.0)); updatedFocalPoint = null; expect(updatedScale, 2.0); updatedScale = null; expect(didEndScale, isFalse); expect(didTap, isFalse); // Zoom out router.route(pointer2.move(new Point(15.0, 25.0))); expect(updatedFocalPoint, new ui.Point(17.5, 27.5)); updatedFocalPoint = null; expect(updatedScale, 0.5); updatedScale = null; expect(didTap, isFalse); // Three-finger scaling TestPointer pointer3 = new TestPointer(3); PointerInputEvent down3 = pointer3.down(new Point(25.0, 35.0)); scale.addPointer(down3); tap.addPointer(down3); GestureArena.instance.close(3); router.route(down3); expect(didEndScale, isTrue); didEndScale = false; expect(updatedScale, isNull); expect(updatedFocalPoint, isNull); expect(didStartScale, isFalse); // Zoom in router.route(pointer3.move(new Point(55.0, 65.0))); expect(didStartScale, isTrue); didStartScale = false; expect(updatedFocalPoint, new ui.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 router.route(pointer1.move(new Point(25.0, 35.0))); router.route(pointer2.move(new Point(20.0, 30.0))); router.route(pointer3.move(new Point(15.0, 25.0))); expect(didStartScale, isFalse); expect(updatedFocalPoint, new ui.Point(20.0, 30.0)); 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 router.route(pointer3.move(new Point(10.0, 20.0))); expect(didStartScale, isTrue); didStartScale = false; expect(updatedFocalPoint, new ui.Point(15.0, 25.0)); 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 router.route(pointer3.move(new Point(0.0, 0.0))); expect(didStartScale, isTrue); didStartScale = false; expect(updatedFocalPoint, new ui.Point(0.0, 0.0)); 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(); }); }