From 986b0174455feb9448d65ada3e1f87beebb1c42e Mon Sep 17 00:00:00 2001 From: Hans Muller Date: Thu, 21 Apr 2016 08:54:43 -0700 Subject: [PATCH] Gallery Smoke Test (#3446) * Gallery Smoke Test --- .../lib/demo/page_selector_demo.dart | 4 +- .../material_gallery/lib/gallery/home.dart | 14 +- .../material_gallery/test/smoke_test.dart | 130 +++++++++++++----- .../flutter/lib/src/material/scaffold.dart | 2 +- 4 files changed, 109 insertions(+), 41 deletions(-) diff --git a/examples/material_gallery/lib/demo/page_selector_demo.dart b/examples/material_gallery/lib/demo/page_selector_demo.dart index b97d56951a..efb48b315b 100644 --- a/examples/material_gallery/lib/demo/page_selector_demo.dart +++ b/examples/material_gallery/lib/demo/page_selector_demo.dart @@ -40,14 +40,14 @@ class PageSelectorDemo extends StatelessWidget { icon: Icons.arrow_back, color: color, onPressed: () { _handleArrowButtonPress(context, -1); }, - tooltip: 'Back' + tooltip: 'Page back' ), new TabPageSelector(), new IconButton( icon: Icons.arrow_forward, color: color, onPressed: () { _handleArrowButtonPress(context, 1); }, - tooltip: 'Forward' + tooltip: 'Page forward' ) ], mainAxisAlignment: MainAxisAlignment.spaceBetween diff --git a/examples/material_gallery/lib/gallery/home.dart b/examples/material_gallery/lib/gallery/home.dart index 5f58771906..ad95f9db2f 100644 --- a/examples/material_gallery/lib/gallery/home.dart +++ b/examples/material_gallery/lib/gallery/home.dart @@ -93,7 +93,7 @@ class GalleryHomeState extends State { appBar: new AppBar( expandedHeight: _kFlexibleSpaceMaxHeight, flexibleSpace: new FlexibleSpaceBar( - title: new Text("Flutter gallery"), + title: new Text('Flutter gallery'), background: new GalleryHeader() ) ), @@ -104,18 +104,18 @@ class GalleryHomeState extends State { children: [ new TwoLevelSublist( leading: new Icon(icon: Icons.star), - title: new Text("Demos"), + title: new Text('Demos'), children: [ - new GalleryItem(title: "Weather", builder: () => new WeatherDemo()), - new GalleryItem(title: "Fitness", builder: () => new FitnessDemo()), - new GalleryItem(title: "Fancy lines", builder: () => new DrawingDemo()), + new GalleryItem(title: 'Weather', builder: () => new WeatherDemo()), + new GalleryItem(title: 'Fitness', builder: () => new FitnessDemo()), + new GalleryItem(title: 'Fancy lines', builder: () => new DrawingDemo()), new GalleryItem(title: 'Flexible space toolbar', builder: () => new FlexibleSpaceDemo()), new GalleryItem(title: 'Floating action button', builder: () => new TabsFabDemo()), ] ), new TwoLevelSublist( leading: new Icon(icon: Icons.extension), - title: new Text("Components"), + title: new Text('Components'), children: [ new GalleryItem(title: 'Buttons', builder: () => new ButtonsDemo()), new GalleryItem(title: 'Cards', builder: () => new CardsDemo()), @@ -147,7 +147,7 @@ class GalleryHomeState extends State { ), new TwoLevelSublist( leading: new Icon(icon: Icons.color_lens), - title: new Text("Style"), + title: new Text('Style'), children: [ new GalleryItem(title: 'Colors', builder: () => new ColorsDemo()), new GalleryItem(title: 'Typography', builder: () => new TypographyDemo()), diff --git a/examples/material_gallery/test/smoke_test.dart b/examples/material_gallery/test/smoke_test.dart index fba8d8415e..6f546327ec 100644 --- a/examples/material_gallery/test/smoke_test.dart +++ b/examples/material_gallery/test/smoke_test.dart @@ -8,6 +8,77 @@ import 'package:test/test.dart'; import '../lib/main.dart' as material_gallery; +// Warning: the following strings must be kept in sync with GalleryHome. +const List demoCategories = const ['Demos', 'Components', 'Style']; +const List demoNames = const [ + 'Weather', + 'Fitness', + 'Fancy lines', + 'Flexible space toolbar', + 'Floating action button', + 'Buttons', + 'Cards', + 'Chips', + 'Date picker', + 'Data tables', + 'Dialog', + 'Drop-down button', + 'Expand/collapse list control', + 'Grid', + 'Icons', + 'Leave-behind list items', + 'List', + 'Menus', + 'Modal bottom sheet', + 'Over-scroll', + 'Page selector', + 'Persistent bottom sheet', + 'Progress indicators', + 'Scrollable tabs', + 'Selection controls', + 'Sliders', + 'Snackbar', + 'Tabs', + 'Text fields', + 'Time picker', + 'Tooltips', + 'Colors', + 'Typography' +]; + +Finder byTooltip(WidgetTester tester, String message) { + return find.byElement((Element element) { + Widget widget = element.widget; + if (widget is Tooltip) + return widget.message == message; + return false; + }); +} + +Finder findNavigationMenuButton(WidgetTester tester) => byTooltip(tester, 'Open navigation menu'); + +Finder findBackButton(WidgetTester tester) => byTooltip(tester, 'Back'); + +// Start a gallery demo and then go back. This function assumes that the +// we're starting on home route and that the submenu that contains the demo +// called 'name' is already open. +void smokeDemo(WidgetTester tester, String menuItemText) { + // Ensure that we're (likely to be) on the home page + final Finder navigationMenuButton = findNavigationMenuButton(tester); + expect(tester, hasWidget(navigationMenuButton)); + + tester.tap(find.text(menuItemText)); + tester.pump(); // Launch the demo. + tester.pump(const Duration(seconds: 1)); // Wait until the demo has opened. + + // Go back + Finder backButton = findBackButton(tester); + expect(tester, hasWidget(backButton)); + tester.tap(backButton); + tester.pump(); // Start the navigator pop "back" operation. + tester.pump(const Duration(seconds: 1)); // Wait until it has finished. +} + void main() { test('Material Gallery app smoke test', () { testWidgets((WidgetTester tester) { @@ -15,48 +86,45 @@ void main() { tester.pump(); // see https://github.com/flutter/flutter/issues/1865 tester.pump(); // triggers a frame - // Try loading Weather demo - tester.tap(find.text('Demos')); - tester.pump(); - tester.pump(const Duration(seconds: 1)); // wait til it's really opened + // Expand the demo category submenus. + for (String category in demoCategories.reversed) { + tester.tap(find.text(category)); + tester.pump(); + tester.pump(const Duration(seconds: 1)); // Wait until the menu has expanded. + } - tester.tap(find.text('Weather')); - tester.pump(); - tester.pump(const Duration(seconds: 1)); // wait til it's really opened + final List scrollDeltas = new List(); + double previousY = tester.getTopRight(find.text(demoCategories[0])).y; + for (String name in demoNames) { + final double y = tester.getTopRight(find.text(name)).y; + scrollDeltas.add(previousY - y); + previousY = y; + } - // Go back - Finder backButton = find.byElement((Element element) { - Widget widget = element.widget; - if (widget is Tooltip) - return widget.message == 'Back'; - return false; - }); - expect(tester, hasWidget(backButton)); - tester.tap(backButton); - tester.pump(); // start going back - tester.pump(const Duration(seconds: 1)); // wait til it's finished + // Launch each demo and then scroll that item out of the way. + for (int i = 0; i < demoNames.length; i += 1) { + final String name = demoNames[i]; + print("$name"); + smokeDemo(tester, name); + tester.scroll(find.text(name), new Offset(0.0, scrollDeltas[i])); + tester.pump(); + } - // Open menu - Finder navigationMenu = find.byElement((Element element) { - Widget widget = element.widget; - if (widget is Tooltip) - return widget.message == 'Open navigation menu'; - return false; - }); - expect(tester, hasWidget(navigationMenu)); - tester.tap(navigationMenu); - tester.pump(); // start opening menu - tester.pump(const Duration(seconds: 1)); // wait til it's really opened + Finder navigationMenuButton = findNavigationMenuButton(tester); + expect(tester, hasWidget(navigationMenuButton)); + tester.tap(navigationMenuButton); + tester.pump(); // Start opening drawer. + tester.pump(const Duration(seconds: 1)); // Wait until it's really opened. // switch theme tester.tap(find.text('Dark')); tester.pump(); - tester.pump(const Duration(seconds: 1)); // wait til it's changed + tester.pump(const Duration(seconds: 1)); // Wait until it's changed. // switch theme tester.tap(find.text('Light')); tester.pump(); - tester.pump(const Duration(seconds: 1)); // wait til it's changed + tester.pump(const Duration(seconds: 1)); // Wait until it's changed. }); }); } diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart index d15ba45b3d..b113ceb7f9 100644 --- a/packages/flutter/lib/src/material/scaffold.dart +++ b/packages/flutter/lib/src/material/scaffold.dart @@ -215,7 +215,7 @@ class Scaffold extends StatefulWidget { this.scrollableKey, this.appBarBehavior: AppBarBehavior.anchor }) : super(key: key) { - assert((appBarBehavior == AppBarBehavior.scroll) ? scrollableKey != null : true); + assert(scrollableKey != null ? (appBarBehavior != AppBarBehavior.anchor) : true); } final AppBar appBar;