safe_area_test.dart 7.04 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1 2 3 4 5 6 7 8 9
// 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/rendering.dart';
import 'package:flutter/widgets.dart';

void main() {
10 11 12 13
  group('SafeArea', () {
    testWidgets('SafeArea - basic', (WidgetTester tester) async {
      await tester.pumpWidget(
        const MediaQuery(
14 15
          data: MediaQueryData(padding: EdgeInsets.all(20.0)),
          child: SafeArea(
16
            left: false,
17
            child: Placeholder(),
18 19 20 21 22 23 24
          ),
        ),
      );
      expect(tester.getTopLeft(find.byType(Placeholder)), const Offset(0.0, 20.0));
      expect(tester.getBottomRight(find.byType(Placeholder)), const Offset(780.0, 580.0));
    });

25 26 27
    testWidgets('SafeArea - with minimums', (WidgetTester tester) async {
      await tester.pumpWidget(
        const MediaQuery(
28 29
          data: MediaQueryData(padding: EdgeInsets.all(20.0)),
          child: SafeArea(
30
            top: false,
31 32
            minimum: EdgeInsets.fromLTRB(0.0, 10.0, 20.0, 30.0),
            child: Placeholder(),
33 34 35 36 37 38 39
          ),
        ),
      );
      expect(tester.getTopLeft(find.byType(Placeholder)), const Offset(20.0, 10.0));
      expect(tester.getBottomRight(find.byType(Placeholder)), const Offset(780.0, 570.0));
    });

40 41 42
    testWidgets('SafeArea - nested', (WidgetTester tester) async {
      await tester.pumpWidget(
        const MediaQuery(
43 44
          data: MediaQueryData(padding: EdgeInsets.all(20.0)),
          child: SafeArea(
45
            top: false,
46
            child: SafeArea(
47
              right: false,
48
              child: Placeholder(),
49 50 51 52 53 54 55 56 57
            ),
          ),
        ),
      );
      expect(tester.getTopLeft(find.byType(Placeholder)), const Offset(20.0, 20.0));
      expect(tester.getBottomRight(find.byType(Placeholder)), const Offset(780.0, 580.0));
    });

    testWidgets('SafeArea - changing', (WidgetTester tester) async {
58
      const Widget child = SafeArea(
59
        bottom: false,
60
        child: SafeArea(
Ian Hickson's avatar
Ian Hickson committed
61
          left: false,
62
          bottom: false,
63
          child: Placeholder(),
Ian Hickson's avatar
Ian Hickson committed
64
        ),
65 66 67
      );
      await tester.pumpWidget(
        const MediaQuery(
68
          data: MediaQueryData(padding: EdgeInsets.all(20.0)),
69 70 71 72 73 74 75
          child: child,
        ),
      );
      expect(tester.getTopLeft(find.byType(Placeholder)), const Offset(20.0, 20.0));
      expect(tester.getBottomRight(find.byType(Placeholder)), const Offset(780.0, 600.0));
      await tester.pumpWidget(
        const MediaQuery(
76
          data: MediaQueryData(padding: EdgeInsets.only(
77 78 79 80 81 82 83 84 85 86 87
            left: 100.0,
            top: 30.0,
            right: 0.0,
            bottom: 40.0,
          )),
          child: child,
        ),
      );
      expect(tester.getTopLeft(find.byType(Placeholder)), const Offset(100.0, 30.0));
      expect(tester.getBottomRight(find.byType(Placeholder)), const Offset(800.0, 600.0));
    });
Ian Hickson's avatar
Ian Hickson committed
88 89
  });

90 91
  group('SliverSafeArea', () {
    Widget buildWidget(EdgeInsets mediaPadding, Widget sliver) {
92 93 94
      return MediaQuery(
        data: MediaQueryData(padding: mediaPadding),
        child: Directionality(
95
          textDirection: TextDirection.ltr,
96 97
          child: Viewport(
            offset: ViewportOffset.fixed(0.0),
98 99
            axisDirection: AxisDirection.down,
            slivers: <Widget>[
100
              const SliverToBoxAdapter(child: SizedBox(width: 800.0, height: 100.0, child: Text('before'))),
101
              sliver,
102
              const SliverToBoxAdapter(child: SizedBox(width: 800.0, height: 100.0, child: Text('after'))),
103
            ],
Ian Hickson's avatar
Ian Hickson committed
104 105
          ),
        ),
106 107 108 109 110 111 112 113
      );
    }

    void verify(WidgetTester tester, List<Rect> expectedRects) {
      final List<Rect> testAnswers = tester.renderObjectList<RenderBox>(find.byType(SizedBox)).map<Rect>(
        (RenderBox target) {
          final Offset topLeft = target.localToGlobal(Offset.zero);
          final Offset bottomRight = target.localToGlobal(target.size.bottomRight(Offset.zero));
114
          return Rect.fromPoints(topLeft, bottomRight);
115 116 117 118 119 120 121 122 123 124 125
        }
      ).toList();
      expect(testAnswers, equals(expectedRects));
    }

    testWidgets('SliverSafeArea - basic', (WidgetTester tester) async {
      await tester.pumpWidget(
        buildWidget(
          const EdgeInsets.all(20.0),
          const SliverSafeArea(
            left: false,
126
            sliver: SliverToBoxAdapter(child: SizedBox(width: 800.0, height: 100.0, child: Text('padded'))),
127 128 129 130
          ),
        ),
      );
      verify(tester, <Rect>[
Dan Field's avatar
Dan Field committed
131 132 133
        const Rect.fromLTWH(0.0, 0.0, 800.0, 100.0),
        const Rect.fromLTWH(0.0, 120.0, 780.0, 100.0),
        const Rect.fromLTWH(0.0, 240.0, 800.0, 100.0),
134 135 136
      ]);
    });

137 138 139 140 141 142
    testWidgets('SliverSafeArea - basic', (WidgetTester tester) async {
      await tester.pumpWidget(
        buildWidget(
          const EdgeInsets.all(20.0),
          const SliverSafeArea(
            top: false,
143 144
            minimum: EdgeInsets.fromLTRB(0.0, 10.0, 20.0, 30.0),
            sliver: SliverToBoxAdapter(child: SizedBox(width: 800.0, height: 100.0, child: Text('padded'))),
145 146 147 148
          ),
        ),
      );
      verify(tester, <Rect>[
Dan Field's avatar
Dan Field committed
149 150 151
        const Rect.fromLTWH(0.0, 0.0, 800.0, 100.0),
        const Rect.fromLTWH(20.0, 110.0, 760.0, 100.0),
        const Rect.fromLTWH(0.0, 240.0, 800.0, 100.0),
152 153 154
      ]);
    });

155 156 157 158 159 160
    testWidgets('SliverSafeArea - nested', (WidgetTester tester) async {
      await tester.pumpWidget(
        buildWidget(
          const EdgeInsets.all(20.0),
          const SliverSafeArea(
            top: false,
161
            sliver: SliverSafeArea(
162
              right: false,
163
              sliver: SliverToBoxAdapter(child: SizedBox(width: 800.0, height: 100.0, child: Text('padded'))),
164 165 166 167 168
            ),
          ),
        ),
      );
      verify(tester, <Rect>[
Dan Field's avatar
Dan Field committed
169 170 171
        const Rect.fromLTWH(0.0, 0.0, 800.0, 100.0),
        const Rect.fromLTWH(20.0, 120.0, 760.0, 100.0),
        const Rect.fromLTWH(0.0, 240.0, 800.0, 100.0),
172 173
      ]);
    });
Ian Hickson's avatar
Ian Hickson committed
174

175
    testWidgets('SliverSafeArea - changing', (WidgetTester tester) async {
176
      const Widget sliver = SliverSafeArea(
Ian Hickson's avatar
Ian Hickson committed
177
        bottom: false,
178
        sliver: SliverSafeArea(
179 180
          left: false,
          bottom: false,
181
          sliver: SliverToBoxAdapter(child: SizedBox(width: 800.0, height: 100.0, child: Text('padded'))),
182 183 184 185 186 187 188 189 190
        ),
      );
      await tester.pumpWidget(
        buildWidget(
          const EdgeInsets.all(20.0),
          sliver,
        ),
      );
      verify(tester, <Rect>[
Dan Field's avatar
Dan Field committed
191 192 193
        const Rect.fromLTWH(0.0, 0.0, 800.0, 100.0),
        const Rect.fromLTWH(20.0, 120.0, 760.0, 100.0),
        const Rect.fromLTWH(0.0, 220.0, 800.0, 100.0),
194 195 196 197 198 199 200 201 202 203 204 205 206 207
      ]);

      await tester.pumpWidget(
        buildWidget(
          const EdgeInsets.only(
            left: 100.0,
            top: 30.0,
            right: 0.0,
            bottom: 40.0,
          ),
          sliver,
        ),
      );
      verify(tester, <Rect>[
Dan Field's avatar
Dan Field committed
208 209 210
        const Rect.fromLTWH(0.0, 0.0, 800.0, 100.0),
        const Rect.fromLTWH(100.0, 130.0, 700.0, 100.0),
        const Rect.fromLTWH(0.0, 230.0, 800.0, 100.0),
211 212
      ]);
    });
Ian Hickson's avatar
Ian Hickson committed
213 214
  });
}