| // Copyright 2014 The Flutter 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/gestures.dart'; |
| import 'package:flutter/material.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| |
| void main() { |
| testWidgets('gets local coordinates', (WidgetTester tester) async { |
| var tapCount = 0; |
| var tapCancelCount = 0; |
| final downDetails = <TapDownDetails>[]; |
| final upDetails = <TapUpDetails>[]; |
| |
| final Key redContainer = UniqueKey(); |
| await tester.pumpWidget( |
| Center( |
| child: GestureDetector( |
| onTap: () { |
| tapCount++; |
| }, |
| onTapCancel: () { |
| tapCancelCount++; |
| }, |
| onTapDown: (TapDownDetails details) { |
| downDetails.add(details); |
| }, |
| onTapUp: (TapUpDetails details) { |
| upDetails.add(details); |
| }, |
| child: Container(key: redContainer, width: 100, height: 150, color: Colors.red), |
| ), |
| ), |
| ); |
| |
| await tester.tapAt(tester.getCenter(find.byKey(redContainer))); |
| expect(tapCount, 1); |
| expect(tapCancelCount, 0); |
| expect(downDetails.single.localPosition, const Offset(50, 75)); |
| expect(downDetails.single.globalPosition, const Offset(400, 300)); |
| expect(upDetails.single.localPosition, const Offset(50, 75)); |
| expect(upDetails.single.globalPosition, const Offset(400, 300)); |
| }); |
| |
| testWidgets('kTouchSlop is evaluated in the global coordinate space when scaled up', ( |
| WidgetTester tester, |
| ) async { |
| var tapCount = 0; |
| var tapCancelCount = 0; |
| final downDetails = <TapDownDetails>[]; |
| final upDetails = <TapUpDetails>[]; |
| |
| final Key redContainer = UniqueKey(); |
| await tester.pumpWidget( |
| Center( |
| child: Transform.scale( |
| scale: 2.0, |
| child: GestureDetector( |
| onTap: () { |
| tapCount++; |
| }, |
| onTapCancel: () { |
| tapCancelCount++; |
| }, |
| onTapDown: (TapDownDetails details) { |
| downDetails.add(details); |
| }, |
| onTapUp: (TapUpDetails details) { |
| upDetails.add(details); |
| }, |
| child: Container(key: redContainer, width: 100, height: 150, color: Colors.red), |
| ), |
| ), |
| ), |
| ); |
| |
| // Move just below kTouchSlop should recognize tap. |
| TestGesture gesture = await tester.startGesture(tester.getCenter(find.byKey(redContainer))); |
| await gesture.moveBy(const Offset(0, kTouchSlop - 1)); |
| await gesture.up(); |
| |
| expect(tapCount, 1); |
| expect(tapCancelCount, 0); |
| expect(downDetails.single.localPosition, const Offset(50, 75)); |
| expect(downDetails.single.globalPosition, const Offset(400, 300)); |
| expect(upDetails.single.localPosition, const Offset(50, 75 + (kTouchSlop - 1) / 2.0)); |
| expect(upDetails.single.globalPosition, const Offset(400, 300 + (kTouchSlop - 1))); |
| |
| downDetails.clear(); |
| upDetails.clear(); |
| tapCount = 0; |
| tapCancelCount = 0; |
| |
| // Move more then kTouchSlop should cancel. |
| gesture = await tester.startGesture(tester.getCenter(find.byKey(redContainer))); |
| await gesture.moveBy(const Offset(0, kTouchSlop + 1)); |
| await gesture.up(); |
| expect(tapCount, 0); |
| expect(tapCancelCount, 1); |
| expect(downDetails.single.localPosition, const Offset(50, 75)); |
| expect(downDetails.single.globalPosition, const Offset(400, 300)); |
| expect(upDetails, isEmpty); |
| }); |
| |
| testWidgets('kTouchSlop is evaluated in the global coordinate space when scaled down', ( |
| WidgetTester tester, |
| ) async { |
| var tapCount = 0; |
| var tapCancelCount = 0; |
| final downDetails = <TapDownDetails>[]; |
| final upDetails = <TapUpDetails>[]; |
| |
| final Key redContainer = UniqueKey(); |
| await tester.pumpWidget( |
| Center( |
| child: Transform.scale( |
| scale: 0.5, |
| child: GestureDetector( |
| onTap: () { |
| tapCount++; |
| }, |
| onTapCancel: () { |
| tapCancelCount++; |
| }, |
| onTapDown: (TapDownDetails details) { |
| downDetails.add(details); |
| }, |
| onTapUp: (TapUpDetails details) { |
| upDetails.add(details); |
| }, |
| child: Container(key: redContainer, width: 100, height: 150, color: Colors.red), |
| ), |
| ), |
| ), |
| ); |
| |
| // Move just below kTouchSlop should recognize tap. |
| TestGesture gesture = await tester.startGesture(tester.getCenter(find.byKey(redContainer))); |
| await gesture.moveBy(const Offset(0, kTouchSlop - 1)); |
| await gesture.up(); |
| |
| expect(tapCount, 1); |
| expect(tapCancelCount, 0); |
| expect(downDetails.single.localPosition, const Offset(50, 75)); |
| expect(downDetails.single.globalPosition, const Offset(400, 300)); |
| expect(upDetails.single.localPosition, const Offset(50, 75 + (kTouchSlop - 1) * 2.0)); |
| expect(upDetails.single.globalPosition, const Offset(400, 300 + (kTouchSlop - 1))); |
| |
| downDetails.clear(); |
| upDetails.clear(); |
| tapCount = 0; |
| tapCancelCount = 0; |
| |
| // Move more then kTouchSlop should cancel. |
| gesture = await tester.startGesture(tester.getCenter(find.byKey(redContainer))); |
| await gesture.moveBy(const Offset(0, kTouchSlop + 1)); |
| await gesture.up(); |
| expect(tapCount, 0); |
| expect(tapCancelCount, 1); |
| expect(downDetails.single.localPosition, const Offset(50, 75)); |
| expect(downDetails.single.globalPosition, const Offset(400, 300)); |
| expect(upDetails, isEmpty); |
| }); |
| } |