drawer_test.dart 6.18 KB
Newer Older
Hixie's avatar
Hixie committed
1 2 3 4
// 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.

Adam Barth's avatar
Adam Barth committed
5
import 'package:flutter_test/flutter_test.dart';
6 7
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
Hixie's avatar
Hixie committed
8 9 10

void main() {

11
  testWidgets('Drawer control test', (WidgetTester tester) async {
12 13
    GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
    BuildContext savedContext;
14
    await tester.pumpWidget(
15 16 17 18 19 20 21 22 23 24
      new MaterialApp(
        home: new Builder(
          builder: (BuildContext context) {
            savedContext = context;
            return new Scaffold(
              key: scaffoldKey,
              drawer: new Text('drawer'),
              body: new Container()
            );
          }
Hixie's avatar
Hixie committed
25
        )
26 27
      )
    );
28
    await tester.pump(); // no effect
29 30
    expect(find.text('drawer'), findsNothing);
    scaffoldKey.currentState.openDrawer();
31
    await tester.pump(); // drawer should be starting to animate in
32
    expect(find.text('drawer'), findsOneWidget);
33
    await tester.pump(new Duration(seconds: 1)); // animation done
34 35
    expect(find.text('drawer'), findsOneWidget);
    Navigator.pop(savedContext);
36
    await tester.pump(); // drawer should be starting to animate away
37
    expect(find.text('drawer'), findsOneWidget);
38
    await tester.pump(new Duration(seconds: 1)); // animation done
39
    expect(find.text('drawer'), findsNothing);
Hixie's avatar
Hixie committed
40 41
  });

42
  testWidgets('Drawer tap test', (WidgetTester tester) async {
43
    GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
44
    await tester.pumpWidget(
45 46 47 48 49
      new MaterialApp(
        home: new Scaffold(
          key: scaffoldKey,
          drawer: new Text('drawer'),
          body: new Container()
Hixie's avatar
Hixie committed
50
        )
51 52
      )
    );
53
    await tester.pump(); // no effect
54 55
    expect(find.text('drawer'), findsNothing);
    scaffoldKey.currentState.openDrawer();
56
    await tester.pump(); // drawer should be starting to animate in
57
    expect(find.text('drawer'), findsOneWidget);
58
    await tester.pump(new Duration(seconds: 1)); // animation done
59
    expect(find.text('drawer'), findsOneWidget);
60 61
    await tester.tap(find.text('drawer'));
    await tester.pump(); // nothing should have happened
62
    expect(find.text('drawer'), findsOneWidget);
63
    await tester.pump(new Duration(seconds: 1)); // ditto
64
    expect(find.text('drawer'), findsOneWidget);
65 66 67
    await tester.tapAt(const Point(750.0, 100.0)); // on the mask
    await tester.pump();
    await tester.pump(new Duration(milliseconds: 10));
68 69
    // drawer should be starting to animate away
    expect(find.text('drawer'), findsOneWidget);
70
    await tester.pump(new Duration(seconds: 1)); // animation done
71
    expect(find.text('drawer'), findsNothing);
Hixie's avatar
Hixie committed
72 73
  });

74
  testWidgets('Drawer drag cancel resume', (WidgetTester tester) async {
75
    GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
76
    await tester.pumpWidget(
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
      new MaterialApp(
        home: new Scaffold(
          key: scaffoldKey,
          drawer: new Drawer(
            child: new Block(
              children: <Widget>[
                new Text('drawer'),
                new Container(
                  height: 1000.0,
                  decoration: new BoxDecoration(
                    backgroundColor: Colors.blue[500]
                  )
                ),
              ]
            )
          ),
          body: new Container()
94
        )
95 96 97 98
      )
    );
    expect(find.text('drawer'), findsNothing);
    scaffoldKey.currentState.openDrawer();
99
    await tester.pump(); // drawer should be starting to animate in
100
    expect(find.text('drawer'), findsOneWidget);
101
    await tester.pump(new Duration(seconds: 1)); // animation done
102
    expect(find.text('drawer'), findsOneWidget);
103

104 105 106
    await tester.tapAt(const Point(750.0, 100.0)); // on the mask
    await tester.pump();
    await tester.pump(new Duration(milliseconds: 10));
107 108 109 110
    // drawer should be starting to animate away
    RenderBox textBox = tester.renderObject(find.text('drawer'));
    double textLeft = textBox.localToGlobal(Point.origin).x;
    expect(textLeft, lessThan(0.0));
111

112
    TestGesture gesture = await tester.startGesture(new Point(100.0, 100.0));
113
    // drawer should be stopped.
114 115
    await tester.pump();
    await tester.pump(new Duration(milliseconds: 10));
116
    expect(textBox.localToGlobal(Point.origin).x, equals(textLeft));
117

118
    await gesture.moveBy(new Offset(0.0, -50.0));
119
    // drawer should be returning to visible
120 121
    await tester.pump();
    await tester.pump(new Duration(seconds: 1));
122
    expect(textBox.localToGlobal(Point.origin).x, equals(0.0));
123

124
    await gesture.up();
125 126
  });

127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
  testWidgets('Drawer navigator back button', (WidgetTester tester) async {
    GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
    bool buttonPressed = false;

    await tester.pumpWidget(
      new MaterialApp(
        home: new Builder(
          builder: (BuildContext context) {
            return new Scaffold(
              key: scaffoldKey,
              drawer: new Drawer(
                child: new Block(
                  children: <Widget>[
                    new Text('drawer'),
                    new FlatButton(
                      child: new Text('close'),
                      onPressed: () => Navigator.pop(context)
                    ),
                  ]
                )
              ),
              body: new Container(
                child: new FlatButton(
                  child: new Text('button'),
                  onPressed: () { buttonPressed = true; }
                )
              )
            );
          }
        )
      )
    );

    // Open the drawer.
    scaffoldKey.currentState.openDrawer();
    await tester.pump(); // drawer should be starting to animate in
    expect(find.text('drawer'), findsOneWidget);

    // Tap the close button to pop the drawer route.
    await tester.pump(new Duration(milliseconds: 100));
    await tester.tap(find.text('close'));
    await tester.pump();
    await tester.pump(new Duration(seconds: 1));
    expect(find.text('drawer'), findsNothing);

    // Confirm that a button in the scaffold body is still clickable.
    await tester.tap(find.text('button'));
    expect(buttonPressed, equals(true));
  });

Hixie's avatar
Hixie committed
177
}