| // 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/rendering.dart'; |
| import 'package:flutter/widgets.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| |
| void main() { |
| testWidgets('toString control test', (WidgetTester tester) async { |
| await tester.pumpWidget(const Center(child: Text('Hello', textDirection: TextDirection.ltr))); |
| final HitTestResult result = tester.hitTestOnBinding(Offset.zero); |
| expect(result, hasOneLineDescription); |
| expect(result.path.first, hasOneLineDescription); |
| }); |
| |
| testWidgets('A mouse click should only cause one hit test', (WidgetTester tester) async { |
| int hitCount = 0; |
| await tester.pumpWidget( |
| _HitTestCounter( |
| onHitTestCallback: () { |
| hitCount += 1; |
| }, |
| child: Container(), |
| ), |
| ); |
| |
| final TestGesture gesture = await tester.startGesture( |
| tester.getCenter(find.byType(_HitTestCounter)), |
| kind: PointerDeviceKind.mouse, |
| ); |
| await gesture.up(); |
| |
| expect(hitCount, 1); |
| }); |
| |
| testWidgets('Non-mouse events should not cause movement hit tests', (WidgetTester tester) async { |
| int hitCount = 0; |
| await tester.pumpWidget( |
| _HitTestCounter( |
| onHitTestCallback: () { |
| hitCount += 1; |
| }, |
| child: Container(), |
| ), |
| ); |
| |
| final TestGesture gesture = await tester.startGesture( |
| tester.getCenter(find.byType(_HitTestCounter)), |
| ); |
| await gesture.moveBy(const Offset(1, 1)); |
| await gesture.up(); |
| |
| expect(hitCount, 1); |
| }); |
| } |
| |
| // The [_HitTestCounter] invokes [onHitTestCallback] every time |
| // [hitTestChildren] is called. |
| class _HitTestCounter extends SingleChildRenderObjectWidget { |
| const _HitTestCounter({required Widget super.child, required this.onHitTestCallback}); |
| |
| final VoidCallback? onHitTestCallback; |
| |
| @override |
| _RenderHitTestCounter createRenderObject(BuildContext context) { |
| return _RenderHitTestCounter().._onHitTestCallback = onHitTestCallback; |
| } |
| |
| @override |
| void updateRenderObject(BuildContext context, _RenderHitTestCounter renderObject) { |
| renderObject._onHitTestCallback = onHitTestCallback; |
| } |
| } |
| |
| class _RenderHitTestCounter extends RenderProxyBox { |
| VoidCallback? _onHitTestCallback; |
| |
| @override |
| bool hitTestChildren(BoxHitTestResult result, {required Offset position}) { |
| _onHitTestCallback?.call(); |
| return super.hitTestChildren(result, position: position); |
| } |
| } |