| // 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'; |
| import 'package:flutter_test/flutter_test.dart'; |
| |
| void main() { |
| // Constants taken from _ContextMenuActionState. |
| const Color _kBackgroundColor = Color(0xFFEEEEEE); |
| const Color _kBackgroundColorPressed = Color(0xFFDDDDDD); |
| const Color _kRegularActionColor = CupertinoColors.black; |
| const Color _kDestructiveActionColor = CupertinoColors.destructiveRed; |
| const FontWeight _kDefaultActionWeight = FontWeight.w600; |
| |
| Widget _getApp({VoidCallback? onPressed, bool isDestructiveAction = false, bool isDefaultAction = false}) { |
| final UniqueKey actionKey = UniqueKey(); |
| final CupertinoContextMenuAction action = CupertinoContextMenuAction( |
| key: actionKey, |
| onPressed: onPressed, |
| trailingIcon: CupertinoIcons.home, |
| isDestructiveAction: isDestructiveAction, |
| isDefaultAction: isDefaultAction, |
| child: const Text('I am a CupertinoContextMenuAction'), |
| ); |
| |
| return CupertinoApp( |
| home: CupertinoPageScaffold( |
| child: Center( |
| child: action, |
| ), |
| ), |
| ); |
| } |
| |
| BoxDecoration _getDecoration(WidgetTester tester) { |
| final Finder finder = find.descendant( |
| of: find.byType(CupertinoContextMenuAction), |
| matching: find.byType(Container), |
| ); |
| expect(finder, findsOneWidget); |
| final Container container = tester.widget(finder); |
| return container.decoration! as BoxDecoration; |
| } |
| |
| TextStyle _getTextStyle(WidgetTester tester) { |
| final Finder finder = find.descendant( |
| of: find.byType(CupertinoContextMenuAction), |
| matching: find.byType(DefaultTextStyle), |
| ); |
| expect(finder, findsOneWidget); |
| final DefaultTextStyle defaultStyle = tester.widget(finder); |
| return defaultStyle.style; |
| } |
| |
| Icon _getIcon(WidgetTester tester) { |
| final Finder finder = find.descendant( |
| of: find.byType(CupertinoContextMenuAction), |
| matching: find.byType(Icon), |
| ); |
| expect(finder, findsOneWidget); |
| final Icon icon = tester.widget(finder); |
| return icon; |
| } |
| |
| testWidgets('responds to taps', (WidgetTester tester) async { |
| bool wasPressed = false; |
| await tester.pumpWidget(_getApp(onPressed: () { |
| wasPressed = true; |
| })); |
| |
| expect(wasPressed, false); |
| await tester.tap(find.byType(CupertinoContextMenuAction)); |
| expect(wasPressed, true); |
| }); |
| |
| testWidgets('turns grey when pressed and held', (WidgetTester tester) async { |
| await tester.pumpWidget(_getApp()); |
| expect(_getDecoration(tester).color, _kBackgroundColor); |
| |
| final Offset actionCenter = tester.getCenter(find.byType(CupertinoContextMenuAction)); |
| final TestGesture gesture = await tester.startGesture(actionCenter); |
| await tester.pump(); |
| expect(_getDecoration(tester).color, _kBackgroundColorPressed); |
| |
| await gesture.up(); |
| await tester.pump(); |
| expect(_getDecoration(tester).color, _kBackgroundColor); |
| }); |
| |
| testWidgets('icon and textStyle colors are correct out of the box', (WidgetTester tester) async { |
| await tester.pumpWidget(_getApp()); |
| expect(_getTextStyle(tester).color, _kRegularActionColor); |
| expect(_getIcon(tester).color, _kRegularActionColor); |
| }); |
| |
| testWidgets('icon and textStyle colors are correct for destructive actions', (WidgetTester tester) async { |
| await tester.pumpWidget(_getApp(isDestructiveAction: true)); |
| expect(_getTextStyle(tester).color, _kDestructiveActionColor); |
| expect(_getIcon(tester).color, _kDestructiveActionColor); |
| }); |
| |
| testWidgets('textStyle is correct for defaultAction', (WidgetTester tester) async { |
| await tester.pumpWidget(_getApp(isDefaultAction: true)); |
| expect(_getTextStyle(tester).fontWeight, _kDefaultActionWeight); |
| }); |
| |
| } |