Unverified Commit 56cbf3e1 authored by Kostia Sokolovskyi's avatar Kostia Sokolovskyi Committed by GitHub

Cover more test/widgets tests with leak tracking #5 (#134869)

parent abf8361a
...@@ -1976,9 +1976,7 @@ void main() { ...@@ -1976,9 +1976,7 @@ void main() {
); );
expect(controller.value, <MaterialState>{MaterialState.disabled}); expect(controller.value, <MaterialState>{MaterialState.disabled});
expect(count, 1); expect(count, 1);
}, });
leakTrackingTestConfig: LeakTrackingTestConfig.debugNotDisposed(),
);
} }
......
...@@ -2544,7 +2544,6 @@ void main() { ...@@ -2544,7 +2544,6 @@ void main() {
}); });
testWidgetsWithLeakTracking('Should have only one SnackBar during back swipe navigation', testWidgetsWithLeakTracking('Should have only one SnackBar during back swipe navigation',
leakTrackingTestConfig: LeakTrackingTestConfig.debugNotDisposed(),
(WidgetTester tester) async { (WidgetTester tester) async {
const String snackBarText = 'hello snackbar'; const String snackBarText = 'hello snackbar';
const Key snackTarget = Key('snack-target'); const Key snackTarget = Key('snack-target');
......
...@@ -8,11 +8,12 @@ import 'package:flutter/gestures.dart'; ...@@ -8,11 +8,12 @@ import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'gesture_utils.dart'; import 'gesture_utils.dart';
void main() { void main() {
testWidgets('Events bubble up the tree', (WidgetTester tester) async { testWidgetsWithLeakTracking('Events bubble up the tree', (WidgetTester tester) async {
final List<String> log = <String>[]; final List<String> log = <String>[];
await tester.pumpWidget( await tester.pumpWidget(
...@@ -46,7 +47,7 @@ void main() { ...@@ -46,7 +47,7 @@ void main() {
])); ]));
}); });
testWidgets('Detects hover events from touch devices', (WidgetTester tester) async { testWidgetsWithLeakTracking('Detects hover events from touch devices', (WidgetTester tester) async {
final List<String> log = <String>[]; final List<String> log = <String>[];
await tester.pumpWidget( await tester.pumpWidget(
...@@ -74,7 +75,7 @@ void main() { ...@@ -74,7 +75,7 @@ void main() {
}); });
group('transformed events', () { group('transformed events', () {
testWidgets('simple offset for touch/signal', (WidgetTester tester) async { testWidgetsWithLeakTracking('simple offset for touch/signal', (WidgetTester tester) async {
final List<PointerEvent> events = <PointerEvent>[]; final List<PointerEvent> events = <PointerEvent>[];
final Key key = UniqueKey(); final Key key = UniqueKey();
...@@ -145,7 +146,7 @@ void main() { ...@@ -145,7 +146,7 @@ void main() {
expect(events.single.transform, expectedTransform); expect(events.single.transform, expectedTransform);
}); });
testWidgets('scaled for touch/signal', (WidgetTester tester) async { testWidgetsWithLeakTracking('scaled for touch/signal', (WidgetTester tester) async {
final List<PointerEvent> events = <PointerEvent>[]; final List<PointerEvent> events = <PointerEvent>[];
final Key key = UniqueKey(); final Key key = UniqueKey();
...@@ -222,7 +223,7 @@ void main() { ...@@ -222,7 +223,7 @@ void main() {
expect(events.single.transform, expectedTransform); expect(events.single.transform, expectedTransform);
}); });
testWidgets('scaled and offset for touch/signal', (WidgetTester tester) async { testWidgetsWithLeakTracking('scaled and offset for touch/signal', (WidgetTester tester) async {
final List<PointerEvent> events = <PointerEvent>[]; final List<PointerEvent> events = <PointerEvent>[];
final Key key = UniqueKey(); final Key key = UniqueKey();
...@@ -300,7 +301,7 @@ void main() { ...@@ -300,7 +301,7 @@ void main() {
expect(events.single.transform, expectedTransform); expect(events.single.transform, expectedTransform);
}); });
testWidgets('rotated for touch/signal', (WidgetTester tester) async { testWidgetsWithLeakTracking('rotated for touch/signal', (WidgetTester tester) async {
final List<PointerEvent> events = <PointerEvent>[]; final List<PointerEvent> events = <PointerEvent>[];
final Key key = UniqueKey(); final Key key = UniqueKey();
...@@ -378,9 +379,12 @@ void main() { ...@@ -378,9 +379,12 @@ void main() {
}); });
}); });
testWidgets("RenderPointerListener's debugFillProperties when default", (WidgetTester tester) async { testWidgetsWithLeakTracking("RenderPointerListener's debugFillProperties when default", (WidgetTester tester) async {
final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder(); final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder();
RenderPointerListener().debugFillProperties(builder); final RenderPointerListener renderListener = RenderPointerListener();
addTearDown(renderListener.dispose);
renderListener.debugFillProperties(builder);
final List<String> description = builder.properties final List<String> description = builder.properties
.where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info)) .where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info))
...@@ -396,9 +400,13 @@ void main() { ...@@ -396,9 +400,13 @@ void main() {
]); ]);
}); });
testWidgets("RenderPointerListener's debugFillProperties when full", (WidgetTester tester) async { testWidgetsWithLeakTracking("RenderPointerListener's debugFillProperties when full", (WidgetTester tester) async {
final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder(); final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder();
RenderPointerListener(
final RenderErrorBox renderErrorBox = RenderErrorBox();
addTearDown(() => renderErrorBox.dispose());
final RenderPointerListener renderListener = RenderPointerListener(
onPointerDown: (PointerDownEvent event) {}, onPointerDown: (PointerDownEvent event) {},
onPointerUp: (PointerUpEvent event) {}, onPointerUp: (PointerUpEvent event) {},
onPointerMove: (PointerMoveEvent event) {}, onPointerMove: (PointerMoveEvent event) {},
...@@ -406,8 +414,11 @@ void main() { ...@@ -406,8 +414,11 @@ void main() {
onPointerCancel: (PointerCancelEvent event) {}, onPointerCancel: (PointerCancelEvent event) {},
onPointerSignal: (PointerSignalEvent event) {}, onPointerSignal: (PointerSignalEvent event) {},
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
child: RenderErrorBox(), child: renderErrorBox,
).debugFillProperties(builder); );
addTearDown(renderListener.dispose);
renderListener.debugFillProperties(builder);
final List<String> description = builder.properties final List<String> description = builder.properties
.where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info)) .where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info))
......
...@@ -5,9 +5,10 @@ ...@@ -5,9 +5,10 @@
import 'package:flutter/gestures.dart' show DragStartBehavior; import 'package:flutter/gestures.dart' show DragStartBehavior;
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
void main() { void main() {
testWidgets('ListView.builder() fixed itemExtent, scroll to end, append, scroll', (WidgetTester tester) async { testWidgetsWithLeakTracking('ListView.builder() fixed itemExtent, scroll to end, append, scroll', (WidgetTester tester) async {
// Regression test for https://github.com/flutter/flutter/issues/9506 // Regression test for https://github.com/flutter/flutter/issues/9506
Widget buildFrame(int itemCount) { Widget buildFrame(int itemCount) {
...@@ -35,7 +36,7 @@ void main() { ...@@ -35,7 +36,7 @@ void main() {
expect(find.text('item 3'), findsOneWidget); expect(find.text('item 3'), findsOneWidget);
}); });
testWidgets('ListView.builder() fixed itemExtent, scroll to end, append, scroll', (WidgetTester tester) async { testWidgetsWithLeakTracking('ListView.builder() fixed itemExtent, scroll to end, append, scroll', (WidgetTester tester) async {
// Regression test for https://github.com/flutter/flutter/issues/9506 // Regression test for https://github.com/flutter/flutter/issues/9506
Widget buildFrame(int itemCount) { Widget buildFrame(int itemCount) {
......
...@@ -6,11 +6,12 @@ import 'dart:async'; ...@@ -6,11 +6,12 @@ import 'dart:async';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
void main() { void main() {
final TestAutomatedTestWidgetsFlutterBinding binding = TestAutomatedTestWidgetsFlutterBinding(); final TestAutomatedTestWidgetsFlutterBinding binding = TestAutomatedTestWidgetsFlutterBinding();
testWidgets('Locale is available when Localizations widget stops deferring frames', (WidgetTester tester) async { testWidgetsWithLeakTracking('Locale is available when Localizations widget stops deferring frames', (WidgetTester tester) async {
final FakeLocalizationsDelegate delegate = FakeLocalizationsDelegate(); final FakeLocalizationsDelegate delegate = FakeLocalizationsDelegate();
await tester.pumpWidget(Localizations( await tester.pumpWidget(Localizations(
locale: const Locale('fo'), locale: const Locale('fo'),
...@@ -37,7 +38,7 @@ void main() { ...@@ -37,7 +38,7 @@ void main() {
expect(find.text('loaded'), findsOneWidget); expect(find.text('loaded'), findsOneWidget);
}); });
testWidgets('Localizations.localeOf throws when no localizations exist', (WidgetTester tester) async { testWidgetsWithLeakTracking('Localizations.localeOf throws when no localizations exist', (WidgetTester tester) async {
final GlobalKey contextKey = GlobalKey(debugLabel: 'Test Key'); final GlobalKey contextKey = GlobalKey(debugLabel: 'Test Key');
await tester.pumpWidget(Container(key: contextKey)); await tester.pumpWidget(Container(key: contextKey));
...@@ -48,7 +49,7 @@ void main() { ...@@ -48,7 +49,7 @@ void main() {
))); )));
}); });
testWidgets('Localizations.maybeLocaleOf returns null when no localizations exist', (WidgetTester tester) async { testWidgetsWithLeakTracking('Localizations.maybeLocaleOf returns null when no localizations exist', (WidgetTester tester) async {
final GlobalKey contextKey = GlobalKey(debugLabel: 'Test Key'); final GlobalKey contextKey = GlobalKey(debugLabel: 'Test Key');
await tester.pumpWidget(Container(key: contextKey)); await tester.pumpWidget(Container(key: contextKey));
......
...@@ -5,10 +5,11 @@ ...@@ -5,10 +5,11 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
void main() { void main() {
group('LookupBoundary.dependOnInheritedWidgetOfExactType', () { group('LookupBoundary.dependOnInheritedWidgetOfExactType', () {
testWidgets('respects boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('respects boundary', (WidgetTester tester) async {
InheritedWidget? containerThroughBoundary; InheritedWidget? containerThroughBoundary;
InheritedWidget? containerStoppedAtBoundary; InheritedWidget? containerStoppedAtBoundary;
...@@ -32,7 +33,7 @@ void main() { ...@@ -32,7 +33,7 @@ void main() {
expect(containerStoppedAtBoundary, isNull); expect(containerStoppedAtBoundary, isNull);
}); });
testWidgets('ignores ancestor boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('ignores ancestor boundary', (WidgetTester tester) async {
InheritedWidget? inheritedWidget; InheritedWidget? inheritedWidget;
final Key inheritedKey = UniqueKey(); final Key inheritedKey = UniqueKey();
...@@ -53,7 +54,7 @@ void main() { ...@@ -53,7 +54,7 @@ void main() {
expect(inheritedWidget, equals(tester.widget(find.byKey(inheritedKey)))); expect(inheritedWidget, equals(tester.widget(find.byKey(inheritedKey))));
}); });
testWidgets('finds widget before boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('finds widget before boundary', (WidgetTester tester) async {
InheritedWidget? containerThroughBoundary; InheritedWidget? containerThroughBoundary;
InheritedWidget? containerStoppedAtBoundary; InheritedWidget? containerStoppedAtBoundary;
...@@ -80,7 +81,7 @@ void main() { ...@@ -80,7 +81,7 @@ void main() {
expect(containerStoppedAtBoundary, equals(tester.widget(find.byKey(inheritedKey)))); expect(containerStoppedAtBoundary, equals(tester.widget(find.byKey(inheritedKey))));
}); });
testWidgets('creates dependency', (WidgetTester tester) async { testWidgetsWithLeakTracking('creates dependency', (WidgetTester tester) async {
MyInheritedWidget? inheritedWidget; MyInheritedWidget? inheritedWidget;
final Widget widgetTree = DidChangeDependencySpy( final Widget widgetTree = DidChangeDependencySpy(
...@@ -108,7 +109,7 @@ void main() { ...@@ -108,7 +109,7 @@ void main() {
expect(tester.state<_DidChangeDependencySpyState>(find.byType(DidChangeDependencySpy)).didChangeDependenciesCount, 2); expect(tester.state<_DidChangeDependencySpyState>(find.byType(DidChangeDependencySpy)).didChangeDependenciesCount, 2);
}); });
testWidgets('causes didChangeDependencies to be called on move even if dependency was not fulfilled due to boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('causes didChangeDependencies to be called on move even if dependency was not fulfilled due to boundary', (WidgetTester tester) async {
MyInheritedWidget? inheritedWidget; MyInheritedWidget? inheritedWidget;
final Key globalKey = GlobalKey(); final Key globalKey = GlobalKey();
...@@ -173,7 +174,7 @@ void main() { ...@@ -173,7 +174,7 @@ void main() {
expect(tester.state<_DidChangeDependencySpyState>(find.byType(DidChangeDependencySpy)).didChangeDependenciesCount, 3); expect(tester.state<_DidChangeDependencySpyState>(find.byType(DidChangeDependencySpy)).didChangeDependenciesCount, 3);
}); });
testWidgets('causes didChangeDependencies to be called on move even if dependency was non-existant', (WidgetTester tester) async { testWidgetsWithLeakTracking('causes didChangeDependencies to be called on move even if dependency was non-existant', (WidgetTester tester) async {
MyInheritedWidget? inheritedWidget; MyInheritedWidget? inheritedWidget;
final Key globalKey = GlobalKey(); final Key globalKey = GlobalKey();
...@@ -212,7 +213,7 @@ void main() { ...@@ -212,7 +213,7 @@ void main() {
}); });
group('LookupBoundary.getElementForInheritedWidgetOfExactType', () { group('LookupBoundary.getElementForInheritedWidgetOfExactType', () {
testWidgets('respects boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('respects boundary', (WidgetTester tester) async {
InheritedElement? containerThroughBoundary; InheritedElement? containerThroughBoundary;
InheritedElement? containerStoppedAtBoundary; InheritedElement? containerStoppedAtBoundary;
...@@ -236,7 +237,7 @@ void main() { ...@@ -236,7 +237,7 @@ void main() {
expect(containerStoppedAtBoundary, isNull); expect(containerStoppedAtBoundary, isNull);
}); });
testWidgets('ignores ancestor boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('ignores ancestor boundary', (WidgetTester tester) async {
InheritedElement? inheritedWidget; InheritedElement? inheritedWidget;
final Key inheritedKey = UniqueKey(); final Key inheritedKey = UniqueKey();
...@@ -257,7 +258,7 @@ void main() { ...@@ -257,7 +258,7 @@ void main() {
expect(inheritedWidget, equals(tester.element(find.byKey(inheritedKey)))); expect(inheritedWidget, equals(tester.element(find.byKey(inheritedKey))));
}); });
testWidgets('finds widget before boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('finds widget before boundary', (WidgetTester tester) async {
InheritedElement? containerThroughBoundary; InheritedElement? containerThroughBoundary;
InheritedElement? containerStoppedAtBoundary; InheritedElement? containerStoppedAtBoundary;
...@@ -284,7 +285,7 @@ void main() { ...@@ -284,7 +285,7 @@ void main() {
expect(containerStoppedAtBoundary, equals(tester.element(find.byKey(inheritedKey)))); expect(containerStoppedAtBoundary, equals(tester.element(find.byKey(inheritedKey))));
}); });
testWidgets('does not creates dependency', (WidgetTester tester) async { testWidgetsWithLeakTracking('does not creates dependency', (WidgetTester tester) async {
final Widget widgetTree = DidChangeDependencySpy( final Widget widgetTree = DidChangeDependencySpy(
onDidChangeDependencies: (BuildContext context) { onDidChangeDependencies: (BuildContext context) {
...@@ -309,7 +310,7 @@ void main() { ...@@ -309,7 +310,7 @@ void main() {
expect(tester.state<_DidChangeDependencySpyState>(find.byType(DidChangeDependencySpy)).didChangeDependenciesCount, 1); expect(tester.state<_DidChangeDependencySpyState>(find.byType(DidChangeDependencySpy)).didChangeDependenciesCount, 1);
}); });
testWidgets('does not cause didChangeDependencies to be called on move when found', (WidgetTester tester) async { testWidgetsWithLeakTracking('does not cause didChangeDependencies to be called on move when found', (WidgetTester tester) async {
final Key globalKey = GlobalKey(); final Key globalKey = GlobalKey();
final Widget widgetTree = DidChangeDependencySpy( final Widget widgetTree = DidChangeDependencySpy(
...@@ -369,7 +370,7 @@ void main() { ...@@ -369,7 +370,7 @@ void main() {
expect(tester.state<_DidChangeDependencySpyState>(find.byType(DidChangeDependencySpy)).didChangeDependenciesCount, 1); expect(tester.state<_DidChangeDependencySpyState>(find.byType(DidChangeDependencySpy)).didChangeDependenciesCount, 1);
}); });
testWidgets('does not cause didChangeDependencies to be called on move when nothing was found', (WidgetTester tester) async { testWidgetsWithLeakTracking('does not cause didChangeDependencies to be called on move when nothing was found', (WidgetTester tester) async {
final Key globalKey = GlobalKey(); final Key globalKey = GlobalKey();
final Widget widgetTree = DidChangeDependencySpy( final Widget widgetTree = DidChangeDependencySpy(
...@@ -404,7 +405,7 @@ void main() { ...@@ -404,7 +405,7 @@ void main() {
}); });
group('LookupBoundary.findAncestorWidgetOfExactType', () { group('LookupBoundary.findAncestorWidgetOfExactType', () {
testWidgets('respects boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('respects boundary', (WidgetTester tester) async {
Widget? containerThroughBoundary; Widget? containerThroughBoundary;
Widget? containerStoppedAtBoundary; Widget? containerStoppedAtBoundary;
Widget? boundaryThroughBoundary; Widget? boundaryThroughBoundary;
...@@ -435,7 +436,7 @@ void main() { ...@@ -435,7 +436,7 @@ void main() {
expect(boundaryStoppedAtBoundary, equals(tester.widget(find.byKey(boundaryKey)))); expect(boundaryStoppedAtBoundary, equals(tester.widget(find.byKey(boundaryKey))));
}); });
testWidgets('finds right widget before boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('finds right widget before boundary', (WidgetTester tester) async {
Widget? containerThroughBoundary; Widget? containerThroughBoundary;
Widget? containerStoppedAtBoundary; Widget? containerStoppedAtBoundary;
...@@ -466,7 +467,7 @@ void main() { ...@@ -466,7 +467,7 @@ void main() {
expect(containerStoppedAtBoundary, equals(tester.widget(find.byKey(innerContainerKey)))); expect(containerStoppedAtBoundary, equals(tester.widget(find.byKey(innerContainerKey))));
}); });
testWidgets('works if nothing is found', (WidgetTester tester) async { testWidgetsWithLeakTracking('works if nothing is found', (WidgetTester tester) async {
Widget? containerStoppedAtBoundary; Widget? containerStoppedAtBoundary;
await tester.pumpWidget(Builder( await tester.pumpWidget(Builder(
...@@ -479,7 +480,7 @@ void main() { ...@@ -479,7 +480,7 @@ void main() {
expect(containerStoppedAtBoundary, isNull); expect(containerStoppedAtBoundary, isNull);
}); });
testWidgets('does not establish a dependency', (WidgetTester tester) async { testWidgetsWithLeakTracking('does not establish a dependency', (WidgetTester tester) async {
Widget? containerThroughBoundary; Widget? containerThroughBoundary;
Widget? containerStoppedAtBoundary; Widget? containerStoppedAtBoundary;
Widget? containerStoppedAtBoundaryUnfulfilled; Widget? containerStoppedAtBoundaryUnfulfilled;
...@@ -520,7 +521,7 @@ void main() { ...@@ -520,7 +521,7 @@ void main() {
}); });
group('LookupBoundary.findAncestorStateOfType', () { group('LookupBoundary.findAncestorStateOfType', () {
testWidgets('respects boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('respects boundary', (WidgetTester tester) async {
State? containerThroughBoundary; State? containerThroughBoundary;
State? containerStoppedAtBoundary; State? containerStoppedAtBoundary;
...@@ -543,7 +544,7 @@ void main() { ...@@ -543,7 +544,7 @@ void main() {
expect(containerStoppedAtBoundary, isNull); expect(containerStoppedAtBoundary, isNull);
}); });
testWidgets('finds right widget before boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('finds right widget before boundary', (WidgetTester tester) async {
State? containerThroughBoundary; State? containerThroughBoundary;
State? containerStoppedAtBoundary; State? containerStoppedAtBoundary;
...@@ -572,7 +573,7 @@ void main() { ...@@ -572,7 +573,7 @@ void main() {
expect(containerStoppedAtBoundary, equals(tester.state(find.byKey(innerContainerKey)))); expect(containerStoppedAtBoundary, equals(tester.state(find.byKey(innerContainerKey))));
}); });
testWidgets('works if nothing is found', (WidgetTester tester) async { testWidgetsWithLeakTracking('works if nothing is found', (WidgetTester tester) async {
State? containerStoppedAtBoundary; State? containerStoppedAtBoundary;
await tester.pumpWidget(Builder( await tester.pumpWidget(Builder(
...@@ -585,7 +586,7 @@ void main() { ...@@ -585,7 +586,7 @@ void main() {
expect(containerStoppedAtBoundary, isNull); expect(containerStoppedAtBoundary, isNull);
}); });
testWidgets('does not establish a dependency', (WidgetTester tester) async { testWidgetsWithLeakTracking('does not establish a dependency', (WidgetTester tester) async {
State? containerThroughBoundary; State? containerThroughBoundary;
State? containerStoppedAtBoundary; State? containerStoppedAtBoundary;
State? containerStoppedAtBoundaryUnfulfilled; State? containerStoppedAtBoundaryUnfulfilled;
...@@ -626,7 +627,7 @@ void main() { ...@@ -626,7 +627,7 @@ void main() {
}); });
group('LookupBoundary.findRootAncestorStateOfType', () { group('LookupBoundary.findRootAncestorStateOfType', () {
testWidgets('respects boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('respects boundary', (WidgetTester tester) async {
State? containerThroughBoundary; State? containerThroughBoundary;
State? containerStoppedAtBoundary; State? containerStoppedAtBoundary;
...@@ -649,7 +650,7 @@ void main() { ...@@ -649,7 +650,7 @@ void main() {
expect(containerStoppedAtBoundary, isNull); expect(containerStoppedAtBoundary, isNull);
}); });
testWidgets('finds right widget before boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('finds right widget before boundary', (WidgetTester tester) async {
State? containerThroughBoundary; State? containerThroughBoundary;
State? containerStoppedAtBoundary; State? containerStoppedAtBoundary;
...@@ -678,7 +679,7 @@ void main() { ...@@ -678,7 +679,7 @@ void main() {
expect(containerStoppedAtBoundary, equals(tester.state(find.byKey(innerContainerKey)))); expect(containerStoppedAtBoundary, equals(tester.state(find.byKey(innerContainerKey))));
}); });
testWidgets('works if nothing is found', (WidgetTester tester) async { testWidgetsWithLeakTracking('works if nothing is found', (WidgetTester tester) async {
State? containerStoppedAtBoundary; State? containerStoppedAtBoundary;
await tester.pumpWidget(Builder( await tester.pumpWidget(Builder(
...@@ -691,7 +692,7 @@ void main() { ...@@ -691,7 +692,7 @@ void main() {
expect(containerStoppedAtBoundary, isNull); expect(containerStoppedAtBoundary, isNull);
}); });
testWidgets('does not establish a dependency', (WidgetTester tester) async { testWidgetsWithLeakTracking('does not establish a dependency', (WidgetTester tester) async {
State? containerThroughBoundary; State? containerThroughBoundary;
State? containerStoppedAtBoundary; State? containerStoppedAtBoundary;
State? containerStoppedAtBoundaryUnfulfilled; State? containerStoppedAtBoundaryUnfulfilled;
...@@ -732,7 +733,7 @@ void main() { ...@@ -732,7 +733,7 @@ void main() {
}); });
group('LookupBoundary.findAncestorRenderObjectOfType', () { group('LookupBoundary.findAncestorRenderObjectOfType', () {
testWidgets('respects boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('respects boundary', (WidgetTester tester) async {
RenderPadding? paddingThroughBoundary; RenderPadding? paddingThroughBoundary;
RenderPadding? passingStoppedAtBoundary; RenderPadding? passingStoppedAtBoundary;
...@@ -756,7 +757,7 @@ void main() { ...@@ -756,7 +757,7 @@ void main() {
expect(passingStoppedAtBoundary, isNull); expect(passingStoppedAtBoundary, isNull);
}); });
testWidgets('finds right widget before boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('finds right widget before boundary', (WidgetTester tester) async {
RenderPadding? paddingThroughBoundary; RenderPadding? paddingThroughBoundary;
RenderPadding? paddingStoppedAtBoundary; RenderPadding? paddingStoppedAtBoundary;
...@@ -788,7 +789,7 @@ void main() { ...@@ -788,7 +789,7 @@ void main() {
expect(paddingStoppedAtBoundary, equals(tester.renderObject(find.byKey(innerPaddingKey)))); expect(paddingStoppedAtBoundary, equals(tester.renderObject(find.byKey(innerPaddingKey))));
}); });
testWidgets('works if nothing is found', (WidgetTester tester) async { testWidgetsWithLeakTracking('works if nothing is found', (WidgetTester tester) async {
RenderPadding? paddingStoppedAtBoundary; RenderPadding? paddingStoppedAtBoundary;
await tester.pumpWidget(Builder( await tester.pumpWidget(Builder(
...@@ -801,7 +802,7 @@ void main() { ...@@ -801,7 +802,7 @@ void main() {
expect(paddingStoppedAtBoundary, isNull); expect(paddingStoppedAtBoundary, isNull);
}); });
testWidgets('does not establish a dependency', (WidgetTester tester) async { testWidgetsWithLeakTracking('does not establish a dependency', (WidgetTester tester) async {
RenderPadding? paddingThroughBoundary; RenderPadding? paddingThroughBoundary;
RenderPadding? paddingStoppedAtBoundary; RenderPadding? paddingStoppedAtBoundary;
RenderWrap? wrapStoppedAtBoundaryUnfulfilled; RenderWrap? wrapStoppedAtBoundaryUnfulfilled;
...@@ -843,7 +844,7 @@ void main() { ...@@ -843,7 +844,7 @@ void main() {
}); });
group('LookupBoundary.visitAncestorElements', () { group('LookupBoundary.visitAncestorElements', () {
testWidgets('respects boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('respects boundary', (WidgetTester tester) async {
final List<Element> throughBoundary = <Element>[]; final List<Element> throughBoundary = <Element>[];
final List<Element> stoppedAtBoundary = <Element>[]; final List<Element> stoppedAtBoundary = <Element>[];
final List<Element> stoppedAtBoundaryTerminatedEarly = <Element>[]; final List<Element> stoppedAtBoundaryTerminatedEarly = <Element>[];
...@@ -909,7 +910,7 @@ void main() { ...@@ -909,7 +910,7 @@ void main() {
}); });
group('LookupBoundary.visitChildElements', () { group('LookupBoundary.visitChildElements', () {
testWidgets('respects boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('respects boundary', (WidgetTester tester) async {
final Key root = UniqueKey(); final Key root = UniqueKey();
final Key child1 = UniqueKey(); final Key child1 = UniqueKey();
final Key child2 = UniqueKey(); final Key child2 = UniqueKey();
...@@ -961,7 +962,7 @@ void main() { ...@@ -961,7 +962,7 @@ void main() {
}); });
group('LookupBoundary.debugIsHidingAncestorWidgetOfExactType', () { group('LookupBoundary.debugIsHidingAncestorWidgetOfExactType', () {
testWidgets('is hiding', (WidgetTester tester) async { testWidgetsWithLeakTracking('is hiding', (WidgetTester tester) async {
bool? isHidden; bool? isHidden;
await tester.pumpWidget(Container( await tester.pumpWidget(Container(
padding: const EdgeInsets.all(10), padding: const EdgeInsets.all(10),
...@@ -978,7 +979,7 @@ void main() { ...@@ -978,7 +979,7 @@ void main() {
expect(isHidden, isTrue); expect(isHidden, isTrue);
}); });
testWidgets('is not hiding entity within boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('is not hiding entity within boundary', (WidgetTester tester) async {
bool? isHidden; bool? isHidden;
await tester.pumpWidget(Container( await tester.pumpWidget(Container(
padding: const EdgeInsets.all(10), padding: const EdgeInsets.all(10),
...@@ -999,7 +1000,7 @@ void main() { ...@@ -999,7 +1000,7 @@ void main() {
expect(isHidden, isFalse); expect(isHidden, isFalse);
}); });
testWidgets('is not hiding if no boundary exists', (WidgetTester tester) async { testWidgetsWithLeakTracking('is not hiding if no boundary exists', (WidgetTester tester) async {
bool? isHidden; bool? isHidden;
await tester.pumpWidget(Container( await tester.pumpWidget(Container(
padding: const EdgeInsets.all(10), padding: const EdgeInsets.all(10),
...@@ -1014,7 +1015,7 @@ void main() { ...@@ -1014,7 +1015,7 @@ void main() {
expect(isHidden, isFalse); expect(isHidden, isFalse);
}); });
testWidgets('is not hiding if no boundary and no entity exists', (WidgetTester tester) async { testWidgetsWithLeakTracking('is not hiding if no boundary and no entity exists', (WidgetTester tester) async {
bool? isHidden; bool? isHidden;
await tester.pumpWidget(Builder( await tester.pumpWidget(Builder(
builder: (BuildContext context) { builder: (BuildContext context) {
...@@ -1027,7 +1028,7 @@ void main() { ...@@ -1027,7 +1028,7 @@ void main() {
}); });
group('LookupBoundary.debugIsHidingAncestorStateOfType', () { group('LookupBoundary.debugIsHidingAncestorStateOfType', () {
testWidgets('is hiding', (WidgetTester tester) async { testWidgetsWithLeakTracking('is hiding', (WidgetTester tester) async {
bool? isHidden; bool? isHidden;
await tester.pumpWidget(MyStatefulContainer( await tester.pumpWidget(MyStatefulContainer(
child: LookupBoundary( child: LookupBoundary(
...@@ -1042,7 +1043,7 @@ void main() { ...@@ -1042,7 +1043,7 @@ void main() {
expect(isHidden, isTrue); expect(isHidden, isTrue);
}); });
testWidgets('is not hiding entity within boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('is not hiding entity within boundary', (WidgetTester tester) async {
bool? isHidden; bool? isHidden;
await tester.pumpWidget(MyStatefulContainer( await tester.pumpWidget(MyStatefulContainer(
child: LookupBoundary( child: LookupBoundary(
...@@ -1059,7 +1060,7 @@ void main() { ...@@ -1059,7 +1060,7 @@ void main() {
expect(isHidden, isFalse); expect(isHidden, isFalse);
}); });
testWidgets('is not hiding if no boundary exists', (WidgetTester tester) async { testWidgetsWithLeakTracking('is not hiding if no boundary exists', (WidgetTester tester) async {
bool? isHidden; bool? isHidden;
await tester.pumpWidget(MyStatefulContainer( await tester.pumpWidget(MyStatefulContainer(
child: Builder( child: Builder(
...@@ -1072,7 +1073,7 @@ void main() { ...@@ -1072,7 +1073,7 @@ void main() {
expect(isHidden, isFalse); expect(isHidden, isFalse);
}); });
testWidgets('is not hiding if no boundary and no entity exists', (WidgetTester tester) async { testWidgetsWithLeakTracking('is not hiding if no boundary and no entity exists', (WidgetTester tester) async {
bool? isHidden; bool? isHidden;
await tester.pumpWidget(Builder( await tester.pumpWidget(Builder(
builder: (BuildContext context) { builder: (BuildContext context) {
...@@ -1085,7 +1086,7 @@ void main() { ...@@ -1085,7 +1086,7 @@ void main() {
}); });
group('LookupBoundary.debugIsHidingAncestorRenderObjectOfType', () { group('LookupBoundary.debugIsHidingAncestorRenderObjectOfType', () {
testWidgets('is hiding', (WidgetTester tester) async { testWidgetsWithLeakTracking('is hiding', (WidgetTester tester) async {
bool? isHidden; bool? isHidden;
await tester.pumpWidget(Padding( await tester.pumpWidget(Padding(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
...@@ -1101,7 +1102,7 @@ void main() { ...@@ -1101,7 +1102,7 @@ void main() {
expect(isHidden, isTrue); expect(isHidden, isTrue);
}); });
testWidgets('is not hiding entity within boundary', (WidgetTester tester) async { testWidgetsWithLeakTracking('is not hiding entity within boundary', (WidgetTester tester) async {
bool? isHidden; bool? isHidden;
await tester.pumpWidget(Padding( await tester.pumpWidget(Padding(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
...@@ -1120,7 +1121,7 @@ void main() { ...@@ -1120,7 +1121,7 @@ void main() {
expect(isHidden, isFalse); expect(isHidden, isFalse);
}); });
testWidgets('is not hiding if no boundary exists', (WidgetTester tester) async { testWidgetsWithLeakTracking('is not hiding if no boundary exists', (WidgetTester tester) async {
bool? isHidden; bool? isHidden;
await tester.pumpWidget(Padding( await tester.pumpWidget(Padding(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
...@@ -1134,7 +1135,7 @@ void main() { ...@@ -1134,7 +1135,7 @@ void main() {
expect(isHidden, isFalse); expect(isHidden, isFalse);
}); });
testWidgets('is not hiding if no boundary and no entity exists', (WidgetTester tester) async { testWidgetsWithLeakTracking('is not hiding if no boundary and no entity exists', (WidgetTester tester) async {
bool? isHidden; bool? isHidden;
await tester.pumpWidget(Builder( await tester.pumpWidget(Builder(
builder: (BuildContext context) { builder: (BuildContext context) {
......
...@@ -9,6 +9,7 @@ import 'package:fake_async/fake_async.dart'; ...@@ -9,6 +9,7 @@ import 'package:fake_async/fake_async.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
class _MockAnimationController extends AnimationController { class _MockAnimationController extends AnimationController {
_MockAnimationController() _MockAnimationController()
...@@ -42,7 +43,7 @@ void main() { ...@@ -42,7 +43,7 @@ void main() {
} }
group('Raw Magnifier', () { group('Raw Magnifier', () {
testWidgets('should render with correct focal point and decoration', testWidgetsWithLeakTracking('should render with correct focal point and decoration',
(WidgetTester tester) async { (WidgetTester tester) async {
final Key appKey = UniqueKey(); final Key appKey = UniqueKey();
const Size magnifierSize = Size(100, 100); const Size magnifierSize = Size(100, 100);
...@@ -116,7 +117,7 @@ void main() { ...@@ -116,7 +117,7 @@ void main() {
magnifierController.removeFromOverlay(); magnifierController.removeFromOverlay();
}); });
testWidgets( testWidgetsWithLeakTracking(
'should immediately remove from overlay on no animation controller', 'should immediately remove from overlay on no animation controller',
(WidgetTester tester) async { (WidgetTester tester) async {
await runFakeAsync((FakeAsync async) async { await runFakeAsync((FakeAsync async) async {
...@@ -149,7 +150,7 @@ void main() { ...@@ -149,7 +150,7 @@ void main() {
}); });
}); });
testWidgets('should update shown based on animation status', testWidgetsWithLeakTracking('should update shown based on animation status',
(WidgetTester tester) async { (WidgetTester tester) async {
await runFakeAsync((FakeAsync async) async { await runFakeAsync((FakeAsync async) async {
final MagnifierController magnifierController = final MagnifierController magnifierController =
...@@ -214,7 +215,7 @@ void main() { ...@@ -214,7 +215,7 @@ void main() {
}); });
group('show', () { group('show', () {
testWidgets('should insert below below widget', (WidgetTester tester) async { testWidgetsWithLeakTracking('should insert below below widget', (WidgetTester tester) async {
await tester.pumpWidget(const MaterialApp( await tester.pumpWidget(const MaterialApp(
home: Text('text'), home: Text('text'),
)); ));
...@@ -226,6 +227,7 @@ void main() { ...@@ -226,6 +227,7 @@ void main() {
final OverlayEntry fakeBeforeOverlayEntry = final OverlayEntry fakeBeforeOverlayEntry =
OverlayEntry(builder: (_) => fakeBefore); OverlayEntry(builder: (_) => fakeBefore);
addTearDown(() => fakeBeforeOverlayEntry..remove()..dispose());
Overlay.of(context).insert(fakeBeforeOverlayEntry); Overlay.of(context).insert(fakeBeforeOverlayEntry);
magnifierController.show( magnifierController.show(
...@@ -247,7 +249,7 @@ void main() { ...@@ -247,7 +249,7 @@ void main() {
expect(allOverlayChildren.first.widget.key, fakeMagnifier.key); expect(allOverlayChildren.first.widget.key, fakeMagnifier.key);
}); });
testWidgets('should insert newly built widget without animating out if overlay != null', testWidgetsWithLeakTracking('should insert newly built widget without animating out if overlay != null',
(WidgetTester tester) async { (WidgetTester tester) async {
await runFakeAsync((FakeAsync async) async { await runFakeAsync((FakeAsync async) async {
final _MockAnimationController animationController = final _MockAnimationController animationController =
......
...@@ -4,9 +4,10 @@ ...@@ -4,9 +4,10 @@
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
void main() { void main() {
testWidgets('setState can be called from build, initState, didChangeDependencies, and didUpdateWidget', (WidgetTester tester) async { testWidgetsWithLeakTracking('setState can be called from build, initState, didChangeDependencies, and didUpdateWidget', (WidgetTester tester) async {
// Initial build. // Initial build.
await tester.pumpWidget( await tester.pumpWidget(
const Directionality( const Directionality(
......
...@@ -7,6 +7,7 @@ import 'dart:ui' show Brightness, DisplayFeature, DisplayFeatureState, DisplayFe ...@@ -7,6 +7,7 @@ import 'dart:ui' show Brightness, DisplayFeature, DisplayFeatureState, DisplayFe
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
class _MediaQueryAspectCase { class _MediaQueryAspectCase {
const _MediaQueryAspectCase(this.method, this.data); const _MediaQueryAspectCase(this.method, this.data);
...@@ -43,7 +44,7 @@ class _MediaQueryAspectVariant extends TestVariant<_MediaQueryAspectCase> { ...@@ -43,7 +44,7 @@ class _MediaQueryAspectVariant extends TestVariant<_MediaQueryAspectCase> {
} }
void main() { void main() {
testWidgets('MediaQuery does not have a default', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery does not have a default', (WidgetTester tester) async {
late final FlutterError error; late final FlutterError error;
// Cannot use tester.pumpWidget here because it wraps the widget in a View, // Cannot use tester.pumpWidget here because it wraps the widget in a View,
// which introduces a MediaQuery ancestor. // which introduces a MediaQuery ancestor.
...@@ -87,7 +88,7 @@ void main() { ...@@ -87,7 +88,7 @@ void main() {
); );
}); });
testWidgets('MediaQuery.of finds a MediaQueryData when there is one', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.of finds a MediaQueryData when there is one', (WidgetTester tester) async {
bool tested = false; bool tested = false;
await tester.pumpWidget( await tester.pumpWidget(
MediaQuery( MediaQuery(
...@@ -107,7 +108,7 @@ void main() { ...@@ -107,7 +108,7 @@ void main() {
expect(tested, isTrue); expect(tested, isTrue);
}); });
testWidgets('MediaQuery.maybeOf defaults to null', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.maybeOf defaults to null', (WidgetTester tester) async {
bool tested = false; bool tested = false;
// Cannot use tester.pumpWidget here because it wraps the widget in a View, // Cannot use tester.pumpWidget here because it wraps the widget in a View,
// which introduces a MediaQuery ancestor. // which introduces a MediaQuery ancestor.
...@@ -128,7 +129,7 @@ void main() { ...@@ -128,7 +129,7 @@ void main() {
expect(tested, isTrue); expect(tested, isTrue);
}); });
testWidgets('MediaQuery.maybeOf finds a MediaQueryData when there is one', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.maybeOf finds a MediaQueryData when there is one', (WidgetTester tester) async {
bool tested = false; bool tested = false;
await tester.pumpWidget( await tester.pumpWidget(
MediaQuery( MediaQuery(
...@@ -146,7 +147,7 @@ void main() { ...@@ -146,7 +147,7 @@ void main() {
expect(tested, isTrue); expect(tested, isTrue);
}); });
testWidgets('MediaQueryData.fromView is sane', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQueryData.fromView is sane', (WidgetTester tester) async {
final MediaQueryData data = MediaQueryData.fromView(tester.view); final MediaQueryData data = MediaQueryData.fromView(tester.view);
expect(data, hasOneLineDescription); expect(data, hasOneLineDescription);
expect(data.hashCode, equals(data.copyWith().hashCode)); expect(data.hashCode, equals(data.copyWith().hashCode));
...@@ -162,7 +163,7 @@ void main() { ...@@ -162,7 +163,7 @@ void main() {
expect(data.displayFeatures, isEmpty); expect(data.displayFeatures, isEmpty);
}); });
testWidgets('MediaQueryData.fromView uses platformData if provided', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQueryData.fromView uses platformData if provided', (WidgetTester tester) async {
const MediaQueryData platformData = MediaQueryData( const MediaQueryData platformData = MediaQueryData(
textScaleFactor: 1234, textScaleFactor: 1234,
platformBrightness: Brightness.dark, platformBrightness: Brightness.dark,
...@@ -199,7 +200,7 @@ void main() { ...@@ -199,7 +200,7 @@ void main() {
expect(data.displayFeatures, tester.view.displayFeatures); expect(data.displayFeatures, tester.view.displayFeatures);
}); });
testWidgets('MediaQueryData.fromView uses data from platformDispatcher if no platformData is provided', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQueryData.fromView uses data from platformDispatcher if no platformData is provided', (WidgetTester tester) async {
tester.platformDispatcher tester.platformDispatcher
..textScaleFactorTestValue = 123 ..textScaleFactorTestValue = 123
..platformBrightnessTestValue = Brightness.dark ..platformBrightnessTestValue = Brightness.dark
...@@ -229,7 +230,7 @@ void main() { ...@@ -229,7 +230,7 @@ void main() {
expect(data.displayFeatures, tester.view.displayFeatures); expect(data.displayFeatures, tester.view.displayFeatures);
}); });
testWidgets('MediaQuery.fromView injects a new MediaQuery with data from view, preserving platform-specific data', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.fromView injects a new MediaQuery with data from view, preserving platform-specific data', (WidgetTester tester) async {
const MediaQueryData platformData = MediaQueryData( const MediaQueryData platformData = MediaQueryData(
textScaleFactor: 1234, textScaleFactor: 1234,
platformBrightness: Brightness.dark, platformBrightness: Brightness.dark,
...@@ -278,7 +279,7 @@ void main() { ...@@ -278,7 +279,7 @@ void main() {
expect(data.displayFeatures, tester.view.displayFeatures); expect(data.displayFeatures, tester.view.displayFeatures);
}); });
testWidgets('MediaQuery.fromView injects a new MediaQuery with data from view when no surrounding MediaQuery exists', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.fromView injects a new MediaQuery with data from view when no surrounding MediaQuery exists', (WidgetTester tester) async {
tester.platformDispatcher tester.platformDispatcher
..textScaleFactorTestValue = 123 ..textScaleFactorTestValue = 123
..platformBrightnessTestValue = Brightness.dark ..platformBrightnessTestValue = Brightness.dark
...@@ -329,7 +330,7 @@ void main() { ...@@ -329,7 +330,7 @@ void main() {
expect(data.displayFeatures, tester.view.displayFeatures); expect(data.displayFeatures, tester.view.displayFeatures);
}); });
testWidgets('MediaQuery.fromView updates on notifications (no parent data)', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.fromView updates on notifications (no parent data)', (WidgetTester tester) async {
addTearDown(() => tester.platformDispatcher.clearAllTestValues()); addTearDown(() => tester.platformDispatcher.clearAllTestValues());
addTearDown(() => tester.view.reset()); addTearDown(() => tester.view.reset());
...@@ -392,7 +393,7 @@ void main() { ...@@ -392,7 +393,7 @@ void main() {
expect(rebuildCount, 5); expect(rebuildCount, 5);
}); });
testWidgets('MediaQuery.fromView updates on notifications (with parent data)', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.fromView updates on notifications (with parent data)', (WidgetTester tester) async {
addTearDown(() => tester.platformDispatcher.clearAllTestValues()); addTearDown(() => tester.platformDispatcher.clearAllTestValues());
addTearDown(() => tester.view.reset()); addTearDown(() => tester.view.reset());
...@@ -451,7 +452,7 @@ void main() { ...@@ -451,7 +452,7 @@ void main() {
expect(rebuildCount, 2); expect(rebuildCount, 2);
}); });
testWidgets('MediaQuery.fromView updates when parent data changes', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.fromView updates when parent data changes', (WidgetTester tester) async {
late MediaQueryData data; late MediaQueryData data;
int rebuildCount = 0; int rebuildCount = 0;
TextScaler textScaler = const TextScaler.linear(55); TextScaler textScaler = const TextScaler.linear(55);
...@@ -488,7 +489,7 @@ void main() { ...@@ -488,7 +489,7 @@ void main() {
expect(rebuildCount, 2); expect(rebuildCount, 2);
}); });
testWidgets('MediaQueryData.copyWith defaults to source', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQueryData.copyWith defaults to source', (WidgetTester tester) async {
final MediaQueryData data = MediaQueryData.fromView(tester.view); final MediaQueryData data = MediaQueryData.fromView(tester.view);
final MediaQueryData copied = data.copyWith(); final MediaQueryData copied = data.copyWith();
expect(copied.size, data.size); expect(copied.size, data.size);
...@@ -510,7 +511,7 @@ void main() { ...@@ -510,7 +511,7 @@ void main() {
expect(copied.displayFeatures, data.displayFeatures); expect(copied.displayFeatures, data.displayFeatures);
}); });
testWidgets('MediaQuery.copyWith copies specified values', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.copyWith copies specified values', (WidgetTester tester) async {
// Random and unique double values are used to ensure that the correct // Random and unique double values are used to ensure that the correct
// values are copied over exactly // values are copied over exactly
const Size customSize = Size(3.14, 2.72); const Size customSize = Size(3.14, 2.72);
...@@ -570,7 +571,7 @@ void main() { ...@@ -570,7 +571,7 @@ void main() {
expect(copied.displayFeatures, customDisplayFeatures); expect(copied.displayFeatures, customDisplayFeatures);
}); });
testWidgets('MediaQuery.removePadding removes specified padding', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.removePadding removes specified padding', (WidgetTester tester) async {
const Size size = Size(2.0, 4.0); const Size size = Size(2.0, 4.0);
const double devicePixelRatio = 2.0; const double devicePixelRatio = 2.0;
const TextScaler textScaler = TextScaler.linear(1.2); const TextScaler textScaler = TextScaler.linear(1.2);
...@@ -642,7 +643,7 @@ void main() { ...@@ -642,7 +643,7 @@ void main() {
expect(unpadded.displayFeatures, displayFeatures); expect(unpadded.displayFeatures, displayFeatures);
}); });
testWidgets('MediaQuery.removePadding only removes specified padding', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.removePadding only removes specified padding', (WidgetTester tester) async {
const Size size = Size(2.0, 4.0); const Size size = Size(2.0, 4.0);
const double devicePixelRatio = 2.0; const double devicePixelRatio = 2.0;
const TextScaler textScaler = TextScaler.linear(1.2); const TextScaler textScaler = TextScaler.linear(1.2);
...@@ -711,7 +712,7 @@ void main() { ...@@ -711,7 +712,7 @@ void main() {
expect(unpadded.displayFeatures, displayFeatures); expect(unpadded.displayFeatures, displayFeatures);
}); });
testWidgets('MediaQuery.removeViewInsets removes specified viewInsets', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.removeViewInsets removes specified viewInsets', (WidgetTester tester) async {
const Size size = Size(2.0, 4.0); const Size size = Size(2.0, 4.0);
const double devicePixelRatio = 2.0; const double devicePixelRatio = 2.0;
const TextScaler textScaler = TextScaler.linear(1.2); const TextScaler textScaler = TextScaler.linear(1.2);
...@@ -783,7 +784,7 @@ void main() { ...@@ -783,7 +784,7 @@ void main() {
expect(unpadded.displayFeatures, displayFeatures); expect(unpadded.displayFeatures, displayFeatures);
}); });
testWidgets('MediaQuery.removeViewInsets removes only specified viewInsets', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.removeViewInsets removes only specified viewInsets', (WidgetTester tester) async {
const Size size = Size(2.0, 4.0); const Size size = Size(2.0, 4.0);
const double devicePixelRatio = 2.0; const double devicePixelRatio = 2.0;
const TextScaler textScaler = TextScaler.linear(1.2); const TextScaler textScaler = TextScaler.linear(1.2);
...@@ -852,7 +853,7 @@ void main() { ...@@ -852,7 +853,7 @@ void main() {
expect(unpadded.displayFeatures, displayFeatures); expect(unpadded.displayFeatures, displayFeatures);
}); });
testWidgets('MediaQuery.removeViewPadding removes specified viewPadding', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.removeViewPadding removes specified viewPadding', (WidgetTester tester) async {
const Size size = Size(2.0, 4.0); const Size size = Size(2.0, 4.0);
const double devicePixelRatio = 2.0; const double devicePixelRatio = 2.0;
const TextScaler textScaler = TextScaler.linear(1.2); const TextScaler textScaler = TextScaler.linear(1.2);
...@@ -924,7 +925,7 @@ void main() { ...@@ -924,7 +925,7 @@ void main() {
expect(unpadded.displayFeatures, displayFeatures); expect(unpadded.displayFeatures, displayFeatures);
}); });
testWidgets('MediaQuery.removeViewPadding removes only specified viewPadding', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.removeViewPadding removes only specified viewPadding', (WidgetTester tester) async {
const Size size = Size(2.0, 4.0); const Size size = Size(2.0, 4.0);
const double devicePixelRatio = 2.0; const double devicePixelRatio = 2.0;
const TextScaler textScaler = TextScaler.linear(1.2); const TextScaler textScaler = TextScaler.linear(1.2);
...@@ -993,7 +994,7 @@ void main() { ...@@ -993,7 +994,7 @@ void main() {
expect(unpadded.displayFeatures, displayFeatures); expect(unpadded.displayFeatures, displayFeatures);
}); });
testWidgets('MediaQuery.textScalerOf', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.textScalerOf', (WidgetTester tester) async {
late TextScaler outsideTextScaler; late TextScaler outsideTextScaler;
late TextScaler insideTextScaler; late TextScaler insideTextScaler;
...@@ -1020,7 +1021,7 @@ void main() { ...@@ -1020,7 +1021,7 @@ void main() {
expect(insideTextScaler, const TextScaler.linear(4.0)); expect(insideTextScaler, const TextScaler.linear(4.0));
}); });
testWidgets('MediaQuery.platformBrightnessOf', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.platformBrightnessOf', (WidgetTester tester) async {
late Brightness outsideBrightness; late Brightness outsideBrightness;
late Brightness insideBrightness; late Brightness insideBrightness;
...@@ -1047,7 +1048,7 @@ void main() { ...@@ -1047,7 +1048,7 @@ void main() {
expect(insideBrightness, Brightness.dark); expect(insideBrightness, Brightness.dark);
}); });
testWidgets('MediaQuery.highContrastOf', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.highContrastOf', (WidgetTester tester) async {
late bool outsideHighContrast; late bool outsideHighContrast;
late bool insideHighContrast; late bool insideHighContrast;
...@@ -1074,7 +1075,7 @@ void main() { ...@@ -1074,7 +1075,7 @@ void main() {
expect(insideHighContrast, true); expect(insideHighContrast, true);
}); });
testWidgets('MediaQuery.onOffSwitchLabelsOf', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.onOffSwitchLabelsOf', (WidgetTester tester) async {
late bool outsideOnOffSwitchLabels; late bool outsideOnOffSwitchLabels;
late bool insideOnOffSwitchLabels; late bool insideOnOffSwitchLabels;
...@@ -1101,7 +1102,7 @@ void main() { ...@@ -1101,7 +1102,7 @@ void main() {
expect(insideOnOffSwitchLabels, true); expect(insideOnOffSwitchLabels, true);
}); });
testWidgets('MediaQuery.boldTextOf', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.boldTextOf', (WidgetTester tester) async {
late bool outsideBoldTextOverride; late bool outsideBoldTextOverride;
late bool insideBoldTextOverride; late bool insideBoldTextOverride;
...@@ -1128,7 +1129,7 @@ void main() { ...@@ -1128,7 +1129,7 @@ void main() {
expect(insideBoldTextOverride, true); expect(insideBoldTextOverride, true);
}); });
testWidgets('MediaQuery.fromView creates a MediaQuery', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.fromView creates a MediaQuery', (WidgetTester tester) async {
MediaQuery? mediaQueryOutside; MediaQuery? mediaQueryOutside;
MediaQuery? mediaQueryInside; MediaQuery? mediaQueryInside;
...@@ -1153,7 +1154,7 @@ void main() { ...@@ -1153,7 +1154,7 @@ void main() {
expect(mediaQueryOutside, isNot(mediaQueryInside)); expect(mediaQueryOutside, isNot(mediaQueryInside));
}); });
testWidgets('MediaQueryData.fromWindow is created using window values', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQueryData.fromWindow is created using window values', (WidgetTester tester) async {
final MediaQueryData windowData = MediaQueryData.fromWindow(tester.view); final MediaQueryData windowData = MediaQueryData.fromWindow(tester.view);
late MediaQueryData fromWindowData; late MediaQueryData fromWindowData;
...@@ -1189,7 +1190,7 @@ void main() { ...@@ -1189,7 +1190,7 @@ void main() {
expect(settingsA, isNot(settingsB)); expect(settingsA, isNot(settingsB));
}); });
testWidgets('MediaQuery.removeDisplayFeatures removes specified display features and padding', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.removeDisplayFeatures removes specified display features and padding', (WidgetTester tester) async {
const Size size = Size(82.0, 40.0); const Size size = Size(82.0, 40.0);
const double devicePixelRatio = 2.0; const double devicePixelRatio = 2.0;
const TextScaler textScaler = TextScaler.linear(1.2); const TextScaler textScaler = TextScaler.linear(1.2);
...@@ -1263,7 +1264,7 @@ void main() { ...@@ -1263,7 +1264,7 @@ void main() {
expect(subScreenMediaQuery.displayFeatures, isEmpty); expect(subScreenMediaQuery.displayFeatures, isEmpty);
}); });
testWidgets('MediaQuery.removePadding only removes specified display features and padding', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery.removePadding only removes specified display features and padding', (WidgetTester tester) async {
const Size size = Size(82.0, 40.0); const Size size = Size(82.0, 40.0);
const double devicePixelRatio = 2.0; const double devicePixelRatio = 2.0;
const TextScaler textScaler = TextScaler.linear(1.2); const TextScaler textScaler = TextScaler.linear(1.2);
...@@ -1347,14 +1348,14 @@ void main() { ...@@ -1347,14 +1348,14 @@ void main() {
expect(subScreenMediaQuery.displayFeatures, <DisplayFeature>[cutoutDisplayFeature]); expect(subScreenMediaQuery.displayFeatures, <DisplayFeature>[cutoutDisplayFeature]);
}); });
testWidgets('MediaQueryData.gestureSettings is set from view.gestureSettings', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQueryData.gestureSettings is set from view.gestureSettings', (WidgetTester tester) async {
tester.view.gestureSettings = const GestureSettings(physicalDoubleTapSlop: 100, physicalTouchSlop: 100); tester.view.gestureSettings = const GestureSettings(physicalDoubleTapSlop: 100, physicalTouchSlop: 100);
addTearDown(() => tester.view.resetGestureSettings()); addTearDown(() => tester.view.resetGestureSettings());
expect(MediaQueryData.fromView(tester.view).gestureSettings.touchSlop, closeTo(33.33, 0.1)); // Repeating, of course expect(MediaQueryData.fromView(tester.view).gestureSettings.touchSlop, closeTo(33.33, 0.1)); // Repeating, of course
}); });
testWidgets('MediaQuery can be partially depended-on', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery can be partially depended-on', (WidgetTester tester) async {
MediaQueryData data = const MediaQueryData( MediaQueryData data = const MediaQueryData(
size: Size(800, 600), size: Size(800, 600),
textScaler: TextScaler.linear(1.1), textScaler: TextScaler.linear(1.1),
...@@ -1430,7 +1431,7 @@ void main() { ...@@ -1430,7 +1431,7 @@ void main() {
expect(textScalerBuildCount, 2); expect(textScalerBuildCount, 2);
}); });
testWidgets('MediaQuery partial dependencies', (WidgetTester tester) async { testWidgetsWithLeakTracking('MediaQuery partial dependencies', (WidgetTester tester) async {
MediaQueryData data = const MediaQueryData(); MediaQueryData data = const MediaQueryData();
int buildCount = 0; int buildCount = 0;
......
...@@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; ...@@ -8,6 +8,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'semantics_tester.dart'; import 'semantics_tester.dart';
...@@ -46,7 +47,7 @@ void main() { ...@@ -46,7 +47,7 @@ void main() {
}); });
group('ModalBarrier', () { group('ModalBarrier', () {
testWidgets('prevents interactions with widgets behind it', (WidgetTester tester) async { testWidgetsWithLeakTracking('prevents interactions with widgets behind it', (WidgetTester tester) async {
final Widget subject = Stack( final Widget subject = Stack(
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
children: <Widget>[ children: <Widget>[
...@@ -61,7 +62,7 @@ void main() { ...@@ -61,7 +62,7 @@ void main() {
expect(tapped, isFalse, reason: 'because the tap is not prevented by ModalBarrier'); expect(tapped, isFalse, reason: 'because the tap is not prevented by ModalBarrier');
}); });
testWidgets('prevents hover interactions with widgets behind it', (WidgetTester tester) async { testWidgetsWithLeakTracking('prevents hover interactions with widgets behind it', (WidgetTester tester) async {
final Widget subject = Stack( final Widget subject = Stack(
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
children: <Widget>[ children: <Widget>[
...@@ -88,7 +89,7 @@ void main() { ...@@ -88,7 +89,7 @@ void main() {
expect(hovered, isFalse, reason: 'because the hover is not prevented by ModalBarrier'); expect(hovered, isFalse, reason: 'because the hover is not prevented by ModalBarrier');
}); });
testWidgets('does not prevent interactions with widgets in front of it', (WidgetTester tester) async { testWidgetsWithLeakTracking('does not prevent interactions with widgets in front of it', (WidgetTester tester) async {
final Widget subject = Stack( final Widget subject = Stack(
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
children: <Widget>[ children: <Widget>[
...@@ -103,7 +104,7 @@ void main() { ...@@ -103,7 +104,7 @@ void main() {
expect(tapped, isTrue, reason: 'because the tap is prevented by ModalBarrier'); expect(tapped, isTrue, reason: 'because the tap is prevented by ModalBarrier');
}); });
testWidgets('does not prevent interactions with translucent widgets in front of it', (WidgetTester tester) async { testWidgetsWithLeakTracking('does not prevent interactions with translucent widgets in front of it', (WidgetTester tester) async {
bool dragged = false; bool dragged = false;
final Widget subject = Stack( final Widget subject = Stack(
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
...@@ -130,7 +131,7 @@ void main() { ...@@ -130,7 +131,7 @@ void main() {
expect(dragged, isTrue, reason: 'because the drag is prevented by ModalBarrier'); expect(dragged, isTrue, reason: 'because the drag is prevented by ModalBarrier');
}); });
testWidgets('does not prevent hover interactions with widgets in front of it', (WidgetTester tester) async { testWidgetsWithLeakTracking('does not prevent hover interactions with widgets in front of it', (WidgetTester tester) async {
final Widget subject = Stack( final Widget subject = Stack(
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
children: <Widget>[ children: <Widget>[
...@@ -158,7 +159,7 @@ void main() { ...@@ -158,7 +159,7 @@ void main() {
hovered = false; hovered = false;
}); });
testWidgets('plays system alert sound when user tries to dismiss it', (WidgetTester tester) async { testWidgetsWithLeakTracking('plays system alert sound when user tries to dismiss it', (WidgetTester tester) async {
final List<String> playedSystemSounds = <String>[]; final List<String> playedSystemSounds = <String>[];
try { try {
tester.binding.defaultBinaryMessenger.setMockMethodCallHandler( tester.binding.defaultBinaryMessenger.setMockMethodCallHandler(
...@@ -187,7 +188,7 @@ void main() { ...@@ -187,7 +188,7 @@ void main() {
expect(playedSystemSounds[0], SystemSoundType.alert.toString()); expect(playedSystemSounds[0], SystemSoundType.alert.toString());
}); });
testWidgets('pops the Navigator when dismissed by primary tap', (WidgetTester tester) async { testWidgetsWithLeakTracking('pops the Navigator when dismissed by primary tap', (WidgetTester tester) async {
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{ final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/': (BuildContext context) => const FirstWidget(), '/': (BuildContext context) => const FirstWidget(),
'/modal': (BuildContext context) => const SecondWidget(), '/modal': (BuildContext context) => const SecondWidget(),
...@@ -220,7 +221,7 @@ void main() { ...@@ -220,7 +221,7 @@ void main() {
); );
}); });
testWidgets('pops the Navigator when dismissed by non-primary tap', (WidgetTester tester) async { testWidgetsWithLeakTracking('pops the Navigator when dismissed by non-primary tap', (WidgetTester tester) async {
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{ final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/': (BuildContext context) => const FirstWidget(), '/': (BuildContext context) => const FirstWidget(),
'/modal': (BuildContext context) => const SecondWidget(), '/modal': (BuildContext context) => const SecondWidget(),
...@@ -254,7 +255,7 @@ void main() { ...@@ -254,7 +255,7 @@ void main() {
); );
}); });
testWidgets('may pop the Navigator when competing with other gestures', (WidgetTester tester) async { testWidgetsWithLeakTracking('may pop the Navigator when competing with other gestures', (WidgetTester tester) async {
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{ final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/': (BuildContext context) => const FirstWidget(), '/': (BuildContext context) => const FirstWidget(),
'/modal': (BuildContext context) => const SecondWidgetWithCompetence(), '/modal': (BuildContext context) => const SecondWidgetWithCompetence(),
...@@ -282,7 +283,7 @@ void main() { ...@@ -282,7 +283,7 @@ void main() {
); );
}); });
testWidgets('does not pop the Navigator with a WillPopScope that returns false', (WidgetTester tester) async { testWidgetsWithLeakTracking('does not pop the Navigator with a WillPopScope that returns false', (WidgetTester tester) async {
bool willPopCalled = false; bool willPopCalled = false;
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{ final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/': (BuildContext context) => const FirstWidget(), '/': (BuildContext context) => const FirstWidget(),
...@@ -327,7 +328,7 @@ void main() { ...@@ -327,7 +328,7 @@ void main() {
expect(willPopCalled, isTrue); expect(willPopCalled, isTrue);
}); });
testWidgets('pops the Navigator with a WillPopScope that returns true', (WidgetTester tester) async { testWidgetsWithLeakTracking('pops the Navigator with a WillPopScope that returns true', (WidgetTester tester) async {
bool willPopCalled = false; bool willPopCalled = false;
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{ final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/': (BuildContext context) => const FirstWidget(), '/': (BuildContext context) => const FirstWidget(),
...@@ -372,7 +373,7 @@ void main() { ...@@ -372,7 +373,7 @@ void main() {
expect(willPopCalled, isTrue); expect(willPopCalled, isTrue);
}); });
testWidgets('will call onDismiss callback', (WidgetTester tester) async { testWidgetsWithLeakTracking('will call onDismiss callback', (WidgetTester tester) async {
bool dismissCallbackCalled = false; bool dismissCallbackCalled = false;
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{ final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/': (BuildContext context) => const FirstWidget(), '/': (BuildContext context) => const FirstWidget(),
...@@ -400,7 +401,7 @@ void main() { ...@@ -400,7 +401,7 @@ void main() {
expect(dismissCallbackCalled, true); expect(dismissCallbackCalled, true);
}); });
testWidgets('when onDismiss throws, should have correct context', (WidgetTester tester) async { testWidgetsWithLeakTracking('when onDismiss throws, should have correct context', (WidgetTester tester) async {
final FlutterExceptionHandler? handler = FlutterError.onError; final FlutterExceptionHandler? handler = FlutterError.onError;
FlutterErrorDetails? error; FlutterErrorDetails? error;
FlutterError.onError = (FlutterErrorDetails details) { FlutterError.onError = (FlutterErrorDetails details) {
...@@ -423,7 +424,7 @@ void main() { ...@@ -423,7 +424,7 @@ void main() {
FlutterError.onError = handler; FlutterError.onError = handler;
}); });
testWidgets('will not pop when given an onDismiss callback', (WidgetTester tester) async { testWidgetsWithLeakTracking('will not pop when given an onDismiss callback', (WidgetTester tester) async {
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{ final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/': (BuildContext context) => const FirstWidget(), '/': (BuildContext context) => const FirstWidget(),
'/modal': (BuildContext context) => SecondWidget(onDismiss: () {}), '/modal': (BuildContext context) => SecondWidget(onDismiss: () {}),
...@@ -450,7 +451,7 @@ void main() { ...@@ -450,7 +451,7 @@ void main() {
); );
}); });
testWidgets('Undismissible ModalBarrier hidden in semantic tree', (WidgetTester tester) async { testWidgetsWithLeakTracking('Undismissible ModalBarrier hidden in semantic tree', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester); final SemanticsTester semantics = SemanticsTester(tester);
await tester.pumpWidget(const ModalBarrier(dismissible: false)); await tester.pumpWidget(const ModalBarrier(dismissible: false));
...@@ -460,7 +461,7 @@ void main() { ...@@ -460,7 +461,7 @@ void main() {
semantics.dispose(); semantics.dispose();
}); });
testWidgets('Dismissible ModalBarrier includes button in semantic tree on iOS, macOS and android', (WidgetTester tester) async { testWidgetsWithLeakTracking('Dismissible ModalBarrier includes button in semantic tree on iOS, macOS and android', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester); final SemanticsTester semantics = SemanticsTester(tester);
await tester.pumpWidget(const Directionality( await tester.pumpWidget(const Directionality(
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
...@@ -486,7 +487,7 @@ void main() { ...@@ -486,7 +487,7 @@ void main() {
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS, TargetPlatform.android})); }, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS, TargetPlatform.android}));
}); });
group('AnimatedModalBarrier', () { group('AnimatedModalBarrier', () {
testWidgets('prevents interactions with widgets behind it', (WidgetTester tester) async { testWidgetsWithLeakTracking('prevents interactions with widgets behind it', (WidgetTester tester) async {
final Widget subject = Stack( final Widget subject = Stack(
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
children: <Widget>[ children: <Widget>[
...@@ -501,7 +502,7 @@ void main() { ...@@ -501,7 +502,7 @@ void main() {
expect(tapped, isFalse, reason: 'because the tap is not prevented by ModalBarrier'); expect(tapped, isFalse, reason: 'because the tap is not prevented by ModalBarrier');
}); });
testWidgets('prevents hover interactions with widgets behind it', (WidgetTester tester) async { testWidgetsWithLeakTracking('prevents hover interactions with widgets behind it', (WidgetTester tester) async {
final Widget subject = Stack( final Widget subject = Stack(
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
children: <Widget>[ children: <Widget>[
...@@ -528,7 +529,7 @@ void main() { ...@@ -528,7 +529,7 @@ void main() {
expect(hovered, isFalse, reason: 'because the hover is not prevented by AnimatedModalBarrier'); expect(hovered, isFalse, reason: 'because the hover is not prevented by AnimatedModalBarrier');
}); });
testWidgets('does not prevent interactions with widgets in front of it', (WidgetTester tester) async { testWidgetsWithLeakTracking('does not prevent interactions with widgets in front of it', (WidgetTester tester) async {
final Widget subject = Stack( final Widget subject = Stack(
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
children: <Widget>[ children: <Widget>[
...@@ -543,7 +544,7 @@ void main() { ...@@ -543,7 +544,7 @@ void main() {
expect(tapped, isTrue, reason: 'because the tap is prevented by AnimatedModalBarrier'); expect(tapped, isTrue, reason: 'because the tap is prevented by AnimatedModalBarrier');
}); });
testWidgets('does not prevent interactions with translucent widgets in front of it', (WidgetTester tester) async { testWidgetsWithLeakTracking('does not prevent interactions with translucent widgets in front of it', (WidgetTester tester) async {
bool dragged = false; bool dragged = false;
final Widget subject = Stack( final Widget subject = Stack(
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
...@@ -570,7 +571,7 @@ void main() { ...@@ -570,7 +571,7 @@ void main() {
expect(dragged, isTrue, reason: 'because the drag is prevented by AnimatedModalBarrier'); expect(dragged, isTrue, reason: 'because the drag is prevented by AnimatedModalBarrier');
}); });
testWidgets('does not prevent hover interactions with widgets in front of it', (WidgetTester tester) async { testWidgetsWithLeakTracking('does not prevent hover interactions with widgets in front of it', (WidgetTester tester) async {
final Widget subject = Stack( final Widget subject = Stack(
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
children: <Widget>[ children: <Widget>[
...@@ -598,7 +599,7 @@ void main() { ...@@ -598,7 +599,7 @@ void main() {
hovered = false; hovered = false;
}); });
testWidgets('plays system alert sound when user tries to dismiss it', (WidgetTester tester) async { testWidgetsWithLeakTracking('plays system alert sound when user tries to dismiss it', (WidgetTester tester) async {
final List<String> playedSystemSounds = <String>[]; final List<String> playedSystemSounds = <String>[];
try { try {
tester.binding.defaultBinaryMessenger.setMockMethodCallHandler( tester.binding.defaultBinaryMessenger.setMockMethodCallHandler(
...@@ -627,7 +628,7 @@ void main() { ...@@ -627,7 +628,7 @@ void main() {
expect(playedSystemSounds[0], SystemSoundType.alert.toString()); expect(playedSystemSounds[0], SystemSoundType.alert.toString());
}); });
testWidgets('pops the Navigator when dismissed by primary tap', (WidgetTester tester) async { testWidgetsWithLeakTracking('pops the Navigator when dismissed by primary tap', (WidgetTester tester) async {
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{ final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/': (BuildContext context) => const FirstWidget(), '/': (BuildContext context) => const FirstWidget(),
'/modal': (BuildContext context) => const AnimatedSecondWidget(), '/modal': (BuildContext context) => const AnimatedSecondWidget(),
...@@ -660,7 +661,7 @@ void main() { ...@@ -660,7 +661,7 @@ void main() {
); );
}); });
testWidgets('pops the Navigator when dismissed by non-primary tap', (WidgetTester tester) async { testWidgetsWithLeakTracking('pops the Navigator when dismissed by non-primary tap', (WidgetTester tester) async {
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{ final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/': (BuildContext context) => const FirstWidget(), '/': (BuildContext context) => const FirstWidget(),
'/modal': (BuildContext context) => const AnimatedSecondWidget(), '/modal': (BuildContext context) => const AnimatedSecondWidget(),
...@@ -694,7 +695,7 @@ void main() { ...@@ -694,7 +695,7 @@ void main() {
); );
}); });
testWidgets('may pop the Navigator when competing with other gestures', (WidgetTester tester) async { testWidgetsWithLeakTracking('may pop the Navigator when competing with other gestures', (WidgetTester tester) async {
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{ final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/': (BuildContext context) => const FirstWidget(), '/': (BuildContext context) => const FirstWidget(),
'/modal': (BuildContext context) => const AnimatedSecondWidgetWithCompetence(), '/modal': (BuildContext context) => const AnimatedSecondWidgetWithCompetence(),
...@@ -722,7 +723,7 @@ void main() { ...@@ -722,7 +723,7 @@ void main() {
); );
}); });
testWidgets('does not pop the Navigator with a WillPopScope that returns false', (WidgetTester tester) async { testWidgetsWithLeakTracking('does not pop the Navigator with a WillPopScope that returns false', (WidgetTester tester) async {
bool willPopCalled = false; bool willPopCalled = false;
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{ final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/': (BuildContext context) => const FirstWidget(), '/': (BuildContext context) => const FirstWidget(),
...@@ -767,7 +768,7 @@ void main() { ...@@ -767,7 +768,7 @@ void main() {
expect(willPopCalled, isTrue); expect(willPopCalled, isTrue);
}); });
testWidgets('pops the Navigator with a WillPopScope that returns true', (WidgetTester tester) async { testWidgetsWithLeakTracking('pops the Navigator with a WillPopScope that returns true', (WidgetTester tester) async {
bool willPopCalled = false; bool willPopCalled = false;
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{ final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/': (BuildContext context) => const FirstWidget(), '/': (BuildContext context) => const FirstWidget(),
...@@ -812,7 +813,7 @@ void main() { ...@@ -812,7 +813,7 @@ void main() {
expect(willPopCalled, isTrue); expect(willPopCalled, isTrue);
}); });
testWidgets('will call onDismiss callback', (WidgetTester tester) async { testWidgetsWithLeakTracking('will call onDismiss callback', (WidgetTester tester) async {
bool dismissCallbackCalled = false; bool dismissCallbackCalled = false;
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{ final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/': (BuildContext context) => const FirstWidget(), '/': (BuildContext context) => const FirstWidget(),
...@@ -840,7 +841,7 @@ void main() { ...@@ -840,7 +841,7 @@ void main() {
expect(dismissCallbackCalled, true); expect(dismissCallbackCalled, true);
}); });
testWidgets('will not pop when given an onDismiss callback', (WidgetTester tester) async { testWidgetsWithLeakTracking('will not pop when given an onDismiss callback', (WidgetTester tester) async {
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{ final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/': (BuildContext context) => const FirstWidget(), '/': (BuildContext context) => const FirstWidget(),
'/modal': (BuildContext context) => AnimatedSecondWidget(onDismiss: () {}), '/modal': (BuildContext context) => AnimatedSecondWidget(onDismiss: () {}),
...@@ -867,7 +868,7 @@ void main() { ...@@ -867,7 +868,7 @@ void main() {
); );
}); });
testWidgets('Undismissible AnimatedModalBarrier hidden in semantic tree', (WidgetTester tester) async { testWidgetsWithLeakTracking('Undismissible AnimatedModalBarrier hidden in semantic tree', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester); final SemanticsTester semantics = SemanticsTester(tester);
await tester.pumpWidget(AnimatedModalBarrier(dismissible: false, color: colorAnimation)); await tester.pumpWidget(AnimatedModalBarrier(dismissible: false, color: colorAnimation));
...@@ -877,7 +878,7 @@ void main() { ...@@ -877,7 +878,7 @@ void main() {
semantics.dispose(); semantics.dispose();
}); });
testWidgets('Dismissible AnimatedModalBarrier includes button in semantic tree on iOS, macOS and android', (WidgetTester tester) async { testWidgetsWithLeakTracking('Dismissible AnimatedModalBarrier includes button in semantic tree on iOS, macOS and android', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester); final SemanticsTester semantics = SemanticsTester(tester);
await tester.pumpWidget(Directionality( await tester.pumpWidget(Directionality(
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
...@@ -904,9 +905,10 @@ void main() { ...@@ -904,9 +905,10 @@ void main() {
}); });
group('SemanticsClipper', () { group('SemanticsClipper', () {
testWidgets('SemanticsClipper correctly clips Semantics.rect in four directions', (WidgetTester tester) async { testWidgetsWithLeakTracking('SemanticsClipper correctly clips Semantics.rect in four directions', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester); final SemanticsTester semantics = SemanticsTester(tester);
final ValueNotifier<EdgeInsets> notifier = ValueNotifier<EdgeInsets>(const EdgeInsets.fromLTRB(10, 20, 30, 40)); final ValueNotifier<EdgeInsets> notifier = ValueNotifier<EdgeInsets>(const EdgeInsets.fromLTRB(10, 20, 30, 40));
addTearDown(notifier.dispose);
const Rect fullScreen = TestSemantics.fullScreen; const Rect fullScreen = TestSemantics.fullScreen;
await tester.pumpWidget(Directionality( await tester.pumpWidget(Directionality(
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
...@@ -933,7 +935,7 @@ void main() { ...@@ -933,7 +935,7 @@ void main() {
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS, TargetPlatform.android})); }, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS, TargetPlatform.android}));
}); });
testWidgets('uses default mouse cursor', (WidgetTester tester) async { testWidgetsWithLeakTracking('uses default mouse cursor', (WidgetTester tester) async {
await tester.pumpWidget(const Stack( await tester.pumpWidget(const Stack(
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
children: <Widget>[ children: <Widget>[
......
...@@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; ...@@ -8,6 +8,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
class HoverClient extends StatefulWidget { class HoverClient extends StatefulWidget {
const HoverClient({ const HoverClient({
...@@ -77,7 +78,7 @@ class _HoverFeedbackState extends State<HoverFeedback> { ...@@ -77,7 +78,7 @@ class _HoverFeedbackState extends State<HoverFeedback> {
void main() { void main() {
// Regression test for https://github.com/flutter/flutter/issues/73330 // Regression test for https://github.com/flutter/flutter/issues/73330
testWidgets('hitTestBehavior test - HitTestBehavior.deferToChild/opaque', (WidgetTester tester) async { testWidgetsWithLeakTracking('hitTestBehavior test - HitTestBehavior.deferToChild/opaque', (WidgetTester tester) async {
bool onEnter = false; bool onEnter = false;
await tester.pumpWidget(Center( await tester.pumpWidget(Center(
child: MouseRegion( child: MouseRegion(
...@@ -103,7 +104,7 @@ void main() { ...@@ -103,7 +104,7 @@ void main() {
expect(onEnter, true); expect(onEnter, true);
}); });
testWidgets('hitTestBehavior test - HitTestBehavior.deferToChild and non-opaque', (WidgetTester tester) async { testWidgetsWithLeakTracking('hitTestBehavior test - HitTestBehavior.deferToChild and non-opaque', (WidgetTester tester) async {
bool onEnterRegion1 = false; bool onEnterRegion1 = false;
bool onEnterRegion2 = false; bool onEnterRegion2 = false;
await tester.pumpWidget(Directionality( await tester.pumpWidget(Directionality(
...@@ -143,7 +144,7 @@ void main() { ...@@ -143,7 +144,7 @@ void main() {
expect(onEnterRegion1, true); expect(onEnterRegion1, true);
}); });
testWidgets('hitTestBehavior test - HitTestBehavior.translucent', (WidgetTester tester) async { testWidgetsWithLeakTracking('hitTestBehavior test - HitTestBehavior.translucent', (WidgetTester tester) async {
bool onEnterRegion1 = false; bool onEnterRegion1 = false;
bool onEnterRegion2 = false; bool onEnterRegion2 = false;
await tester.pumpWidget(Directionality( await tester.pumpWidget(Directionality(
...@@ -177,7 +178,7 @@ void main() { ...@@ -177,7 +178,7 @@ void main() {
expect(onEnterRegion1, true); expect(onEnterRegion1, true);
}); });
testWidgets('onEnter and onExit can be triggered with mouse buttons pressed', (WidgetTester tester) async { testWidgetsWithLeakTracking('onEnter and onExit can be triggered with mouse buttons pressed', (WidgetTester tester) async {
PointerEnterEvent? enter; PointerEnterEvent? enter;
PointerExitEvent? exit; PointerExitEvent? exit;
await tester.pumpWidget(Center( await tester.pumpWidget(Center(
...@@ -212,7 +213,7 @@ void main() { ...@@ -212,7 +213,7 @@ void main() {
expect(exit!.localPosition, equals(const Offset(-349.0, -249.0))); expect(exit!.localPosition, equals(const Offset(-349.0, -249.0)));
}); });
testWidgets('detects pointer enter', (WidgetTester tester) async { testWidgetsWithLeakTracking('detects pointer enter', (WidgetTester tester) async {
PointerEnterEvent? enter; PointerEnterEvent? enter;
PointerHoverEvent? move; PointerHoverEvent? move;
PointerExitEvent? exit; PointerExitEvent? exit;
...@@ -244,7 +245,7 @@ void main() { ...@@ -244,7 +245,7 @@ void main() {
expect(exit, isNull); expect(exit, isNull);
}); });
testWidgets('detects pointer exiting', (WidgetTester tester) async { testWidgetsWithLeakTracking('detects pointer exiting', (WidgetTester tester) async {
PointerEnterEvent? enter; PointerEnterEvent? enter;
PointerHoverEvent? move; PointerHoverEvent? move;
PointerExitEvent? exit; PointerExitEvent? exit;
...@@ -275,7 +276,7 @@ void main() { ...@@ -275,7 +276,7 @@ void main() {
expect(exit!.localPosition, equals(const Offset(-349.0, -249.0))); expect(exit!.localPosition, equals(const Offset(-349.0, -249.0)));
}); });
testWidgets('triggers pointer enter when a mouse is connected', (WidgetTester tester) async { testWidgetsWithLeakTracking('triggers pointer enter when a mouse is connected', (WidgetTester tester) async {
PointerEnterEvent? enter; PointerEnterEvent? enter;
PointerHoverEvent? move; PointerHoverEvent? move;
PointerExitEvent? exit; PointerExitEvent? exit;
...@@ -301,7 +302,7 @@ void main() { ...@@ -301,7 +302,7 @@ void main() {
expect(exit, isNull); expect(exit, isNull);
}); });
testWidgets('triggers pointer exit when a mouse is disconnected', (WidgetTester tester) async { testWidgetsWithLeakTracking('triggers pointer exit when a mouse is disconnected', (WidgetTester tester) async {
PointerEnterEvent? enter; PointerEnterEvent? enter;
PointerHoverEvent? move; PointerHoverEvent? move;
PointerExitEvent? exit; PointerExitEvent? exit;
...@@ -339,7 +340,7 @@ void main() { ...@@ -339,7 +340,7 @@ void main() {
expect(exit, isNull); expect(exit, isNull);
}); });
testWidgets('triggers pointer enter when widget appears', (WidgetTester tester) async { testWidgetsWithLeakTracking('triggers pointer enter when widget appears', (WidgetTester tester) async {
PointerEnterEvent? enter; PointerEnterEvent? enter;
PointerHoverEvent? move; PointerHoverEvent? move;
PointerExitEvent? exit; PointerExitEvent? exit;
...@@ -375,7 +376,7 @@ void main() { ...@@ -375,7 +376,7 @@ void main() {
expect(exit, isNull); expect(exit, isNull);
}); });
testWidgets("doesn't trigger pointer exit when widget disappears", (WidgetTester tester) async { testWidgetsWithLeakTracking("doesn't trigger pointer exit when widget disappears", (WidgetTester tester) async {
PointerEnterEvent? enter; PointerEnterEvent? enter;
PointerHoverEvent? move; PointerHoverEvent? move;
PointerExitEvent? exit; PointerExitEvent? exit;
...@@ -408,7 +409,7 @@ void main() { ...@@ -408,7 +409,7 @@ void main() {
expect(exit, isNull); expect(exit, isNull);
}); });
testWidgets('triggers pointer enter when widget moves in', (WidgetTester tester) async { testWidgetsWithLeakTracking('triggers pointer enter when widget moves in', (WidgetTester tester) async {
PointerEnterEvent? enter; PointerEnterEvent? enter;
PointerHoverEvent? move; PointerHoverEvent? move;
PointerExitEvent? exit; PointerExitEvent? exit;
...@@ -450,7 +451,7 @@ void main() { ...@@ -450,7 +451,7 @@ void main() {
expect(exit, isNull); expect(exit, isNull);
}); });
testWidgets('triggers pointer exit when widget moves out', (WidgetTester tester) async { testWidgetsWithLeakTracking('triggers pointer exit when widget moves out', (WidgetTester tester) async {
PointerEnterEvent? enter; PointerEnterEvent? enter;
PointerHoverEvent? move; PointerHoverEvent? move;
PointerExitEvent? exit; PointerExitEvent? exit;
...@@ -492,7 +493,7 @@ void main() { ...@@ -492,7 +493,7 @@ void main() {
expect(exit!.localPosition, equals(const Offset(50, 50))); expect(exit!.localPosition, equals(const Offset(50, 50)));
}); });
testWidgets('detects hover from touch devices', (WidgetTester tester) async { testWidgetsWithLeakTracking('detects hover from touch devices', (WidgetTester tester) async {
PointerEnterEvent? enter; PointerEnterEvent? enter;
PointerHoverEvent? move; PointerHoverEvent? move;
PointerExitEvent? exit; PointerExitEvent? exit;
...@@ -522,7 +523,7 @@ void main() { ...@@ -522,7 +523,7 @@ void main() {
expect(exit, isNull); expect(exit, isNull);
}); });
testWidgets('Hover works with nested listeners', (WidgetTester tester) async { testWidgetsWithLeakTracking('Hover works with nested listeners', (WidgetTester tester) async {
final UniqueKey key1 = UniqueKey(); final UniqueKey key1 = UniqueKey();
final UniqueKey key2 = UniqueKey(); final UniqueKey key2 = UniqueKey();
final List<PointerEnterEvent> enter1 = <PointerEnterEvent>[]; final List<PointerEnterEvent> enter1 = <PointerEnterEvent>[];
...@@ -597,7 +598,7 @@ void main() { ...@@ -597,7 +598,7 @@ void main() {
clearLists(); clearLists();
}); });
testWidgets('Hover transfers between two listeners', (WidgetTester tester) async { testWidgetsWithLeakTracking('Hover transfers between two listeners', (WidgetTester tester) async {
final UniqueKey key1 = UniqueKey(); final UniqueKey key1 = UniqueKey();
final UniqueKey key2 = UniqueKey(); final UniqueKey key2 = UniqueKey();
final List<PointerEnterEvent> enter1 = <PointerEnterEvent>[]; final List<PointerEnterEvent> enter1 = <PointerEnterEvent>[];
...@@ -690,7 +691,7 @@ void main() { ...@@ -690,7 +691,7 @@ void main() {
expect(exit2, isEmpty); expect(exit2, isEmpty);
}); });
testWidgets('applies mouse cursor', (WidgetTester tester) async { testWidgetsWithLeakTracking('applies mouse cursor', (WidgetTester tester) async {
await tester.pumpWidget(const _Scaffold( await tester.pumpWidget(const _Scaffold(
topLeft: MouseRegion( topLeft: MouseRegion(
cursor: SystemMouseCursors.text, cursor: SystemMouseCursors.text,
...@@ -711,7 +712,7 @@ void main() { ...@@ -711,7 +712,7 @@ void main() {
expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.basic); expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.basic);
}); });
testWidgets('MouseRegion uses updated callbacks', (WidgetTester tester) async { testWidgetsWithLeakTracking('MouseRegion uses updated callbacks', (WidgetTester tester) async {
final List<String> logs = <String>[]; final List<String> logs = <String>[];
Widget hoverableContainer({ Widget hoverableContainer({
PointerEnterEventListener? onEnter, PointerEnterEventListener? onEnter,
...@@ -773,7 +774,7 @@ void main() { ...@@ -773,7 +774,7 @@ void main() {
expect(logs, <String>['enter2', 'hover2', 'exit2']); expect(logs, <String>['enter2', 'hover2', 'exit2']);
}); });
testWidgets('needsCompositing set when parent class needsCompositing is set', (WidgetTester tester) async { testWidgetsWithLeakTracking('needsCompositing set when parent class needsCompositing is set', (WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
MouseRegion( MouseRegion(
onEnter: (PointerEnterEvent _) {}, onEnter: (PointerEnterEvent _) {},
...@@ -795,7 +796,7 @@ void main() { ...@@ -795,7 +796,7 @@ void main() {
expect(listener.needsCompositing, isFalse); expect(listener.needsCompositing, isFalse);
}); });
testWidgets('works with transform', (WidgetTester tester) async { testWidgetsWithLeakTracking('works with transform', (WidgetTester tester) async {
// Regression test for https://github.com/flutter/flutter/issues/31986. // Regression test for https://github.com/flutter/flutter/issues/31986.
final Key key = UniqueKey(); final Key key = UniqueKey();
const double scaleFactor = 2.0; const double scaleFactor = 2.0;
...@@ -862,7 +863,7 @@ void main() { ...@@ -862,7 +863,7 @@ void main() {
events.clear(); events.clear();
}); });
testWidgets('needsCompositing is always false', (WidgetTester tester) async { testWidgetsWithLeakTracking('needsCompositing is always false', (WidgetTester tester) async {
// Pretend that we have a mouse connected. // Pretend that we have a mouse connected.
final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse);
await gesture.addPointer(); await gesture.addPointer();
...@@ -897,7 +898,7 @@ void main() { ...@@ -897,7 +898,7 @@ void main() {
expect(tester.layers.whereType<TransformLayer>(), hasLength(1)); expect(tester.layers.whereType<TransformLayer>(), hasLength(1));
}); });
testWidgets("Callbacks aren't called during build", (WidgetTester tester) async { testWidgetsWithLeakTracking("Callbacks aren't called during build", (WidgetTester tester) async {
final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse);
await gesture.addPointer(location: Offset.zero); await gesture.addPointer(location: Offset.zero);
...@@ -939,7 +940,7 @@ void main() { ...@@ -939,7 +940,7 @@ void main() {
expect(numExits, equals(0)); expect(numExits, equals(0));
}); });
testWidgets("MouseRegion activate/deactivate don't duplicate annotations", (WidgetTester tester) async { testWidgetsWithLeakTracking("MouseRegion activate/deactivate don't duplicate annotations", (WidgetTester tester) async {
final GlobalKey feedbackKey = GlobalKey(); final GlobalKey feedbackKey = GlobalKey();
final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse);
await gesture.addPointer(); await gesture.addPointer();
...@@ -983,7 +984,7 @@ void main() { ...@@ -983,7 +984,7 @@ void main() {
expect(numExits, equals(0)); expect(numExits, equals(0));
}); });
testWidgets('Exit event when unplugging mouse should have a position', (WidgetTester tester) async { testWidgetsWithLeakTracking('Exit event when unplugging mouse should have a position', (WidgetTester tester) async {
final List<PointerEnterEvent> enter = <PointerEnterEvent>[]; final List<PointerEnterEvent> enter = <PointerEnterEvent>[];
final List<PointerHoverEvent> hover = <PointerHoverEvent>[]; final List<PointerHoverEvent> hover = <PointerHoverEvent>[];
final List<PointerExitEvent> exit = <PointerExitEvent>[]; final List<PointerExitEvent> exit = <PointerExitEvent>[];
...@@ -1031,7 +1032,7 @@ void main() { ...@@ -1031,7 +1032,7 @@ void main() {
expect(exit.single.delta, Offset.zero); expect(exit.single.delta, Offset.zero);
}); });
testWidgets('detects pointer enter with closure arguments', (WidgetTester tester) async { testWidgetsWithLeakTracking('detects pointer enter with closure arguments', (WidgetTester tester) async {
await tester.pumpWidget(const _HoverClientWithClosures()); await tester.pumpWidget(const _HoverClientWithClosures());
expect(find.text('not hovering'), findsOneWidget); expect(find.text('not hovering'), findsOneWidget);
...@@ -1048,7 +1049,7 @@ void main() { ...@@ -1048,7 +1049,7 @@ void main() {
expect(find.text('HOVERING'), findsOneWidget); expect(find.text('HOVERING'), findsOneWidget);
}); });
testWidgets('MouseRegion paints child once and only once when MouseRegion is inactive', (WidgetTester tester) async { testWidgetsWithLeakTracking('MouseRegion paints child once and only once when MouseRegion is inactive', (WidgetTester tester) async {
int paintCount = 0; int paintCount = 0;
await tester.pumpWidget( await tester.pumpWidget(
Directionality( Directionality(
...@@ -1066,7 +1067,7 @@ void main() { ...@@ -1066,7 +1067,7 @@ void main() {
expect(paintCount, 1); expect(paintCount, 1);
}); });
testWidgets('MouseRegion paints child once and only once when MouseRegion is active', (WidgetTester tester) async { testWidgetsWithLeakTracking('MouseRegion paints child once and only once when MouseRegion is active', (WidgetTester tester) async {
int paintCount = 0; int paintCount = 0;
final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse);
...@@ -1088,7 +1089,7 @@ void main() { ...@@ -1088,7 +1089,7 @@ void main() {
expect(paintCount, 1); expect(paintCount, 1);
}); });
testWidgets('A MouseRegion mounted under the pointer should take effect in the next postframe', (WidgetTester tester) async { testWidgetsWithLeakTracking('A MouseRegion mounted under the pointer should take effect in the next postframe', (WidgetTester tester) async {
bool hovered = false; bool hovered = false;
final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse);
...@@ -1130,7 +1131,7 @@ void main() { ...@@ -1130,7 +1131,7 @@ void main() {
expect(tester.binding.hasScheduledFrame, isFalse); expect(tester.binding.hasScheduledFrame, isFalse);
}); });
testWidgets('A MouseRegion unmounted under the pointer should not trigger state change', (WidgetTester tester) async { testWidgetsWithLeakTracking('A MouseRegion unmounted under the pointer should not trigger state change', (WidgetTester tester) async {
bool hovered = true; bool hovered = true;
final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse);
...@@ -1173,7 +1174,7 @@ void main() { ...@@ -1173,7 +1174,7 @@ void main() {
expect(tester.binding.hasScheduledFrame, isFalse); expect(tester.binding.hasScheduledFrame, isFalse);
}); });
testWidgets('A MouseRegion moved into the mouse should take effect in the next postframe', (WidgetTester tester) async { testWidgetsWithLeakTracking('A MouseRegion moved into the mouse should take effect in the next postframe', (WidgetTester tester) async {
bool hovered = false; bool hovered = false;
final List<bool> logHovered = <bool>[]; final List<bool> logHovered = <bool>[];
bool moved = false; bool moved = false;
...@@ -1303,7 +1304,7 @@ void main() { ...@@ -1303,7 +1304,7 @@ void main() {
); );
} }
testWidgets('a transparent one should allow MouseRegions behind it to receive pointers', (WidgetTester tester) async { testWidgetsWithLeakTracking('a transparent one should allow MouseRegions behind it to receive pointers', (WidgetTester tester) async {
final List<String> logs = <String>[]; final List<String> logs = <String>[];
await tester.pumpWidget(tripleRegions( await tester.pumpWidget(tripleRegions(
opaqueC: false, opaqueC: false,
...@@ -1350,7 +1351,7 @@ void main() { ...@@ -1350,7 +1351,7 @@ void main() {
expect(logs, <String>['exitC', 'exitB', 'exitA']); expect(logs, <String>['exitC', 'exitB', 'exitA']);
}); });
testWidgets('an opaque one should prevent MouseRegions behind it receiving pointers', (WidgetTester tester) async { testWidgetsWithLeakTracking('an opaque one should prevent MouseRegions behind it receiving pointers', (WidgetTester tester) async {
final List<String> logs = <String>[]; final List<String> logs = <String>[];
await tester.pumpWidget(tripleRegions( await tester.pumpWidget(tripleRegions(
opaqueC: true, opaqueC: true,
...@@ -1397,7 +1398,7 @@ void main() { ...@@ -1397,7 +1398,7 @@ void main() {
expect(logs, <String>['exitC', 'exitA']); expect(logs, <String>['exitC', 'exitA']);
}); });
testWidgets('opaque should default to true', (WidgetTester tester) async { testWidgetsWithLeakTracking('opaque should default to true', (WidgetTester tester) async {
final List<String> logs = <String>[]; final List<String> logs = <String>[];
await tester.pumpWidget(tripleRegions( await tester.pumpWidget(tripleRegions(
addLog: (String log) => logs.add(log), addLog: (String log) => logs.add(log),
...@@ -1420,7 +1421,7 @@ void main() { ...@@ -1420,7 +1421,7 @@ void main() {
}); });
}); });
testWidgets('an empty opaque MouseRegion is effective', (WidgetTester tester) async { testWidgetsWithLeakTracking('an empty opaque MouseRegion is effective', (WidgetTester tester) async {
bool bottomRegionIsHovered = false; bool bottomRegionIsHovered = false;
await tester.pumpWidget( await tester.pumpWidget(
Directionality( Directionality(
...@@ -1455,7 +1456,7 @@ void main() { ...@@ -1455,7 +1456,7 @@ void main() {
expect(bottomRegionIsHovered, isFalse); expect(bottomRegionIsHovered, isFalse);
}); });
testWidgets("Changing MouseRegion's callbacks is effective and doesn't repaint", (WidgetTester tester) async { testWidgetsWithLeakTracking("Changing MouseRegion's callbacks is effective and doesn't repaint", (WidgetTester tester) async {
final List<String> logs = <String>[]; final List<String> logs = <String>[];
const Key key = ValueKey<int>(1); const Key key = ValueKey<int>(1);
...@@ -1519,7 +1520,7 @@ void main() { ...@@ -1519,7 +1520,7 @@ void main() {
expect(logs, <String>['paint']); expect(logs, <String>['paint']);
}); });
testWidgets('Changing MouseRegion.opaque is effective and repaints', (WidgetTester tester) async { testWidgetsWithLeakTracking('Changing MouseRegion.opaque is effective and repaints', (WidgetTester tester) async {
final List<String> logs = <String>[]; final List<String> logs = <String>[];
final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse);
...@@ -1563,7 +1564,7 @@ void main() { ...@@ -1563,7 +1564,7 @@ void main() {
expect(logs, <String>['paint', 'hover-enter']); expect(logs, <String>['paint', 'hover-enter']);
}); });
testWidgets('Changing MouseRegion.cursor is effective and repaints', (WidgetTester tester) async { testWidgetsWithLeakTracking('Changing MouseRegion.cursor is effective and repaints', (WidgetTester tester) async {
final List<String> logPaints = <String>[]; final List<String> logPaints = <String>[];
final List<String> logEnters = <String>[]; final List<String> logEnters = <String>[];
...@@ -1610,7 +1611,7 @@ void main() { ...@@ -1610,7 +1611,7 @@ void main() {
logEnters.clear(); logEnters.clear();
}); });
testWidgets('Changing whether MouseRegion.cursor is null is effective and repaints', (WidgetTester tester) async { testWidgetsWithLeakTracking('Changing whether MouseRegion.cursor is null is effective and repaints', (WidgetTester tester) async {
final List<String> logEnters = <String>[]; final List<String> logEnters = <String>[];
final List<String> logPaints = <String>[]; final List<String> logPaints = <String>[];
...@@ -1682,7 +1683,7 @@ void main() { ...@@ -1682,7 +1683,7 @@ void main() {
logEnters.clear(); logEnters.clear();
}); });
testWidgets('Does not trigger side effects during a reparent', (WidgetTester tester) async { testWidgetsWithLeakTracking('Does not trigger side effects during a reparent', (WidgetTester tester) async {
final List<String> logEnters = <String>[]; final List<String> logEnters = <String>[];
final List<String> logExits = <String>[]; final List<String> logExits = <String>[];
final List<String> logCursors = <String>[]; final List<String> logCursors = <String>[];
...@@ -1766,9 +1767,13 @@ void main() { ...@@ -1766,9 +1767,13 @@ void main() {
expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.click); expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.click);
}); });
testWidgets("RenderMouseRegion's debugFillProperties when default", (WidgetTester tester) async { testWidgetsWithLeakTracking("RenderMouseRegion's debugFillProperties when default", (WidgetTester tester) async {
final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder(); final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder();
RenderMouseRegion().debugFillProperties(builder);
final RenderMouseRegion renderMouseRegion = RenderMouseRegion();
addTearDown(renderMouseRegion.dispose);
renderMouseRegion.debugFillProperties(builder);
final List<String> description = builder.properties.where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info)).map((DiagnosticsNode node) => node.toString()).toList(); final List<String> description = builder.properties.where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info)).map((DiagnosticsNode node) => node.toString()).toList();
...@@ -1781,16 +1786,23 @@ void main() { ...@@ -1781,16 +1786,23 @@ void main() {
]); ]);
}); });
testWidgets("RenderMouseRegion's debugFillProperties when full", (WidgetTester tester) async { testWidgetsWithLeakTracking("RenderMouseRegion's debugFillProperties when full", (WidgetTester tester) async {
final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder(); final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder();
RenderMouseRegion(
final RenderErrorBox renderErrorBox = RenderErrorBox();
addTearDown(renderErrorBox.dispose);
final RenderMouseRegion renderMouseRegion = RenderMouseRegion(
onEnter: (PointerEnterEvent event) {}, onEnter: (PointerEnterEvent event) {},
onExit: (PointerExitEvent event) {}, onExit: (PointerExitEvent event) {},
onHover: (PointerHoverEvent event) {}, onHover: (PointerHoverEvent event) {},
cursor: SystemMouseCursors.click, cursor: SystemMouseCursors.click,
validForMouseTracker: false, validForMouseTracker: false,
child: RenderErrorBox(), child: renderErrorBox,
).debugFillProperties(builder); );
addTearDown(renderMouseRegion.dispose);
renderMouseRegion.debugFillProperties(builder);
final List<String> description = builder.properties.where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info)).map((DiagnosticsNode node) => node.toString()).toList(); final List<String> description = builder.properties.where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info)).map((DiagnosticsNode node) => node.toString()).toList();
...@@ -1805,7 +1817,7 @@ void main() { ...@@ -1805,7 +1817,7 @@ void main() {
]); ]);
}); });
testWidgets('No new frames are scheduled when mouse moves without triggering callbacks', (WidgetTester tester) async { testWidgetsWithLeakTracking('No new frames are scheduled when mouse moves without triggering callbacks', (WidgetTester tester) async {
await tester.pumpWidget(Center( await tester.pumpWidget(Center(
child: MouseRegion( child: MouseRegion(
child: const SizedBox( child: const SizedBox(
...@@ -1825,7 +1837,7 @@ void main() { ...@@ -1825,7 +1837,7 @@ void main() {
}); });
// Regression test for https://github.com/flutter/flutter/issues/67044 // Regression test for https://github.com/flutter/flutter/issues/67044
testWidgets('Handle mouse events should ignore the detached MouseTrackerAnnotation', (WidgetTester tester) async { testWidgetsWithLeakTracking('Handle mouse events should ignore the detached MouseTrackerAnnotation', (WidgetTester tester) async {
await tester.pumpWidget(MaterialApp( await tester.pumpWidget(MaterialApp(
home: Center( home: Center(
child: Draggable<int>( child: Draggable<int>(
......
...@@ -5,9 +5,10 @@ ...@@ -5,9 +5,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
void main() { void main() {
testWidgets('runApp uses deprecated pipelineOwner and renderView', (WidgetTester tester) async { testWidgetsWithLeakTracking('runApp uses deprecated pipelineOwner and renderView', (WidgetTester tester) async {
runApp(const SizedBox()); runApp(const SizedBox());
final RenderObject renderObject = tester.renderObject(find.byType(SizedBox)); final RenderObject renderObject = tester.renderObject(find.byType(SizedBox));
...@@ -21,7 +22,7 @@ void main() { ...@@ -21,7 +22,7 @@ void main() {
expect(renderObject.owner, equals(tester.binding.pipelineOwner)); expect(renderObject.owner, equals(tester.binding.pipelineOwner));
}); });
testWidgets('can manually attach RootWidget to build owner', (WidgetTester tester) async { testWidgetsWithLeakTracking('can manually attach RootWidget to build owner', (WidgetTester tester) async {
expect(find.byType(ColoredBox), findsNothing); expect(find.byType(ColoredBox), findsNothing);
final RootWidget rootWidget = RootWidget( final RootWidget rootWidget = RootWidget(
......
...@@ -7,9 +7,10 @@ import 'dart:ui'; ...@@ -7,9 +7,10 @@ import 'dart:ui';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
void main() { void main() {
testWidgets('Widgets in view update as expected', (WidgetTester tester) async { testWidgetsWithLeakTracking('Widgets in view update as expected', (WidgetTester tester) async {
final Widget widget = View( final Widget widget = View(
view: tester.view, view: tester.view,
child: const TestWidget(), child: const TestWidget(),
...@@ -49,7 +50,7 @@ void main() { ...@@ -49,7 +50,7 @@ void main() {
expect(tester.renderObject<RenderParagraph>(find.byType(Text)).text.toPlainText(), 'FooBar'); expect(tester.renderObject<RenderParagraph>(find.byType(Text)).text.toPlainText(), 'FooBar');
}); });
testWidgets('Views in ViewCollection update as expected', (WidgetTester tester) async { testWidgetsWithLeakTracking('Views in ViewCollection update as expected', (WidgetTester tester) async {
Iterable<String> renderParagraphTexts() { Iterable<String> renderParagraphTexts() {
return tester.renderObjectList<RenderParagraph>(find.byType(Text)).map((RenderParagraph r) => r.text.toPlainText()); return tester.renderObjectList<RenderParagraph>(find.byType(Text)).map((RenderParagraph r) => r.text.toPlainText());
} }
...@@ -103,7 +104,7 @@ void main() { ...@@ -103,7 +104,7 @@ void main() {
expect(renderParagraphTexts(), <String>['Guten', 'Morgen']); expect(renderParagraphTexts(), <String>['Guten', 'Morgen']);
}); });
testWidgets('Views in ViewAnchor update as expected', (WidgetTester tester) async { testWidgetsWithLeakTracking('Views in ViewAnchor update as expected', (WidgetTester tester) async {
Iterable<String> renderParagraphTexts() { Iterable<String> renderParagraphTexts() {
return tester.renderObjectList<RenderParagraph>(find.byType(Text)).map((RenderParagraph r) => r.text.toPlainText()); return tester.renderObjectList<RenderParagraph>(find.byType(Text)).map((RenderParagraph r) => r.text.toPlainText());
} }
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'test_widgets.dart'; import 'test_widgets.dart';
...@@ -32,7 +33,7 @@ void checkTree(WidgetTester tester, List<BoxDecoration> expectedDecorations) { ...@@ -32,7 +33,7 @@ void checkTree(WidgetTester tester, List<BoxDecoration> expectedDecorations) {
} }
void main() { void main() {
testWidgets('MultiChildRenderObjectElement control test', (WidgetTester tester) async { testWidgetsWithLeakTracking('MultiChildRenderObjectElement control test', (WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
const Stack( const Stack(
...@@ -117,7 +118,7 @@ void main() { ...@@ -117,7 +118,7 @@ void main() {
}); });
testWidgets('MultiChildRenderObjectElement with stateless widgets', (WidgetTester tester) async { testWidgetsWithLeakTracking('MultiChildRenderObjectElement with stateless widgets', (WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
const Stack( const Stack(
...@@ -243,7 +244,7 @@ void main() { ...@@ -243,7 +244,7 @@ void main() {
checkTree(tester, <BoxDecoration>[]); checkTree(tester, <BoxDecoration>[]);
}); });
testWidgets('MultiChildRenderObjectElement with stateful widgets', (WidgetTester tester) async { testWidgetsWithLeakTracking('MultiChildRenderObjectElement with stateful widgets', (WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
const Stack( const Stack(
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
......
...@@ -5,9 +5,10 @@ ...@@ -5,9 +5,10 @@
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
void main() { void main() {
testWidgets('Render and element tree stay in sync when keyed children move around', (WidgetTester tester) async { testWidgetsWithLeakTracking('Render and element tree stay in sync when keyed children move around', (WidgetTester tester) async {
// Regression test for https://github.com/flutter/flutter/issues/48855. // Regression test for https://github.com/flutter/flutter/issues/48855.
await tester.pumpWidget( await tester.pumpWidget(
...@@ -59,7 +60,7 @@ void main() { ...@@ -59,7 +60,7 @@ void main() {
); );
}); });
testWidgets('Building a new MultiChildRenderObjectElement with children having duplicated keys throws', (WidgetTester tester) async { testWidgetsWithLeakTracking('Building a new MultiChildRenderObjectElement with children having duplicated keys throws', (WidgetTester tester) async {
const ValueKey<int> duplicatedKey = ValueKey<int>(1); const ValueKey<int> duplicatedKey = ValueKey<int>(1);
await tester.pumpWidget(const Column( await tester.pumpWidget(const Column(
...@@ -79,7 +80,7 @@ void main() { ...@@ -79,7 +80,7 @@ void main() {
); );
}); });
testWidgets('Updating a MultiChildRenderObjectElement to have children with duplicated keys throws', (WidgetTester tester) async { testWidgetsWithLeakTracking('Updating a MultiChildRenderObjectElement to have children with duplicated keys throws', (WidgetTester tester) async {
// Regression test for https://github.com/flutter/flutter/issues/81541 // Regression test for https://github.com/flutter/flutter/issues/81541
const ValueKey<int> key1 = ValueKey<int>(1); const ValueKey<int> key1 = ValueKey<int>(1);
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'test_widgets.dart'; import 'test_widgets.dart';
...@@ -26,7 +27,7 @@ class TestCustomPainter extends CustomPainter { ...@@ -26,7 +27,7 @@ class TestCustomPainter extends CustomPainter {
} }
void main() { void main() {
testWidgets('Do we paint when coming back from a navigation', (WidgetTester tester) async { testWidgetsWithLeakTracking('Do we paint when coming back from a navigation', (WidgetTester tester) async {
final List<String> log = <String>[]; final List<String> log = <String>[];
log.add('0'); log.add('0');
await tester.pumpWidget( await tester.pumpWidget(
......
...@@ -4,11 +4,12 @@ ...@@ -4,11 +4,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
import 'observer_tester.dart'; import 'observer_tester.dart';
void main() { void main() {
testWidgets('Back during pushReplacement', (WidgetTester tester) async { testWidgetsWithLeakTracking('Back during pushReplacement', (WidgetTester tester) async {
await tester.pumpWidget(MaterialApp( await tester.pumpWidget(MaterialApp(
home: const Material(child: Text('home')), home: const Material(child: Text('home')),
routes: <String, WidgetBuilder>{ routes: <String, WidgetBuilder>{
...@@ -42,7 +43,7 @@ void main() { ...@@ -42,7 +43,7 @@ void main() {
}); });
group('pushAndRemoveUntil', () { group('pushAndRemoveUntil', () {
testWidgets('notifies appropriately', (WidgetTester tester) async { testWidgetsWithLeakTracking('notifies appropriately', (WidgetTester tester) async {
final TestObserver observer = TestObserver(); final TestObserver observer = TestObserver();
final Widget myApp = MaterialApp( final Widget myApp = MaterialApp(
home: const Material(child: Text('home')), home: const Material(child: Text('home')),
...@@ -110,7 +111,7 @@ void main() { ...@@ -110,7 +111,7 @@ void main() {
])); ]));
}); });
testWidgets('triggers page transition animation for pushed route', (WidgetTester tester) async { testWidgetsWithLeakTracking('triggers page transition animation for pushed route', (WidgetTester tester) async {
final Widget myApp = MaterialApp( final Widget myApp = MaterialApp(
home: const Material(child: Text('home')), home: const Material(child: Text('home')),
routes: <String, WidgetBuilder>{ routes: <String, WidgetBuilder>{
...@@ -139,7 +140,7 @@ void main() { ...@@ -139,7 +140,7 @@ void main() {
expect(find.text('b'), findsOneWidget); expect(find.text('b'), findsOneWidget);
}); });
testWidgets('Hero transition triggers when preceding route contains hero, and predicate route does not', (WidgetTester tester) async { testWidgetsWithLeakTracking('Hero transition triggers when preceding route contains hero, and predicate route does not', (WidgetTester tester) async {
const String kHeroTag = 'hero'; const String kHeroTag = 'hero';
final Widget myApp = MaterialApp( final Widget myApp = MaterialApp(
initialRoute: '/', initialRoute: '/',
...@@ -184,7 +185,7 @@ void main() { ...@@ -184,7 +185,7 @@ void main() {
expect(find.text('b'), isOnstage); expect(find.text('b'), isOnstage);
}); });
testWidgets('Hero transition does not trigger when preceding route does not contain hero, but predicate route does', (WidgetTester tester) async { testWidgetsWithLeakTracking('Hero transition does not trigger when preceding route does not contain hero, but predicate route does', (WidgetTester tester) async {
const String kHeroTag = 'hero'; const String kHeroTag = 'hero';
final Widget myApp = MaterialApp( final Widget myApp = MaterialApp(
theme: ThemeData( theme: ThemeData(
......
...@@ -5,9 +5,10 @@ ...@@ -5,9 +5,10 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
void main() { void main() {
testWidgets('Restoration Smoke Test', (WidgetTester tester) async { testWidgetsWithLeakTracking('Restoration Smoke Test', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
expect(findRoute('home', count: 0), findsOneWidget); expect(findRoute('home', count: 0), findsOneWidget);
...@@ -29,7 +30,7 @@ void main() { ...@@ -29,7 +30,7 @@ void main() {
expect(findRoute('home', count: 2), findsOneWidget); expect(findRoute('home', count: 2), findsOneWidget);
}); });
testWidgets('restorablePushNamed', (WidgetTester tester) async { testWidgetsWithLeakTracking('restorablePushNamed', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
await tapRouteCounter('home', tester); await tapRouteCounter('home', tester);
expect(findRoute('home', count: 1), findsOneWidget); expect(findRoute('home', count: 1), findsOneWidget);
...@@ -66,7 +67,7 @@ void main() { ...@@ -66,7 +67,7 @@ void main() {
expect(findRoute('Bar'), findsNothing); expect(findRoute('Bar'), findsNothing);
}); });
testWidgets('restorablePushReplacementNamed', (WidgetTester tester) async { testWidgetsWithLeakTracking('restorablePushReplacementNamed', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
expect(findRoute('home'), findsOneWidget); expect(findRoute('home'), findsOneWidget);
...@@ -99,7 +100,7 @@ void main() { ...@@ -99,7 +100,7 @@ void main() {
expect(findRoute('Bar'), findsNothing); expect(findRoute('Bar'), findsNothing);
}); });
testWidgets('restorablePopAndPushNamed', (WidgetTester tester) async { testWidgetsWithLeakTracking('restorablePopAndPushNamed', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
expect(findRoute('home'), findsOneWidget); expect(findRoute('home'), findsOneWidget);
...@@ -132,7 +133,7 @@ void main() { ...@@ -132,7 +133,7 @@ void main() {
expect(findRoute('Bar'), findsNothing); expect(findRoute('Bar'), findsNothing);
}); });
testWidgets('restorablePushNamedAndRemoveUntil', (WidgetTester tester) async { testWidgetsWithLeakTracking('restorablePushNamedAndRemoveUntil', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
expect(findRoute('home'), findsOneWidget); expect(findRoute('home'), findsOneWidget);
...@@ -165,7 +166,7 @@ void main() { ...@@ -165,7 +166,7 @@ void main() {
expect(findRoute('Bar'), findsNothing); expect(findRoute('Bar'), findsNothing);
}); });
testWidgets('restorablePush', (WidgetTester tester) async { testWidgetsWithLeakTracking('restorablePush', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
await tapRouteCounter('home', tester); await tapRouteCounter('home', tester);
expect(findRoute('home', count: 1), findsOneWidget); expect(findRoute('home', count: 1), findsOneWidget);
...@@ -202,7 +203,7 @@ void main() { ...@@ -202,7 +203,7 @@ void main() {
expect(findRoute('Bar'), findsNothing); expect(findRoute('Bar'), findsNothing);
}, skip: isBrowser); // https://github.com/flutter/flutter/issues/33615 }, skip: isBrowser); // https://github.com/flutter/flutter/issues/33615
testWidgets('restorablePush adds route on all platforms', (WidgetTester tester) async { testWidgetsWithLeakTracking('restorablePush adds route on all platforms', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
await tapRouteCounter('home', tester); await tapRouteCounter('home', tester);
expect(findRoute('home', count: 1), findsOneWidget); expect(findRoute('home', count: 1), findsOneWidget);
...@@ -212,7 +213,7 @@ void main() { ...@@ -212,7 +213,7 @@ void main() {
expect(findRoute('Foo'), findsOneWidget); expect(findRoute('Foo'), findsOneWidget);
}); });
testWidgets('restorablePushReplacement', (WidgetTester tester) async { testWidgetsWithLeakTracking('restorablePushReplacement', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
expect(findRoute('home', count: 0), findsOneWidget); expect(findRoute('home', count: 0), findsOneWidget);
...@@ -245,7 +246,7 @@ void main() { ...@@ -245,7 +246,7 @@ void main() {
expect(findRoute('Bar'), findsNothing); expect(findRoute('Bar'), findsNothing);
}, skip: isBrowser); // https://github.com/flutter/flutter/issues/33615 }, skip: isBrowser); // https://github.com/flutter/flutter/issues/33615
testWidgets('restorablePushReplacement adds route on all platforms', (WidgetTester tester) async { testWidgetsWithLeakTracking('restorablePushReplacement adds route on all platforms', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
await tapRouteCounter('home', tester); await tapRouteCounter('home', tester);
expect(findRoute('home', count: 1), findsOneWidget); expect(findRoute('home', count: 1), findsOneWidget);
...@@ -255,7 +256,7 @@ void main() { ...@@ -255,7 +256,7 @@ void main() {
expect(findRoute('Foo'), findsOneWidget); expect(findRoute('Foo'), findsOneWidget);
}); });
testWidgets('restorablePushAndRemoveUntil', (WidgetTester tester) async { testWidgetsWithLeakTracking('restorablePushAndRemoveUntil', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
expect(findRoute('home', count: 0), findsOneWidget); expect(findRoute('home', count: 0), findsOneWidget);
...@@ -288,7 +289,7 @@ void main() { ...@@ -288,7 +289,7 @@ void main() {
expect(findRoute('Bar'), findsNothing); expect(findRoute('Bar'), findsNothing);
}, skip: isBrowser); // https://github.com/flutter/flutter/issues/33615 }, skip: isBrowser); // https://github.com/flutter/flutter/issues/33615
testWidgets('restorablePushAndRemoveUntil adds route on all platforms', (WidgetTester tester) async { testWidgetsWithLeakTracking('restorablePushAndRemoveUntil adds route on all platforms', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
await tapRouteCounter('home', tester); await tapRouteCounter('home', tester);
expect(findRoute('home', count: 1), findsOneWidget); expect(findRoute('home', count: 1), findsOneWidget);
...@@ -298,7 +299,7 @@ void main() { ...@@ -298,7 +299,7 @@ void main() {
expect(findRoute('Foo'), findsOneWidget); expect(findRoute('Foo'), findsOneWidget);
}); });
testWidgets('restorableReplace', (WidgetTester tester) async { testWidgetsWithLeakTracking('restorableReplace', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
expect(findRoute('home', count: 0), findsOneWidget); expect(findRoute('home', count: 0), findsOneWidget);
...@@ -334,7 +335,7 @@ void main() { ...@@ -334,7 +335,7 @@ void main() {
expect(findRoute('Bar'), findsNothing); expect(findRoute('Bar'), findsNothing);
}, skip: isBrowser); // https://github.com/flutter/flutter/issues/33615 }, skip: isBrowser); // https://github.com/flutter/flutter/issues/33615
testWidgets('restorableReplace adds route on all platforms', (WidgetTester tester) async { testWidgetsWithLeakTracking('restorableReplace adds route on all platforms', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
expect(findRoute('home', count: 0), findsOneWidget); expect(findRoute('home', count: 0), findsOneWidget);
...@@ -346,7 +347,7 @@ void main() { ...@@ -346,7 +347,7 @@ void main() {
expect(findRoute('Foo'), findsOneWidget); expect(findRoute('Foo'), findsOneWidget);
}); });
testWidgets('restorableReplaceRouteBelow', (WidgetTester tester) async { testWidgetsWithLeakTracking('restorableReplaceRouteBelow', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
expect(findRoute('home', count: 0), findsOneWidget); expect(findRoute('home', count: 0), findsOneWidget);
...@@ -392,7 +393,7 @@ void main() { ...@@ -392,7 +393,7 @@ void main() {
expect(findRoute('Anchor', count: 2), findsOneWidget); expect(findRoute('Anchor', count: 2), findsOneWidget);
}, skip: isBrowser); // https://github.com/flutter/flutter/issues/33615 }, skip: isBrowser); // https://github.com/flutter/flutter/issues/33615
testWidgets('restorableReplaceRouteBelow adds route on all platforms', (WidgetTester tester) async { testWidgetsWithLeakTracking('restorableReplaceRouteBelow adds route on all platforms', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
expect(findRoute('home', count: 0), findsOneWidget); expect(findRoute('home', count: 0), findsOneWidget);
...@@ -412,7 +413,7 @@ void main() { ...@@ -412,7 +413,7 @@ void main() {
expect(findRoute('Foo', skipOffstage: false), findsOneWidget); expect(findRoute('Foo', skipOffstage: false), findsOneWidget);
}); });
testWidgets('restoring a popped route', (WidgetTester tester) async { testWidgetsWithLeakTracking('restoring a popped route', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
await tapRouteCounter('home', tester); await tapRouteCounter('home', tester);
expect(findRoute('home', count: 1), findsOneWidget); expect(findRoute('home', count: 1), findsOneWidget);
...@@ -440,7 +441,7 @@ void main() { ...@@ -440,7 +441,7 @@ void main() {
expect(findRoute('Foo', count: 2), findsOneWidget); expect(findRoute('Foo', count: 2), findsOneWidget);
}); });
testWidgets('popped routes are not restored', (WidgetTester tester) async { testWidgetsWithLeakTracking('popped routes are not restored', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
expect(findRoute('home'), findsOneWidget); expect(findRoute('home'), findsOneWidget);
...@@ -465,7 +466,7 @@ void main() { ...@@ -465,7 +466,7 @@ void main() {
expect(findRoute('home', skipOffstage: false), findsOneWidget); expect(findRoute('home', skipOffstage: false), findsOneWidget);
}); });
testWidgets('routes that are in the process of push are restored', (WidgetTester tester) async { testWidgetsWithLeakTracking('routes that are in the process of push are restored', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
expect(findRoute('home'), findsOneWidget); expect(findRoute('home'), findsOneWidget);
...@@ -494,7 +495,7 @@ void main() { ...@@ -494,7 +495,7 @@ void main() {
expect(route2.isActive, isTrue); expect(route2.isActive, isTrue);
}); });
testWidgets('routes that are in the process of pop are not restored', (WidgetTester tester) async { testWidgetsWithLeakTracking('routes that are in the process of pop are not restored', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
await tapRouteCounter('home', tester); await tapRouteCounter('home', tester);
expect(findRoute('home', count: 1), findsOneWidget); expect(findRoute('home', count: 1), findsOneWidget);
...@@ -531,7 +532,7 @@ void main() { ...@@ -531,7 +532,7 @@ void main() {
expect(notifyCount, 1); expect(notifyCount, 1);
}); });
testWidgets('routes are restored in the right order', (WidgetTester tester) async { testWidgetsWithLeakTracking('routes are restored in the right order', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
expect(findRoute('home'), findsOneWidget); expect(findRoute('home'), findsOneWidget);
tester.state<NavigatorState>(find.byType(Navigator)).restorablePushNamed('route1'); tester.state<NavigatorState>(find.byType(Navigator)).restorablePushNamed('route1');
...@@ -569,7 +570,7 @@ void main() { ...@@ -569,7 +570,7 @@ void main() {
expect(findRoute('home'), findsOneWidget); expect(findRoute('home'), findsOneWidget);
}); });
testWidgets('all routes up to first unrestorable are restored', (WidgetTester tester) async { testWidgetsWithLeakTracking('all routes up to first unrestorable are restored', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
expect(findRoute('home'), findsOneWidget); expect(findRoute('home'), findsOneWidget);
tester.state<NavigatorState>(find.byType(Navigator)).restorablePushNamed('route1'); tester.state<NavigatorState>(find.byType(Navigator)).restorablePushNamed('route1');
...@@ -599,7 +600,7 @@ void main() { ...@@ -599,7 +600,7 @@ void main() {
expect(findRoute('home', skipOffstage: false), findsOneWidget); expect(findRoute('home', skipOffstage: false), findsOneWidget);
}); });
testWidgets('removing unrestorable routes restores all of them', (WidgetTester tester) async { testWidgetsWithLeakTracking('removing unrestorable routes restores all of them', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
expect(findRoute('home'), findsOneWidget); expect(findRoute('home'), findsOneWidget);
tester.state<NavigatorState>(find.byType(Navigator)).restorablePushNamed('route1'); tester.state<NavigatorState>(find.byType(Navigator)).restorablePushNamed('route1');
...@@ -633,7 +634,7 @@ void main() { ...@@ -633,7 +634,7 @@ void main() {
expect(findRoute('home', skipOffstage: false), findsOneWidget); expect(findRoute('home', skipOffstage: false), findsOneWidget);
}); });
testWidgets('RestorableRouteFuture', (WidgetTester tester) async { testWidgetsWithLeakTracking('RestorableRouteFuture', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
expect(findRoute('home'), findsOneWidget); expect(findRoute('home'), findsOneWidget);
...@@ -673,7 +674,7 @@ void main() { ...@@ -673,7 +674,7 @@ void main() {
expect(restoredRouteFuture.enabled, isFalse); expect(restoredRouteFuture.enabled, isFalse);
}, skip: isBrowser); // https://github.com/flutter/flutter/issues/33615 }, skip: isBrowser); // https://github.com/flutter/flutter/issues/33615
testWidgets('RestorableRouteFuture in unrestorable context', (WidgetTester tester) async { testWidgetsWithLeakTracking('RestorableRouteFuture in unrestorable context', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
expect(findRoute('home'), findsOneWidget); expect(findRoute('home'), findsOneWidget);
...@@ -704,7 +705,7 @@ void main() { ...@@ -704,7 +705,7 @@ void main() {
expect(findRoute('home'), findsOneWidget); expect(findRoute('home'), findsOneWidget);
}); });
testWidgets('Illegal arguments throw', (WidgetTester tester) async { testWidgetsWithLeakTracking('Illegal arguments throw', (WidgetTester tester) async {
await tester.pumpWidget(const TestWidget()); await tester.pumpWidget(const TestWidget());
tester.state<NavigatorState>(find.byType(Navigator)).restorablePushNamed('Bar'); tester.state<NavigatorState>(find.byType(Navigator)).restorablePushNamed('Bar');
await tester.pumpAndSettle(); await tester.pumpAndSettle();
...@@ -787,7 +788,7 @@ void main() { ...@@ -787,7 +788,7 @@ void main() {
); );
}); });
testWidgets('Moving scopes', (WidgetTester tester) async { testWidgetsWithLeakTracking('Moving scopes', (WidgetTester tester) async {
await tester.pumpWidget(const RootRestorationScope( await tester.pumpWidget(const RootRestorationScope(
restorationId: 'root', restorationId: 'root',
child: TestWidget( child: TestWidget(
...@@ -840,7 +841,7 @@ void main() { ...@@ -840,7 +841,7 @@ void main() {
expect(findRoute('home', count: 0), findsOneWidget); expect(findRoute('home', count: 0), findsOneWidget);
}); });
testWidgets('Restoring pages', (WidgetTester tester) async { testWidgetsWithLeakTracking('Restoring pages', (WidgetTester tester) async {
await tester.pumpWidget(const PagedTestWidget()); await tester.pumpWidget(const PagedTestWidget());
expect(findRoute('home', count: 0), findsOneWidget); expect(findRoute('home', count: 0), findsOneWidget);
await tapRouteCounter('home', tester); await tapRouteCounter('home', tester);
...@@ -882,7 +883,7 @@ void main() { ...@@ -882,7 +883,7 @@ void main() {
expect(findRoute('bar', count: 0), findsOneWidget); expect(findRoute('bar', count: 0), findsOneWidget);
}); });
testWidgets('Unrestorable pages', (WidgetTester tester) async { testWidgetsWithLeakTracking('Unrestorable pages', (WidgetTester tester) async {
await tester.pumpWidget(const PagedTestWidget()); await tester.pumpWidget(const PagedTestWidget());
await tapRouteCounter('home', tester); await tapRouteCounter('home', tester);
expect(findRoute('home', count: 1), findsOneWidget); expect(findRoute('home', count: 1), findsOneWidget);
...@@ -936,7 +937,7 @@ void main() { ...@@ -936,7 +937,7 @@ void main() {
expect(findRoute('home', count: 1), findsOneWidget); expect(findRoute('home', count: 1), findsOneWidget);
}); });
testWidgets('removed page is not restored', (WidgetTester tester) async { testWidgetsWithLeakTracking('removed page is not restored', (WidgetTester tester) async {
await tester.pumpWidget(const PagedTestWidget()); await tester.pumpWidget(const PagedTestWidget());
await tapRouteCounter('home', tester); await tapRouteCounter('home', tester);
expect(findRoute('home', count: 1), findsOneWidget); expect(findRoute('home', count: 1), findsOneWidget);
...@@ -976,7 +977,7 @@ void main() { ...@@ -976,7 +977,7 @@ void main() {
expect(findRoute('p1', count: 0), findsOneWidget); expect(findRoute('p1', count: 0), findsOneWidget);
}); });
testWidgets('Helpful assert thrown all routes in onGenerateInitialRoutes are not restorable', (WidgetTester tester) async { testWidgetsWithLeakTracking('Helpful assert thrown all routes in onGenerateInitialRoutes are not restorable', (WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
MaterialApp( MaterialApp(
restorationScopeId: 'material_app', restorationScopeId: 'material_app',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment