Unverified Commit 38f318b4 authored by Kostia Sokolovskyi's avatar Kostia Sokolovskyi Committed by GitHub

Cover last test/material tests with leak tracking. (#137004)

parent abf20877
...@@ -381,8 +381,9 @@ void main() { ...@@ -381,8 +381,9 @@ void main() {
}); });
}); });
testWidgets('FocusNode can request focus', (WidgetTester tester) async { testWidgetsWithLeakTracking('FocusNode can request focus', (WidgetTester tester) async {
final FocusNode focusNode = FocusNode(); final FocusNode focusNode = FocusNode();
addTearDown(focusNode.dispose);
await tester.pumpWidget(inputDatePickerField( await tester.pumpWidget(inputDatePickerField(
focusNode: focusNode, focusNode: focusNode,
)); ));
......
...@@ -48,8 +48,9 @@ void main() { ...@@ -48,8 +48,9 @@ void main() {
); );
}); });
testWidgets('Can open and close search', (WidgetTester tester) async { testWidgetsWithLeakTracking('Can open and close search', (WidgetTester tester) async {
final _TestSearchDelegate delegate = _TestSearchDelegate(); final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
final List<String> selectedResults = <String>[]; final List<String> selectedResults = <String>[];
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
...@@ -84,10 +85,11 @@ void main() { ...@@ -84,10 +85,11 @@ void main() {
expect(selectedResults, <String>['Result']); expect(selectedResults, <String>['Result']);
}); });
testWidgets('Can close search with system back button to return null', (WidgetTester tester) async { testWidgetsWithLeakTracking('Can close search with system back button to return null', (WidgetTester tester) async {
// regression test for https://github.com/flutter/flutter/issues/18145 // regression test for https://github.com/flutter/flutter/issues/18145
final _TestSearchDelegate delegate = _TestSearchDelegate(); final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
final List<String?> selectedResults = <String?>[]; final List<String?> selectedResults = <String?>[];
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
...@@ -130,9 +132,10 @@ void main() { ...@@ -130,9 +132,10 @@ void main() {
expect(find.text('Suggestions'), findsOneWidget); expect(find.text('Suggestions'), findsOneWidget);
}); });
testWidgets('Hint text color overridden', (WidgetTester tester) async { testWidgetsWithLeakTracking('Hint text color overridden', (WidgetTester tester) async {
const String searchHintText = 'Enter search terms'; const String searchHintText = 'Enter search terms';
final _TestSearchDelegate delegate = _TestSearchDelegate(searchHint: searchHintText); final _TestSearchDelegate delegate = _TestSearchDelegate(searchHint: searchHintText);
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
delegate: delegate, delegate: delegate,
...@@ -144,8 +147,9 @@ void main() { ...@@ -144,8 +147,9 @@ void main() {
expect(hintText.style!.color, _TestSearchDelegate.hintTextColor); expect(hintText.style!.color, _TestSearchDelegate.hintTextColor);
}); });
testWidgets('Requests suggestions', (WidgetTester tester) async { testWidgetsWithLeakTracking('Requests suggestions', (WidgetTester tester) async {
final _TestSearchDelegate delegate = _TestSearchDelegate(); final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
delegate: delegate, delegate: delegate,
...@@ -173,8 +177,9 @@ void main() { ...@@ -173,8 +177,9 @@ void main() {
expect(delegate.queriesForResults, hasLength(0)); expect(delegate.queriesForResults, hasLength(0));
}); });
testWidgets('Shows Results and closes search', (WidgetTester tester) async { testWidgetsWithLeakTracking('Shows Results and closes search', (WidgetTester tester) async {
final _TestSearchDelegate delegate = _TestSearchDelegate(); final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
final List<String> selectedResults = <String>[]; final List<String> selectedResults = <String>[];
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
...@@ -209,8 +214,9 @@ void main() { ...@@ -209,8 +214,9 @@ void main() {
expect(selectedResults, <String>['Result']); expect(selectedResults, <String>['Result']);
}); });
testWidgets('Can switch between results and suggestions', (WidgetTester tester) async { testWidgetsWithLeakTracking('Can switch between results and suggestions', (WidgetTester tester) async {
final _TestSearchDelegate delegate = _TestSearchDelegate(); final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
delegate: delegate, delegate: delegate,
...@@ -279,8 +285,9 @@ void main() { ...@@ -279,8 +285,9 @@ void main() {
expect(textField.focusNode!.hasFocus, isFalse); expect(textField.focusNode!.hasFocus, isFalse);
}); });
testWidgets('Fresh search always starts with empty query', (WidgetTester tester) async { testWidgetsWithLeakTracking('Fresh search always starts with empty query', (WidgetTester tester) async {
final _TestSearchDelegate delegate = _TestSearchDelegate(); final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
delegate: delegate, delegate: delegate,
...@@ -299,8 +306,9 @@ void main() { ...@@ -299,8 +306,9 @@ void main() {
expect(delegate.query, ''); expect(delegate.query, '');
}); });
testWidgets('Initial queries are honored', (WidgetTester tester) async { testWidgetsWithLeakTracking('Initial queries are honored', (WidgetTester tester) async {
final _TestSearchDelegate delegate = _TestSearchDelegate(); final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
expect(delegate.query, ''); expect(delegate.query, '');
...@@ -315,8 +323,9 @@ void main() { ...@@ -315,8 +323,9 @@ void main() {
expect(delegate.query, 'Foo'); expect(delegate.query, 'Foo');
}); });
testWidgets('Initial query null re-used previous query', (WidgetTester tester) async { testWidgetsWithLeakTracking('Initial query null re-used previous query', (WidgetTester tester) async {
final _TestSearchDelegate delegate = _TestSearchDelegate(); final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
delegate.query = 'Foo'; delegate.query = 'Foo';
...@@ -330,8 +339,9 @@ void main() { ...@@ -330,8 +339,9 @@ void main() {
expect(delegate.query, 'Foo'); expect(delegate.query, 'Foo');
}); });
testWidgets('Changing query shows up in search field', (WidgetTester tester) async { testWidgetsWithLeakTracking('Changing query shows up in search field', (WidgetTester tester) async {
final _TestSearchDelegate delegate = _TestSearchDelegate(); final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
delegate: delegate, delegate: delegate,
...@@ -351,8 +361,9 @@ void main() { ...@@ -351,8 +361,9 @@ void main() {
expect(find.text('Bar'), findsOneWidget); expect(find.text('Bar'), findsOneWidget);
}); });
testWidgets('transitionAnimation runs while search fades in/out', (WidgetTester tester) async { testWidgetsWithLeakTracking('transitionAnimation runs while search fades in/out', (WidgetTester tester) async {
final _TestSearchDelegate delegate = _TestSearchDelegate(); final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
delegate: delegate, delegate: delegate,
...@@ -379,12 +390,13 @@ void main() { ...@@ -379,12 +390,13 @@ void main() {
expect(delegate.transitionAnimation.status, AnimationStatus.dismissed); expect(delegate.transitionAnimation.status, AnimationStatus.dismissed);
}); });
testWidgets('Closing nested search returns to search', (WidgetTester tester) async { testWidgetsWithLeakTracking('Closing nested search returns to search', (WidgetTester tester) async {
final List<String?> nestedSearchResults = <String?>[]; final List<String?> nestedSearchResults = <String?>[];
final _TestSearchDelegate nestedSearchDelegate = _TestSearchDelegate( final _TestSearchDelegate nestedSearchDelegate = _TestSearchDelegate(
suggestions: 'Nested Suggestions', suggestions: 'Nested Suggestions',
result: 'Nested Result', result: 'Nested Result',
); );
addTearDown(nestedSearchDelegate.dispose);
final List<String> selectedResults = <String>[]; final List<String> selectedResults = <String>[];
final _TestSearchDelegate delegate = _TestSearchDelegate( final _TestSearchDelegate delegate = _TestSearchDelegate(
...@@ -406,6 +418,7 @@ void main() { ...@@ -406,6 +418,7 @@ void main() {
), ),
], ],
); );
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
delegate: delegate, delegate: delegate,
...@@ -443,8 +456,9 @@ void main() { ...@@ -443,8 +456,9 @@ void main() {
expect(selectedResults, <String>['Result']); expect(selectedResults, <String>['Result']);
}); });
testWidgets('Closing search with nested search shown goes back to underlying route', (WidgetTester tester) async { testWidgetsWithLeakTracking('Closing search with nested search shown goes back to underlying route', (WidgetTester tester) async {
late _TestSearchDelegate delegate; late _TestSearchDelegate delegate;
addTearDown(() => delegate.dispose());
final List<String?> nestedSearchResults = <String?>[]; final List<String?> nestedSearchResults = <String?>[];
final _TestSearchDelegate nestedSearchDelegate = _TestSearchDelegate( final _TestSearchDelegate nestedSearchDelegate = _TestSearchDelegate(
suggestions: 'Nested Suggestions', suggestions: 'Nested Suggestions',
...@@ -463,6 +477,7 @@ void main() { ...@@ -463,6 +477,7 @@ void main() {
), ),
], ],
); );
addTearDown(nestedSearchDelegate.dispose);
final List<String> selectedResults = <String>[]; final List<String> selectedResults = <String>[];
delegate = _TestSearchDelegate( delegate = _TestSearchDelegate(
...@@ -515,11 +530,12 @@ void main() { ...@@ -515,11 +530,12 @@ void main() {
expect(selectedResults, <String>['Result Foo']); expect(selectedResults, <String>['Result Foo']);
}); });
testWidgets('Custom searchFieldLabel value', (WidgetTester tester) async { testWidgetsWithLeakTracking('Custom searchFieldLabel value', (WidgetTester tester) async {
const String searchHint = 'custom search hint'; const String searchHint = 'custom search hint';
final String defaultSearchHint = const DefaultMaterialLocalizations().searchFieldLabel; final String defaultSearchHint = const DefaultMaterialLocalizations().searchFieldLabel;
final _TestSearchDelegate delegate = _TestSearchDelegate(searchHint: searchHint); final _TestSearchDelegate delegate = _TestSearchDelegate(searchHint: searchHint);
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
delegate: delegate, delegate: delegate,
...@@ -531,10 +547,11 @@ void main() { ...@@ -531,10 +547,11 @@ void main() {
expect(find.text(defaultSearchHint), findsNothing); expect(find.text(defaultSearchHint), findsNothing);
}); });
testWidgets('Default searchFieldLabel is used when it is set to null', (WidgetTester tester) async { testWidgetsWithLeakTracking('Default searchFieldLabel is used when it is set to null', (WidgetTester tester) async {
final String searchHint = const DefaultMaterialLocalizations().searchFieldLabel; final String searchHint = const DefaultMaterialLocalizations().searchFieldLabel;
final _TestSearchDelegate delegate = _TestSearchDelegate(); final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
delegate: delegate, delegate: delegate,
...@@ -545,11 +562,12 @@ void main() { ...@@ -545,11 +562,12 @@ void main() {
expect(find.text(searchHint), findsOneWidget); expect(find.text(searchHint), findsOneWidget);
}); });
testWidgets('Custom searchFieldStyle value', (WidgetTester tester) async { testWidgetsWithLeakTracking('Custom searchFieldStyle value', (WidgetTester tester) async {
const String searchHintText = 'Enter search terms'; const String searchHintText = 'Enter search terms';
const TextStyle searchFieldStyle = TextStyle(color: Colors.red, fontSize: 3); const TextStyle searchFieldStyle = TextStyle(color: Colors.red, fontSize: 3);
final _TestSearchDelegate delegate = _TestSearchDelegate(searchHint: searchHintText, searchFieldStyle: searchFieldStyle); final _TestSearchDelegate delegate = _TestSearchDelegate(searchHint: searchHintText, searchFieldStyle: searchFieldStyle);
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(delegate: delegate)); await tester.pumpWidget(TestHomePage(delegate: delegate));
await tester.tap(find.byTooltip('Search')); await tester.tap(find.byTooltip('Search'));
...@@ -565,8 +583,9 @@ void main() { ...@@ -565,8 +583,9 @@ void main() {
}); });
testWidgets('keyboard show search button by default', (WidgetTester tester) async { testWidgetsWithLeakTracking('keyboard show search button by default', (WidgetTester tester) async {
final _TestSearchDelegate delegate = _TestSearchDelegate(); final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
delegate: delegate, delegate: delegate,
...@@ -579,8 +598,9 @@ void main() { ...@@ -579,8 +598,9 @@ void main() {
expect(tester.testTextInput.setClientArgs!['inputAction'], TextInputAction.search.toString()); expect(tester.testTextInput.setClientArgs!['inputAction'], TextInputAction.search.toString());
}); });
testWidgets('Custom textInputAction results in keyboard with corresponding button', (WidgetTester tester) async { testWidgetsWithLeakTracking('Custom textInputAction results in keyboard with corresponding button', (WidgetTester tester) async {
final _TestSearchDelegate delegate = _TestSearchDelegate(textInputAction: TextInputAction.done); final _TestSearchDelegate delegate = _TestSearchDelegate(textInputAction: TextInputAction.done);
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
delegate: delegate, delegate: delegate,
...@@ -591,9 +611,10 @@ void main() { ...@@ -591,9 +611,10 @@ void main() {
expect(tester.testTextInput.setClientArgs!['inputAction'], TextInputAction.done.toString()); expect(tester.testTextInput.setClientArgs!['inputAction'], TextInputAction.done.toString());
}); });
testWidgets('Custom flexibleSpace value', (WidgetTester tester) async { testWidgetsWithLeakTracking('Custom flexibleSpace value', (WidgetTester tester) async {
const Widget flexibleSpace = Text('custom flexibleSpace'); const Widget flexibleSpace = Text('custom flexibleSpace');
final _TestSearchDelegate delegate = _TestSearchDelegate(flexibleSpace: flexibleSpace); final _TestSearchDelegate delegate = _TestSearchDelegate(flexibleSpace: flexibleSpace);
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(delegate: delegate)); await tester.pumpWidget(TestHomePage(delegate: delegate));
await tester.tap(find.byTooltip('Search')); await tester.tap(find.byTooltip('Search'));
...@@ -710,9 +731,11 @@ void main() { ...@@ -710,9 +731,11 @@ void main() {
); );
} }
testWidgets('includes routeName on Android', (WidgetTester tester) async { testWidgetsWithLeakTracking('includes routeName on Android', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester); final SemanticsTester semantics = SemanticsTester(tester);
final _TestSearchDelegate delegate = _TestSearchDelegate(flexibleSpace: flexibleSpace); final _TestSearchDelegate delegate = _TestSearchDelegate(flexibleSpace: flexibleSpace);
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
delegate: delegate, delegate: delegate,
)); ));
...@@ -730,9 +753,11 @@ void main() { ...@@ -730,9 +753,11 @@ void main() {
semantics.dispose(); semantics.dispose();
}); });
testWidgets('does not include routeName', (WidgetTester tester) async { testWidgetsWithLeakTracking('does not include routeName', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester); final SemanticsTester semantics = SemanticsTester(tester);
final _TestSearchDelegate delegate = _TestSearchDelegate(flexibleSpace: flexibleSpace); final _TestSearchDelegate delegate = _TestSearchDelegate(flexibleSpace: flexibleSpace);
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
delegate: delegate, delegate: delegate,
)); ));
...@@ -842,9 +867,11 @@ void main() { ...@@ -842,9 +867,11 @@ void main() {
); );
} }
testWidgets('includes routeName on Android', (WidgetTester tester) async { testWidgetsWithLeakTracking('includes routeName on Android', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester); final SemanticsTester semantics = SemanticsTester(tester);
final _TestSearchDelegate delegate = _TestSearchDelegate(); final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
delegate: delegate, delegate: delegate,
)); ));
...@@ -862,9 +889,11 @@ void main() { ...@@ -862,9 +889,11 @@ void main() {
semantics.dispose(); semantics.dispose();
}); });
testWidgets('does not include routeName', (WidgetTester tester) async { testWidgetsWithLeakTracking('does not include routeName', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester); final SemanticsTester semantics = SemanticsTester(tester);
final _TestSearchDelegate delegate = _TestSearchDelegate(); final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
delegate: delegate, delegate: delegate,
)); ));
...@@ -883,13 +912,14 @@ void main() { ...@@ -883,13 +912,14 @@ void main() {
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS })); }, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }));
}); });
testWidgets('Custom searchFieldDecorationTheme value', (WidgetTester tester) async { testWidgetsWithLeakTracking('Custom searchFieldDecorationTheme value', (WidgetTester tester) async {
const InputDecorationTheme searchFieldDecorationTheme = InputDecorationTheme( const InputDecorationTheme searchFieldDecorationTheme = InputDecorationTheme(
hintStyle: TextStyle(color: _TestSearchDelegate.hintTextColor), hintStyle: TextStyle(color: _TestSearchDelegate.hintTextColor),
); );
final _TestSearchDelegate delegate = _TestSearchDelegate( final _TestSearchDelegate delegate = _TestSearchDelegate(
searchFieldDecorationTheme: searchFieldDecorationTheme, searchFieldDecorationTheme: searchFieldDecorationTheme,
); );
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(delegate: delegate)); await tester.pumpWidget(TestHomePage(delegate: delegate));
await tester.tap(find.byTooltip('Search')); await tester.tap(find.byTooltip('Search'));
...@@ -900,12 +930,12 @@ void main() { ...@@ -900,12 +930,12 @@ void main() {
}); });
// Regression test for: https://github.com/flutter/flutter/issues/66781 // Regression test for: https://github.com/flutter/flutter/issues/66781
testWidgets('text in search bar contrasts background (light mode)', (WidgetTester tester) async { testWidgetsWithLeakTracking('text in search bar contrasts background (light mode)', (WidgetTester tester) async {
final ThemeData themeData = ThemeData(useMaterial3: false); final ThemeData themeData = ThemeData(useMaterial3: false);
final _TestSearchDelegate delegate = _TestSearchDelegate( final _TestSearchDelegate delegate = _TestSearchDelegate(defaultAppBarTheme: true);
defaultAppBarTheme: true, addTearDown(() => delegate.dispose());
);
const String query = 'search query'; const String query = 'search query';
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
delegate: delegate, delegate: delegate,
passInInitialQuery: true, passInInitialQuery: true,
...@@ -928,12 +958,12 @@ void main() { ...@@ -928,12 +958,12 @@ void main() {
}); });
// Regression test for: https://github.com/flutter/flutter/issues/66781 // Regression test for: https://github.com/flutter/flutter/issues/66781
testWidgets('text in search bar contrasts background (dark mode)', (WidgetTester tester) async { testWidgetsWithLeakTracking('text in search bar contrasts background (dark mode)', (WidgetTester tester) async {
final ThemeData themeData = ThemeData.dark(useMaterial3: false); final ThemeData themeData = ThemeData.dark(useMaterial3: false);
final _TestSearchDelegate delegate = _TestSearchDelegate( final _TestSearchDelegate delegate = _TestSearchDelegate(defaultAppBarTheme: true);
defaultAppBarTheme: true, addTearDown(() => delegate.dispose());
);
const String query = 'search query'; const String query = 'search query';
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
delegate: delegate, delegate: delegate,
passInInitialQuery: true, passInInitialQuery: true,
...@@ -956,10 +986,11 @@ void main() { ...@@ -956,10 +986,11 @@ void main() {
}); });
// Regression test for: https://github.com/flutter/flutter/issues/78144 // Regression test for: https://github.com/flutter/flutter/issues/78144
testWidgets('`Leading`, `Actions` and `FlexibleSpace` nullable test', (WidgetTester tester) async { testWidgetsWithLeakTracking('`Leading`, `Actions` and `FlexibleSpace` nullable test', (WidgetTester tester) async {
// The search delegate page is displayed with no issues // The search delegate page is displayed with no issues
// even with a null return values for [buildLeading], [buildActions] and [flexibleSpace]. // even with a null return values for [buildLeading], [buildActions] and [flexibleSpace].
final _TestEmptySearchDelegate delegate = _TestEmptySearchDelegate(); final _TestEmptySearchDelegate delegate = _TestEmptySearchDelegate();
addTearDown(delegate.dispose);
final List<String> selectedResults = <String>[]; final List<String> selectedResults = <String>[];
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
...@@ -994,11 +1025,12 @@ void main() { ...@@ -994,11 +1025,12 @@ void main() {
expect(selectedResults, <String>['Result']); expect(selectedResults, <String>['Result']);
}); });
testWidgets('showSearch with useRootNavigator', (WidgetTester tester) async { testWidgetsWithLeakTracking('showSearch with useRootNavigator', (WidgetTester tester) async {
final _MyNavigatorObserver rootObserver = _MyNavigatorObserver(); final _MyNavigatorObserver rootObserver = _MyNavigatorObserver();
final _MyNavigatorObserver localObserver = _MyNavigatorObserver(); final _MyNavigatorObserver localObserver = _MyNavigatorObserver();
final _TestEmptySearchDelegate delegate = _TestEmptySearchDelegate(); final _TestEmptySearchDelegate delegate = _TestEmptySearchDelegate();
addTearDown(delegate.dispose);
await tester.pumpWidget(MaterialApp( await tester.pumpWidget(MaterialApp(
navigatorObservers: <NavigatorObserver>[rootObserver], navigatorObservers: <NavigatorObserver>[rootObserver],
...@@ -1051,10 +1083,11 @@ void main() { ...@@ -1051,10 +1083,11 @@ void main() {
expect(localObserver.pushCount, 1); expect(localObserver.pushCount, 1);
}); });
testWidgets('Query text field shows toolbar initially', (WidgetTester tester) async { testWidgetsWithLeakTracking('Query text field shows toolbar initially', (WidgetTester tester) async {
// This is a regression test for https://github.com/flutter/flutter/issues/95588 // This is a regression test for https://github.com/flutter/flutter/issues/95588
final _TestSearchDelegate delegate = _TestSearchDelegate(); final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
final List<String> selectedResults = <String>[]; final List<String> selectedResults = <String>[];
await tester.pumpWidget(TestHomePage( await tester.pumpWidget(TestHomePage(
......
...@@ -196,21 +196,21 @@ void main() { ...@@ -196,21 +196,21 @@ void main() {
expect(inputText.style.fontSize, headerTextStyle.fontSize); expect(inputText.style.fontSize, headerTextStyle.fontSize);
} }
testWidgets('SearchView properties overrides defaults', (WidgetTester tester) async { testWidgetsWithLeakTracking('SearchView properties overrides defaults', (WidgetTester tester) async {
await tester.pumpWidget(buildFrame(useSearchViewProperties: true)); await tester.pumpWidget(buildFrame(useSearchViewProperties: true));
await tester.tap(find.byIcon(Icons.search)); await tester.tap(find.byIcon(Icons.search));
await tester.pumpAndSettle(); // allow the animations to finish await tester.pumpAndSettle(); // allow the animations to finish
checkSearchView(tester); checkSearchView(tester);
}); });
testWidgets('SearchView theme data overrides defaults', (WidgetTester tester) async { testWidgetsWithLeakTracking('SearchView theme data overrides defaults', (WidgetTester tester) async {
await tester.pumpWidget(buildFrame(searchViewThemeData: searchViewTheme)); await tester.pumpWidget(buildFrame(searchViewThemeData: searchViewTheme));
await tester.tap(find.byIcon(Icons.search)); await tester.tap(find.byIcon(Icons.search));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
checkSearchView(tester); checkSearchView(tester);
}); });
testWidgets('Overall Theme SearchView theme overrides defaults', (WidgetTester tester) async { testWidgetsWithLeakTracking('Overall Theme SearchView theme overrides defaults', (WidgetTester tester) async {
await tester.pumpWidget(buildFrame(overallTheme: searchViewTheme)); await tester.pumpWidget(buildFrame(overallTheme: searchViewTheme));
await tester.tap(find.byIcon(Icons.search)); await tester.tap(find.byIcon(Icons.search));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
...@@ -219,7 +219,7 @@ void main() { ...@@ -219,7 +219,7 @@ void main() {
// Same as the previous tests with empty SearchViewThemeData's instead of null. // Same as the previous tests with empty SearchViewThemeData's instead of null.
testWidgets('SearchView properties overrides defaults, empty theme and overall theme', (WidgetTester tester) async { testWidgetsWithLeakTracking('SearchView properties overrides defaults, empty theme and overall theme', (WidgetTester tester) async {
await tester.pumpWidget(buildFrame(useSearchViewProperties: true, await tester.pumpWidget(buildFrame(useSearchViewProperties: true,
searchViewThemeData: const SearchViewThemeData(), searchViewThemeData: const SearchViewThemeData(),
overallTheme: const SearchViewThemeData())); overallTheme: const SearchViewThemeData()));
...@@ -228,7 +228,7 @@ void main() { ...@@ -228,7 +228,7 @@ void main() {
checkSearchView(tester); checkSearchView(tester);
}); });
testWidgets('SearchView theme overrides defaults and overall theme', (WidgetTester tester) async { testWidgetsWithLeakTracking('SearchView theme overrides defaults and overall theme', (WidgetTester tester) async {
await tester.pumpWidget(buildFrame(searchViewThemeData: searchViewTheme, await tester.pumpWidget(buildFrame(searchViewThemeData: searchViewTheme,
overallTheme: const SearchViewThemeData())); overallTheme: const SearchViewThemeData()));
await tester.tap(find.byIcon(Icons.search)); await tester.tap(find.byIcon(Icons.search));
...@@ -236,7 +236,7 @@ void main() { ...@@ -236,7 +236,7 @@ void main() {
checkSearchView(tester); checkSearchView(tester);
}); });
testWidgets('Overall Theme SearchView theme overrides defaults and null theme', (WidgetTester tester) async { testWidgetsWithLeakTracking('Overall Theme SearchView theme overrides defaults and null theme', (WidgetTester tester) async {
await tester.pumpWidget(buildFrame(overallTheme: searchViewTheme)); await tester.pumpWidget(buildFrame(overallTheme: searchViewTheme));
await tester.tap(find.byIcon(Icons.search)); await tester.tap(find.byIcon(Icons.search));
await tester.pumpAndSettle(); // allow the animations to finish await tester.pumpAndSettle(); // allow the animations to finish
......
...@@ -404,7 +404,7 @@ void main() { ...@@ -404,7 +404,7 @@ void main() {
expect(confirmButtonStyle.toString(), equalsIgnoringHashCodes(TextButton.styleFrom().toString())); expect(confirmButtonStyle.toString(), equalsIgnoringHashCodes(TextButton.styleFrom().toString()));
}); });
testWidgets('Material2 - Passing no TimePickerThemeData uses defaults - input mode', (WidgetTester tester) async { testWidgetsWithLeakTracking('Material2 - Passing no TimePickerThemeData uses defaults - input mode', (WidgetTester tester) async {
final ThemeData defaultTheme = ThemeData(useMaterial3: false); final ThemeData defaultTheme = ThemeData(useMaterial3: false);
await tester.pumpWidget(_TimePickerLauncher(themeData: defaultTheme, entryMode: TimePickerEntryMode.input)); await tester.pumpWidget(_TimePickerLauncher(themeData: defaultTheme, entryMode: TimePickerEntryMode.input));
await tester.tap(find.text('X')); await tester.tap(find.text('X'));
...@@ -446,7 +446,7 @@ void main() { ...@@ -446,7 +446,7 @@ void main() {
expect(confirmButtonStyle.toString(), equalsIgnoringHashCodes(TextButton.styleFrom().toString())); expect(confirmButtonStyle.toString(), equalsIgnoringHashCodes(TextButton.styleFrom().toString()));
}); });
testWidgets('Material3 - Passing no TimePickerThemeData uses defaults - input mode', (WidgetTester tester) async { testWidgetsWithLeakTracking('Material3 - Passing no TimePickerThemeData uses defaults - input mode', (WidgetTester tester) async {
final ThemeData defaultTheme = ThemeData(useMaterial3: true); final ThemeData defaultTheme = ThemeData(useMaterial3: true);
await tester.pumpWidget(_TimePickerLauncher(themeData: defaultTheme, entryMode: TimePickerEntryMode.input)); await tester.pumpWidget(_TimePickerLauncher(themeData: defaultTheme, entryMode: TimePickerEntryMode.input));
await tester.tap(find.text('X')); await tester.tap(find.text('X'));
...@@ -737,7 +737,7 @@ void main() { ...@@ -737,7 +737,7 @@ void main() {
expect(confirmButtonStyle.toString(), equalsIgnoringHashCodes(timePickerTheme.confirmButtonStyle.toString())); expect(confirmButtonStyle.toString(), equalsIgnoringHashCodes(timePickerTheme.confirmButtonStyle.toString()));
}); });
testWidgets('Time picker uses values from TimePickerThemeData with InputDecorationTheme - input mode', (WidgetTester tester) async { testWidgetsWithLeakTracking('Time picker uses values from TimePickerThemeData with InputDecorationTheme - input mode', (WidgetTester tester) async {
final TimePickerThemeData timePickerTheme = _timePickerTheme(includeInputDecoration: true); final TimePickerThemeData timePickerTheme = _timePickerTheme(includeInputDecoration: true);
final ThemeData theme = ThemeData(timePickerTheme: timePickerTheme); final ThemeData theme = ThemeData(timePickerTheme: timePickerTheme);
await tester.pumpWidget(_TimePickerLauncher(themeData: theme, entryMode: TimePickerEntryMode.input)); await tester.pumpWidget(_TimePickerLauncher(themeData: theme, entryMode: TimePickerEntryMode.input));
...@@ -754,7 +754,7 @@ void main() { ...@@ -754,7 +754,7 @@ void main() {
expect(hourDecoration.hintStyle, timePickerTheme.inputDecorationTheme!.hintStyle); expect(hourDecoration.hintStyle, timePickerTheme.inputDecorationTheme!.hintStyle);
}); });
testWidgets('Time picker uses values from TimePickerThemeData without InputDecorationTheme - input mode', (WidgetTester tester) async { testWidgetsWithLeakTracking('Time picker uses values from TimePickerThemeData without InputDecorationTheme - input mode', (WidgetTester tester) async {
final TimePickerThemeData timePickerTheme = _timePickerTheme(); final TimePickerThemeData timePickerTheme = _timePickerTheme();
final ThemeData theme = ThemeData(timePickerTheme: timePickerTheme); final ThemeData theme = ThemeData(timePickerTheme: timePickerTheme);
await tester.pumpWidget(_TimePickerLauncher(themeData: theme, entryMode: TimePickerEntryMode.input)); await tester.pumpWidget(_TimePickerLauncher(themeData: theme, entryMode: TimePickerEntryMode.input));
......
...@@ -1480,16 +1480,18 @@ void main() { ...@@ -1480,16 +1480,18 @@ void main() {
semantics.dispose(); semantics.dispose();
}); });
testWidgets('Tooltip semantics does not merge into child', (WidgetTester tester) async { testWidgetsWithLeakTracking('Tooltip semantics does not merge into child', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester); final SemanticsTester semantics = SemanticsTester(tester);
final GlobalKey<TooltipState> tooltipKey = GlobalKey<TooltipState>(); final GlobalKey<TooltipState> tooltipKey = GlobalKey<TooltipState>();
late final OverlayEntry entry;
addTearDown(() => entry..remove()..dispose());
await tester.pumpWidget( await tester.pumpWidget(
Directionality( Directionality(
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
child: Overlay( child: Overlay(
initialEntries: <OverlayEntry>[ initialEntries: <OverlayEntry>[
OverlayEntry( entry = OverlayEntry(
builder: (BuildContext context) { builder: (BuildContext context) {
return ListView( return ListView(
children: <Widget>[ children: <Widget>[
......
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