blob: 440deda1b72ee6661b4f0a74a5aacd15e0ae4399 [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/cupertino.dart' show CupertinoTextSelectionToolbar;
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
// Vertical position at which to anchor the toolbar for testing.
const double _kAnchor = 200;
// Amount for toolbar to overlap bottom padding for testing.
const double _kTestToolbarOverlap = 10;
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
/// Builds test button items for each of the suggestions provided.
List<ContextMenuButtonItem> buildSuggestionButtons(List<String> suggestions) {
final List<ContextMenuButtonItem> buttonItems = <ContextMenuButtonItem>[];
for (final String suggestion in suggestions) {
buttonItems.add(ContextMenuButtonItem(
onPressed: () {},
label: suggestion,
));
}
final ContextMenuButtonItem deleteButton =
ContextMenuButtonItem(
onPressed: () {},
type: ContextMenuButtonType.delete,
label: 'DELETE',
);
buttonItems.add(deleteButton);
return buttonItems;
}
/// Finds the container of the [SpellCheckSuggestionsToolbar] so that
/// the position of the toolbar itself may be determined.
Finder findSpellCheckSuggestionsToolbar() {
return find.descendant(
of: find.byType(MaterialApp),
matching: find.byWidgetPredicate(
(Widget w) => '${w.runtimeType}' == '_SpellCheckSuggestionsToolbarContainer'),
);
}
testWidgets('positions toolbar below anchor when it fits above bottom view padding', (WidgetTester tester) async {
// We expect the toolbar to be positioned right below the anchor with padding accounted for.
const double expectedToolbarY =
_kAnchor + (2 * SpellCheckSuggestionsToolbar.kToolbarContentDistanceBelow) - CupertinoTextSelectionToolbar.kToolbarScreenPadding;
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: SpellCheckSuggestionsToolbar(
anchor: const Offset(0.0, _kAnchor),
buttonItems: buildSuggestionButtons(<String>['hello', 'yellow', 'yell']),
),
),
),
);
final double toolbarY = tester.getTopLeft(findSpellCheckSuggestionsToolbar()).dy;
expect(toolbarY, equals(expectedToolbarY));
});
testWidgets('re-positions toolbar higher below anchor when it does not fit above bottom view padding', (WidgetTester tester) async {
// We expect the toolbar to be positioned _kTestToolbarOverlap pixels above the anchor with padding accounted for.
const double expectedToolbarY =
_kAnchor + (2 * SpellCheckSuggestionsToolbar.kToolbarContentDistanceBelow) - CupertinoTextSelectionToolbar.kToolbarScreenPadding - _kTestToolbarOverlap;
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: SpellCheckSuggestionsToolbar(
anchor: const Offset(0.0, _kAnchor - _kTestToolbarOverlap),
buttonItems: buildSuggestionButtons(<String>['hello', 'yellow', 'yell']),
),
),
),
);
final double toolbarY = tester.getTopLeft(findSpellCheckSuggestionsToolbar()).dy;
expect(toolbarY, equals(expectedToolbarY));
});
}