| // 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/rendering.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| |
| void main() { |
| setUp(() => _GestureBindingSpy()); |
| |
| test('attach and detach correctly handle gesture', () { |
| final TextSelectionDelegate delegate = FakeEditableTextState(); |
| final RenderEditable editable = RenderEditable( |
| backgroundCursorColor: Colors.grey, |
| selectionColor: Colors.black, |
| textDirection: TextDirection.ltr, |
| cursorColor: Colors.red, |
| offset: ViewportOffset.zero(), |
| textSelectionDelegate: delegate, |
| text: const TextSpan( |
| text: 'test', |
| style: TextStyle( |
| height: 1.0, fontSize: 10.0, fontFamily: 'Ahem', |
| ), |
| ), |
| startHandleLayerLink: LayerLink(), |
| endHandleLayerLink: LayerLink(), |
| selection: const TextSelection( |
| baseOffset: 0, |
| extentOffset: 3, |
| affinity: TextAffinity.upstream, |
| ), |
| ); |
| editable.layout(BoxConstraints.loose(const Size(1000.0, 1000.0))); |
| |
| final PipelineOwner owner = PipelineOwner(onNeedVisualUpdate: () { }); |
| final _PointerRouterSpy spy = GestureBinding.instance.pointerRouter as _PointerRouterSpy; |
| editable.attach(owner); |
| // This should register pointer into GestureBinding.instance.pointerRouter. |
| editable.handleEvent(const PointerDownEvent(), BoxHitTestEntry(editable, const Offset(10,10))); |
| GestureBinding.instance.pointerRouter.route(const PointerDownEvent()); |
| expect(spy.routeCount, greaterThan(0)); |
| editable.detach(); |
| expect(spy.routeCount, 0); |
| }); |
| } |
| |
| class _GestureBindingSpy extends AutomatedTestWidgetsFlutterBinding { |
| final PointerRouter _testPointerRouter = _PointerRouterSpy(); |
| |
| @override |
| PointerRouter get pointerRouter => _testPointerRouter; |
| } |
| |
| class FakeEditableTextState extends Fake implements TextSelectionDelegate { } |
| |
| class _PointerRouterSpy extends PointerRouter { |
| int routeCount = 0; |
| @override |
| void addRoute(int pointer, PointerRoute route, [Matrix4? transform]) { |
| super.addRoute(pointer, route, transform); |
| routeCount++; |
| } |
| |
| @override |
| void removeRoute(int pointer, PointerRoute route) { |
| super.removeRoute(pointer, route); |
| routeCount--; |
| } |
| } |