// 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_test/flutter_test.dart'; typedef GestureArenaCallback = void Function(Object key); const int primaryKey = 4; class TestGestureArenaMember extends GestureArenaMember { bool acceptRan = false; @override void acceptGesture(int key) { expect(key, equals(primaryKey)); acceptRan = true; } bool rejectRan = false; @override void rejectGesture(int key) { expect(key, equals(primaryKey)); rejectRan = true; } } class GestureTester { GestureArenaManager arena = GestureArenaManager(); TestGestureArenaMember first = TestGestureArenaMember(); TestGestureArenaMember second = TestGestureArenaMember(); late GestureArenaEntry firstEntry; void addFirst() { firstEntry = arena.add(primaryKey, first); } late GestureArenaEntry secondEntry; void addSecond() { secondEntry = arena.add(primaryKey, second); } void expectNothing() { expect(first.acceptRan, isFalse); expect(first.rejectRan, isFalse); expect(second.acceptRan, isFalse); expect(second.rejectRan, isFalse); } void expectFirstWin() { expect(first.acceptRan, isTrue); expect(first.rejectRan, isFalse); expect(second.acceptRan, isFalse); expect(second.rejectRan, isTrue); } void expectSecondWin() { expect(first.acceptRan, isFalse); expect(first.rejectRan, isTrue); expect(second.acceptRan, isTrue); expect(second.rejectRan, isFalse); } } void main() { test('Should win by accepting', () { final GestureTester tester = GestureTester(); tester.addFirst(); tester.addSecond(); tester.arena.close(primaryKey); tester.expectNothing(); tester.firstEntry.resolve(GestureDisposition.accepted); tester.expectFirstWin(); }); test('Should win by sweep', () { final GestureTester tester = GestureTester(); tester.addFirst(); tester.addSecond(); tester.arena.close(primaryKey); tester.expectNothing(); tester.arena.sweep(primaryKey); tester.expectFirstWin(); }); test('Should win on release after hold sweep release', () { final GestureTester tester = GestureTester(); tester.addFirst(); tester.addSecond(); tester.arena.close(primaryKey); tester.expectNothing(); tester.arena.hold(primaryKey); tester.expectNothing(); tester.arena.sweep(primaryKey); tester.expectNothing(); tester.arena.release(primaryKey); tester.expectFirstWin(); }); test('Should win on sweep after hold release sweep', () { final GestureTester tester = GestureTester(); tester.addFirst(); tester.addSecond(); tester.arena.close(primaryKey); tester.expectNothing(); tester.arena.hold(primaryKey); tester.expectNothing(); tester.arena.release(primaryKey); tester.expectNothing(); tester.arena.sweep(primaryKey); tester.expectFirstWin(); }); test('Only first winner should win', () { final GestureTester tester = GestureTester(); tester.addFirst(); tester.addSecond(); tester.arena.close(primaryKey); tester.expectNothing(); tester.firstEntry.resolve(GestureDisposition.accepted); tester.secondEntry.resolve(GestureDisposition.accepted); tester.expectFirstWin(); }); test('Only first winner should win, regardless of order', () { final GestureTester tester = GestureTester(); tester.addFirst(); tester.addSecond(); tester.arena.close(primaryKey); tester.expectNothing(); tester.secondEntry.resolve(GestureDisposition.accepted); tester.firstEntry.resolve(GestureDisposition.accepted); tester.expectSecondWin(); }); test('Win before close is delayed to close', () { final GestureTester tester = GestureTester(); tester.addFirst(); tester.addSecond(); tester.expectNothing(); tester.firstEntry.resolve(GestureDisposition.accepted); tester.expectNothing(); tester.arena.close(primaryKey); tester.expectFirstWin(); }); test('Win before close is delayed to close, and only first winner should win', () { final GestureTester tester = GestureTester(); tester.addFirst(); tester.addSecond(); tester.expectNothing(); tester.firstEntry.resolve(GestureDisposition.accepted); tester.secondEntry.resolve(GestureDisposition.accepted); tester.expectNothing(); tester.arena.close(primaryKey); tester.expectFirstWin(); }); test('Win before close is delayed to close, and only first winner should win, regardless of order', () { final GestureTester tester = GestureTester(); tester.addFirst(); tester.addSecond(); tester.expectNothing(); tester.secondEntry.resolve(GestureDisposition.accepted); tester.firstEntry.resolve(GestureDisposition.accepted); tester.expectNothing(); tester.arena.close(primaryKey); tester.expectSecondWin(); }); }