// 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'; import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart'; void main() { testWidgetsWithLeakTracking('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); }); testWidgetsWithLeakTracking('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); }); testWidgetsWithLeakTracking('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); } }