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() {
});
});
testWidgets('FocusNode can request focus', (WidgetTester tester) async {
testWidgetsWithLeakTracking('FocusNode can request focus', (WidgetTester tester) async {
final FocusNode focusNode = FocusNode();
addTearDown(focusNode.dispose);
await tester.pumpWidget(inputDatePickerField(
focusNode: focusNode,
));
......
......@@ -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();
addTearDown(() => delegate.dispose());
final List<String> selectedResults = <String>[];
await tester.pumpWidget(TestHomePage(
......@@ -84,10 +85,11 @@ void main() {
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
final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
final List<String?> selectedResults = <String?>[];
await tester.pumpWidget(TestHomePage(
......@@ -130,9 +132,10 @@ void main() {
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';
final _TestSearchDelegate delegate = _TestSearchDelegate(searchHint: searchHintText);
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(
delegate: delegate,
......@@ -144,8 +147,9 @@ void main() {
expect(hintText.style!.color, _TestSearchDelegate.hintTextColor);
});
testWidgets('Requests suggestions', (WidgetTester tester) async {
testWidgetsWithLeakTracking('Requests suggestions', (WidgetTester tester) async {
final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(
delegate: delegate,
......@@ -173,8 +177,9 @@ void main() {
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();
addTearDown(() => delegate.dispose());
final List<String> selectedResults = <String>[];
await tester.pumpWidget(TestHomePage(
......@@ -209,8 +214,9 @@ void main() {
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();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(
delegate: delegate,
......@@ -279,8 +285,9 @@ void main() {
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();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(
delegate: delegate,
......@@ -299,8 +306,9 @@ void main() {
expect(delegate.query, '');
});
testWidgets('Initial queries are honored', (WidgetTester tester) async {
testWidgetsWithLeakTracking('Initial queries are honored', (WidgetTester tester) async {
final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
expect(delegate.query, '');
......@@ -315,8 +323,9 @@ void main() {
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();
addTearDown(() => delegate.dispose());
delegate.query = 'Foo';
......@@ -330,8 +339,9 @@ void main() {
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();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(
delegate: delegate,
......@@ -351,8 +361,9 @@ void main() {
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();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(
delegate: delegate,
......@@ -379,12 +390,13 @@ void main() {
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 _TestSearchDelegate nestedSearchDelegate = _TestSearchDelegate(
suggestions: 'Nested Suggestions',
result: 'Nested Result',
);
addTearDown(nestedSearchDelegate.dispose);
final List<String> selectedResults = <String>[];
final _TestSearchDelegate delegate = _TestSearchDelegate(
......@@ -406,6 +418,7 @@ void main() {
),
],
);
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(
delegate: delegate,
......@@ -443,8 +456,9 @@ void main() {
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;
addTearDown(() => delegate.dispose());
final List<String?> nestedSearchResults = <String?>[];
final _TestSearchDelegate nestedSearchDelegate = _TestSearchDelegate(
suggestions: 'Nested Suggestions',
......@@ -463,6 +477,7 @@ void main() {
),
],
);
addTearDown(nestedSearchDelegate.dispose);
final List<String> selectedResults = <String>[];
delegate = _TestSearchDelegate(
......@@ -515,11 +530,12 @@ void main() {
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';
final String defaultSearchHint = const DefaultMaterialLocalizations().searchFieldLabel;
final _TestSearchDelegate delegate = _TestSearchDelegate(searchHint: searchHint);
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(
delegate: delegate,
......@@ -531,10 +547,11 @@ void main() {
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 _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(
delegate: delegate,
......@@ -545,11 +562,12 @@ void main() {
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 TextStyle searchFieldStyle = TextStyle(color: Colors.red, fontSize: 3);
final _TestSearchDelegate delegate = _TestSearchDelegate(searchHint: searchHintText, searchFieldStyle: searchFieldStyle);
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(delegate: delegate));
await tester.tap(find.byTooltip('Search'));
......@@ -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();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(
delegate: delegate,
......@@ -579,8 +598,9 @@ void main() {
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);
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(
delegate: delegate,
......@@ -591,9 +611,10 @@ void main() {
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');
final _TestSearchDelegate delegate = _TestSearchDelegate(flexibleSpace: flexibleSpace);
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(delegate: delegate));
await tester.tap(find.byTooltip('Search'));
......@@ -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 _TestSearchDelegate delegate = _TestSearchDelegate(flexibleSpace: flexibleSpace);
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(
delegate: delegate,
));
......@@ -730,9 +753,11 @@ void main() {
semantics.dispose();
});
testWidgets('does not include routeName', (WidgetTester tester) async {
testWidgetsWithLeakTracking('does not include routeName', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester);
final _TestSearchDelegate delegate = _TestSearchDelegate(flexibleSpace: flexibleSpace);
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(
delegate: delegate,
));
......@@ -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 _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(
delegate: delegate,
));
......@@ -862,9 +889,11 @@ void main() {
semantics.dispose();
});
testWidgets('does not include routeName', (WidgetTester tester) async {
testWidgetsWithLeakTracking('does not include routeName', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester);
final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(
delegate: delegate,
));
......@@ -883,13 +912,14 @@ void main() {
}, 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(
hintStyle: TextStyle(color: _TestSearchDelegate.hintTextColor),
);
final _TestSearchDelegate delegate = _TestSearchDelegate(
searchFieldDecorationTheme: searchFieldDecorationTheme,
);
addTearDown(() => delegate.dispose());
await tester.pumpWidget(TestHomePage(delegate: delegate));
await tester.tap(find.byTooltip('Search'));
......@@ -900,12 +930,12 @@ void main() {
});
// 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 _TestSearchDelegate delegate = _TestSearchDelegate(
defaultAppBarTheme: true,
);
final _TestSearchDelegate delegate = _TestSearchDelegate(defaultAppBarTheme: true);
addTearDown(() => delegate.dispose());
const String query = 'search query';
await tester.pumpWidget(TestHomePage(
delegate: delegate,
passInInitialQuery: true,
......@@ -928,12 +958,12 @@ void main() {
});
// 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 _TestSearchDelegate delegate = _TestSearchDelegate(
defaultAppBarTheme: true,
);
final _TestSearchDelegate delegate = _TestSearchDelegate(defaultAppBarTheme: true);
addTearDown(() => delegate.dispose());
const String query = 'search query';
await tester.pumpWidget(TestHomePage(
delegate: delegate,
passInInitialQuery: true,
......@@ -956,10 +986,11 @@ void main() {
});
// 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
// even with a null return values for [buildLeading], [buildActions] and [flexibleSpace].
final _TestEmptySearchDelegate delegate = _TestEmptySearchDelegate();
addTearDown(delegate.dispose);
final List<String> selectedResults = <String>[];
await tester.pumpWidget(TestHomePage(
......@@ -994,11 +1025,12 @@ void main() {
expect(selectedResults, <String>['Result']);
});
testWidgets('showSearch with useRootNavigator', (WidgetTester tester) async {
testWidgetsWithLeakTracking('showSearch with useRootNavigator', (WidgetTester tester) async {
final _MyNavigatorObserver rootObserver = _MyNavigatorObserver();
final _MyNavigatorObserver localObserver = _MyNavigatorObserver();
final _TestEmptySearchDelegate delegate = _TestEmptySearchDelegate();
addTearDown(delegate.dispose);
await tester.pumpWidget(MaterialApp(
navigatorObservers: <NavigatorObserver>[rootObserver],
......@@ -1051,10 +1083,11 @@ void main() {
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
final _TestSearchDelegate delegate = _TestSearchDelegate();
addTearDown(() => delegate.dispose());
final List<String> selectedResults = <String>[];
await tester.pumpWidget(TestHomePage(
......
......@@ -196,21 +196,21 @@ void main() {
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.tap(find.byIcon(Icons.search));
await tester.pumpAndSettle(); // allow the animations to finish
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.tap(find.byIcon(Icons.search));
await tester.pumpAndSettle();
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.tap(find.byIcon(Icons.search));
await tester.pumpAndSettle();
......@@ -219,7 +219,7 @@ void main() {
// 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,
searchViewThemeData: const SearchViewThemeData(),
overallTheme: const SearchViewThemeData()));
......@@ -228,7 +228,7 @@ void main() {
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,
overallTheme: const SearchViewThemeData()));
await tester.tap(find.byIcon(Icons.search));
......@@ -236,7 +236,7 @@ void main() {
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.tap(find.byIcon(Icons.search));
await tester.pumpAndSettle(); // allow the animations to finish
......
......@@ -404,7 +404,7 @@ void main() {
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);
await tester.pumpWidget(_TimePickerLauncher(themeData: defaultTheme, entryMode: TimePickerEntryMode.input));
await tester.tap(find.text('X'));
......@@ -446,7 +446,7 @@ void main() {
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);
await tester.pumpWidget(_TimePickerLauncher(themeData: defaultTheme, entryMode: TimePickerEntryMode.input));
await tester.tap(find.text('X'));
......@@ -737,7 +737,7 @@ void main() {
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 ThemeData theme = ThemeData(timePickerTheme: timePickerTheme);
await tester.pumpWidget(_TimePickerLauncher(themeData: theme, entryMode: TimePickerEntryMode.input));
......@@ -754,7 +754,7 @@ void main() {
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 ThemeData theme = ThemeData(timePickerTheme: timePickerTheme);
await tester.pumpWidget(_TimePickerLauncher(themeData: theme, entryMode: TimePickerEntryMode.input));
......
......@@ -1480,16 +1480,18 @@ void main() {
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 GlobalKey<TooltipState> tooltipKey = GlobalKey<TooltipState>();
late final OverlayEntry entry;
addTearDown(() => entry..remove()..dispose());
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: Overlay(
initialEntries: <OverlayEntry>[
OverlayEntry(
entry = OverlayEntry(
builder: (BuildContext context) {
return ListView(
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