drawer_test.dart 5.8 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() as TestWidgetsFlutterBinding;
12 13 14 15 16 17
  if (binding is LiveTestWidgetsFlutterBinding)
    binding.framePolicy = LiveTestWidgetsFlutterBindingFramePolicy.fullyLive;

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

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

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

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

38 39 40 41 42
    // 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();
43
    app = find.byType(MaterialApp).evaluate().first.widget as MaterialApp;
44 45 46 47 48 49 50
    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();
51
    app = find.byType(MaterialApp).evaluate().first.widget as MaterialApp;
52 53 54 55 56
    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();
57 58 59 60
    await tester.tap(find.descendant(
        of: find.byWidgetPredicate((Widget widget) => widget.runtimeType.toString() == 'PopupMenuItem<ThemeMode>'),
        matching: find.text('System Default')
    ));
61
    await tester.pumpAndSettle();
62
    app = find.byType(MaterialApp).evaluate().first.widget as MaterialApp;
63 64
    expect(app.themeMode, ThemeMode.system);

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

    // 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;
74
    expect(app.theme!.visualDensity, equals(VisualDensity.compact));
75 76 77 78 79 80 81 82 83

    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;
84
    expect(app.theme!.visualDensity, equals(VisualDensity.standard));
85

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

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

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

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

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

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

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

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

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

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