| // 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 'dart:ui'; |
| |
| import 'package:flutter/cupertino.dart'; |
| import 'package:flutter/foundation.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| |
| void main() { |
| TestWidgetsFlutterBinding.ensureInitialized(); |
| |
| testWidgets('has correct backdrop filters', (WidgetTester tester) async { |
| await tester.pumpWidget( |
| CupertinoApp( |
| home: Center( |
| child: CupertinoDesktopTextSelectionToolbar( |
| anchor: Offset.zero, |
| children: <Widget>[ |
| CupertinoDesktopTextSelectionToolbarButton( |
| child: const Text('Tap me'), |
| onPressed: () {}, |
| ), |
| ], |
| ), |
| ), |
| ), |
| ); |
| |
| final BackdropFilter toolbarFilter = tester.firstWidget<BackdropFilter>( |
| find.descendant( |
| of: find.byType(CupertinoDesktopTextSelectionToolbar), |
| matching: find.byType(BackdropFilter), |
| ), |
| ); |
| |
| expect( |
| toolbarFilter.filter.runtimeType, |
| // _ComposeImageFilter is internal so we can't test if its filters are |
| // for blur and saturation, but checking if it's a _ComposeImageFilter |
| // should be enough. Outer and inner parameters don't matter, we just need |
| // a new _ComposeImageFilter to get its runtimeType. |
| // |
| // As web doesn't support ImageFilter.compose, we use just blur when |
| // kIsWeb. |
| kIsWeb |
| ? ImageFilter.blur().runtimeType |
| : ImageFilter.compose( |
| outer: ImageFilter.blur(), |
| inner: ImageFilter.blur(), |
| ).runtimeType, |
| ); |
| }); |
| |
| testWidgets('has shadow', (WidgetTester tester) async { |
| await tester.pumpWidget( |
| CupertinoApp( |
| home: Center( |
| child: CupertinoDesktopTextSelectionToolbar( |
| anchor: Offset.zero, |
| children: <Widget>[ |
| CupertinoDesktopTextSelectionToolbarButton( |
| child: const Text('Tap me'), |
| onPressed: () {}, |
| ), |
| ], |
| ), |
| ), |
| ), |
| ); |
| |
| final DecoratedBox decoratedBox = tester.firstWidget<DecoratedBox>( |
| find.descendant( |
| of: find.byType(CupertinoDesktopTextSelectionToolbar), |
| matching: find.byType(DecoratedBox), |
| ), |
| ); |
| |
| expect( |
| (decoratedBox.decoration as BoxDecoration).boxShadow, |
| isNotNull, |
| ); |
| }); |
| |
| testWidgets('is translucent', (WidgetTester tester) async { |
| await tester.pumpWidget( |
| CupertinoApp( |
| home: Center( |
| child: CupertinoDesktopTextSelectionToolbar( |
| anchor: Offset.zero, |
| children: <Widget>[ |
| CupertinoDesktopTextSelectionToolbarButton( |
| child: const Text('Tap me'), |
| onPressed: () {}, |
| ), |
| ], |
| ), |
| ), |
| ), |
| ); |
| |
| final DecoratedBox decoratedBox = tester |
| .widgetList<DecoratedBox>( |
| find.descendant( |
| of: find.byType(CupertinoDesktopTextSelectionToolbar), |
| matching: find.byType(DecoratedBox), |
| ), |
| ) |
| // The second DecoratedBox should be the one with color. |
| .elementAt(1); |
| |
| expect( |
| (decoratedBox.decoration as BoxDecoration).color!.opacity, |
| lessThan(1.0), |
| ); |
| }); |
| |
| testWidgets('positions itself at the anchor', (WidgetTester tester) async { |
| // An arbitrary point on the screen to position at. |
| const Offset anchor = Offset(30.0, 40.0); |
| |
| await tester.pumpWidget( |
| CupertinoApp( |
| home: Center( |
| child: CupertinoDesktopTextSelectionToolbar( |
| anchor: anchor, |
| children: <Widget>[ |
| CupertinoDesktopTextSelectionToolbarButton( |
| child: const Text('Tap me'), |
| onPressed: () {}, |
| ), |
| ], |
| ), |
| ), |
| ), |
| ); |
| |
| expect( |
| tester |
| .getTopLeft(find.byType(CupertinoDesktopTextSelectionToolbarButton)), |
| // Greater than due to padding internal to the toolbar. |
| greaterThan(anchor), |
| ); |
| }); |
| } |