// Copyright 2015 The Chromium 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_test/flutter_test.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:test/test.dart'; void main() { test('Verify that a tap dismisses a modal BottomSheet', () { testWidgets((WidgetTester tester) { BuildContext context; bool showBottomSheetThenCalled = false; tester.pumpWidget(new MaterialApp( routes: <String, RouteBuilder>{ '/': (RouteArguments args) { context = args.context; return new Container(); } } )); tester.pump(); expect(tester.findText('BottomSheet'), isNull); showModalBottomSheet( context: context, builder: (BuildContext context) => new Text('BottomSheet') ).then((_) { showBottomSheetThenCalled = true; }); tester.pump(); // bottom sheet show animation starts tester.pump(new Duration(seconds: 1)); // animation done expect(tester.findText('BottomSheet'), isNotNull); expect(showBottomSheetThenCalled, isFalse); // Tap on the the bottom sheet itself to dismiss it tester.tap(tester.findText('BottomSheet')); tester.pump(); // bottom sheet dismiss animation starts expect(showBottomSheetThenCalled, isTrue); tester.pump(new Duration(seconds: 1)); // last frame of animation (sheet is entirely off-screen, but still present) tester.pump(new Duration(seconds: 1)); // frame after the animation (sheet has been removed) expect(tester.findText('BottomSheet'), isNull); showModalBottomSheet(context: context, builder: (BuildContext context) => new Text('BottomSheet')); tester.pump(); // bottom sheet show animation starts tester.pump(new Duration(seconds: 1)); // animation done expect(tester.findText('BottomSheet'), isNotNull); // Tap above the the bottom sheet to dismiss it tester.tapAt(new Point(20.0, 20.0)); tester.pump(); // bottom sheet dismiss animation starts tester.pump(new Duration(seconds: 1)); // animation done tester.pump(new Duration(seconds: 1)); // rebuild frame expect(tester.findText('BottomSheet'), isNull); }); }); test('Verify that a downwards fling dismisses a persistent BottomSheet', () { testWidgets((WidgetTester tester) { GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>(); bool showBottomSheetThenCalled = false; tester.pumpWidget(new MaterialApp( routes: <String, RouteBuilder>{ '/': (RouteArguments args) { return new Scaffold( key: scaffoldKey, body: new Center(child: new Text('body')) ); } } )); expect(showBottomSheetThenCalled, isFalse); expect(tester.findText('BottomSheet'), isNull); scaffoldKey.currentState.showBottomSheet((BuildContext context) { return new Container( margin: new EdgeDims.all(40.0), child: new Text('BottomSheet') ); }).closed.then((_) { showBottomSheetThenCalled = true; }); expect(showBottomSheetThenCalled, isFalse); expect(tester.findText('BottomSheet'), isNull); tester.pump(); // bottom sheet show animation starts expect(showBottomSheetThenCalled, isFalse); expect(tester.findText('BottomSheet'), isNotNull); tester.pump(new Duration(seconds: 1)); // animation done expect(showBottomSheetThenCalled, isFalse); expect(tester.findText('BottomSheet'), isNotNull); tester.fling(tester.findText('BottomSheet'), const Offset(0.0, 20.0), 1000.0); tester.pump(); // drain the microtask queue (Future completion callback) expect(showBottomSheetThenCalled, isTrue); expect(tester.findText('BottomSheet'), isNotNull); tester.pump(); // bottom sheet dismiss animation starts expect(showBottomSheetThenCalled, isTrue); expect(tester.findText('BottomSheet'), isNotNull); tester.pump(new Duration(seconds: 1)); // animation done expect(showBottomSheetThenCalled, isTrue); expect(tester.findText('BottomSheet'), isNull); }); }); }