drawer_test.dart 5.81 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4 5 6 7
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_gallery/gallery/app.dart';
8
import 'package:flutter_test/flutter_test.dart';
9 10

void main() {
11
  final TestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized();
12
  if (binding is LiveTestWidgetsFlutterBinding) {
13
    binding.framePolicy = LiveTestWidgetsFlutterBindingFramePolicy.fullyLive;
14
  }
15 16 17 18

  testWidgets('Flutter Gallery drawer item test', (WidgetTester tester) async {
    bool hasFeedback = false;

19
    await tester.pumpWidget(
20
      GalleryApp(
21
        testMode: true,
22 23 24 25 26
        onSendFeedback: () {
          hasFeedback = true;
        },
      ),
    );
27 28 29
    await tester.pump(); // see https://github.com/flutter/flutter/issues/1865
    await tester.pump(); // triggers a frame

30
    // Show the options page
31
    await tester.tap(find.byTooltip('Toggle options page'));
32
    await tester.pumpAndSettle();
33

34
    // Verify theme settings
35
    MaterialApp app = find.byType(MaterialApp).evaluate().first.widget as MaterialApp;
36 37
    expect(app.theme!.brightness, equals(Brightness.light));
    expect(app.darkTheme!.brightness, equals(Brightness.dark));
38

39 40 41 42 43
    // Switch to the dark theme: first menu button, choose 'Dark'
    await tester.tap(find.byIcon(Icons.arrow_drop_down).first);
    await tester.pumpAndSettle();
    await tester.tap(find.text('Dark'));
    await tester.pumpAndSettle();
44
    app = find.byType(MaterialApp).evaluate().first.widget as MaterialApp;
45 46 47 48 49 50 51
    expect(app.themeMode, ThemeMode.dark);

    // Switch to the light theme: first menu button, choose 'Light'
    await tester.tap(find.byIcon(Icons.arrow_drop_down).first);
    await tester.pumpAndSettle();
    await tester.tap(find.text('Light'));
    await tester.pumpAndSettle();
52
    app = find.byType(MaterialApp).evaluate().first.widget as MaterialApp;
53 54 55 56 57
    expect(app.themeMode, ThemeMode.light);

    // Switch back to system theme setting: first menu button, choose 'System Default'
    await tester.tap(find.byIcon(Icons.arrow_drop_down).first);
    await tester.pumpAndSettle();
58 59 60 61
    await tester.tap(find.descendant(
        of: find.byWidgetPredicate((Widget widget) => widget.runtimeType.toString() == 'PopupMenuItem<ThemeMode>'),
        matching: find.text('System Default')
    ));
62
    await tester.pumpAndSettle();
63
    app = find.byType(MaterialApp).evaluate().first.widget as MaterialApp;
64 65
    expect(app.themeMode, ThemeMode.system);

66
    // Verify density settings
67
    expect(app.theme!.visualDensity, equals(VisualDensity.standard));
68 69 70 71 72 73 74

    // Popup the density menu: third menu button, choose 'Compact'
    await tester.tap(find.byIcon(Icons.arrow_drop_down).at(2));
    await tester.pumpAndSettle();
    await tester.tap(find.text('Compact'));
    await tester.pumpAndSettle();
    app = find.byType(MaterialApp).evaluate().first.widget as MaterialApp;
75
    expect(app.theme!.visualDensity, equals(VisualDensity.compact));
76 77 78 79 80 81 82 83 84

    await tester.tap(find.byIcon(Icons.arrow_drop_down).at(2));
    await tester.pumpAndSettle();
    await tester.tap(find.descendant(
        of: find.byWidgetPredicate((Widget widget) => widget.runtimeType.toString() == 'PopupMenuItem<GalleryVisualDensityValue>'),
        matching: find.text('System Default')
    ));
    await tester.pumpAndSettle();
    app = find.byType(MaterialApp).evaluate().first.widget as MaterialApp;
85
    expect(app.theme!.visualDensity, equals(VisualDensity.standard));
86

87
    // Verify platform settings
88
    expect(app.theme!.platform, equals(TargetPlatform.android));
89

90 91
    // Popup the platform menu: fourth menu button, choose 'Cupertino'
    await tester.tap(find.byIcon(Icons.arrow_drop_down).at(3));
92 93 94
    await tester.pumpAndSettle();
    await tester.tap(find.text('Cupertino').at(1));
    await tester.pumpAndSettle();
95
    app = find.byType(MaterialApp).evaluate().first.widget as MaterialApp;
96
    expect(app.theme!.platform, equals(TargetPlatform.iOS));
97 98

    // Verify the font scale.
99 100
    final Size origTextSize = tester.getSize(find.text('Text size'));
    expect(origTextSize, equals(const Size(144.0, 16.0)));
101

102 103
    // Popup the text size menu: second menu button, choose 'Small'
    await tester.tap(find.byIcon(Icons.arrow_drop_down).at(1));
104
    await tester.pumpAndSettle();
105
    await tester.tap(find.text('Small'));
106 107
    await tester.pumpAndSettle();
    Size textSize = tester.getSize(find.text('Text size'));
108
    expect(textSize, equals(within(distance: 0.05, from: const Size(115.2, 13.0))));
109

110
    // Set font scale back to the default.
111
    await tester.tap(find.byIcon(Icons.arrow_drop_down).at(1));
112
    await tester.pumpAndSettle();
113 114 115 116
    await tester.tap(find.descendant(
        of: find.byWidgetPredicate((Widget widget) => widget.runtimeType.toString() == 'PopupMenuItem<GalleryTextScaleValue>'),
        matching: find.text('System Default')
    ));
117 118 119 120
    await tester.pumpAndSettle();
    textSize = tester.getSize(find.text('Text size'));
    expect(textSize, origTextSize);

121
    // Switch to slow animation: second switch control
122
    expect(timeDilation, 1.0);
123
    await tester.tap(find.byType(Switch).at(1));
124
    await tester.pumpAndSettle();
125 126
    expect(timeDilation, greaterThan(1.0));

127 128
    // Restore normal animation: second switch control
    await tester.tap(find.byType(Switch).at(1));
129 130
    await tester.pumpAndSettle();
    expect(timeDilation, 1.0);
131 132 133

    // Send feedback.
    expect(hasFeedback, false);
134 135 136 137

    // Scroll to the end
    await tester.drag(find.text('Text size'), const Offset(0.0, -1000.0));
    await tester.pumpAndSettle();
138
    await tester.tap(find.text('Send feedback'));
139
    await tester.pumpAndSettle();
140 141
    expect(hasFeedback, true);

142
    // Hide the options page
143
    await tester.tap(find.byTooltip('Toggle options page'));
144
    await tester.pumpAndSettle();
145 146
  });
}