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

9 10 11 12 13 14 15 16
Future<Null> test(WidgetTester tester, double offset, EdgeInsetsGeometry padding, AxisDirection axisDirection, TextDirection textDirection) {
  return tester.pumpWidget(
    new Directionality(
      textDirection: textDirection,
      child: new Viewport(
        offset: new ViewportOffset.fixed(offset),
        axisDirection: axisDirection,
        slivers: <Widget>[
17
          const SliverToBoxAdapter(child: const SizedBox(width: 400.0, height: 400.0, child: const Text('before'))),
18 19
          new SliverPadding(
            padding: padding,
20
            sliver: const SliverToBoxAdapter(child: const SizedBox(width: 400.0, height: 400.0, child: const Text('padded'))),
21
          ),
22
          const SliverToBoxAdapter(child: const SizedBox(width: 400.0, height: 400.0, child: const Text('after'))),
23
        ],
Ian Hickson's avatar
Ian Hickson committed
24
      ),
25
    ),
26
  );
Ian Hickson's avatar
Ian Hickson committed
27 28 29
}

void verify(WidgetTester tester, List<Rect> answerKey) {
30
  final List<Rect> testAnswers = tester.renderObjectList<RenderBox>(find.byType(SizedBox, skipOffstage: false)).map<Rect>(
Ian Hickson's avatar
Ian Hickson committed
31
    (RenderBox target) {
32 33
      final Offset topLeft = target.localToGlobal(Offset.zero);
      final Offset bottomRight = target.localToGlobal(target.size.bottomRight(Offset.zero));
Ian Hickson's avatar
Ian Hickson committed
34 35 36 37 38 39 40
      return new Rect.fromPoints(topLeft, bottomRight);
    }
  ).toList();
  expect(testAnswers, equals(answerKey));
}

void main() {
41
  testWidgets('Viewport+SliverPadding basic test (VISUAL)', (WidgetTester tester) async {
42
    const EdgeInsets padding = const EdgeInsets.fromLTRB(25.0, 20.0, 15.0, 35.0);
43
    await test(tester, 0.0, padding, AxisDirection.down, TextDirection.ltr);
Adam Barth's avatar
Adam Barth committed
44
    expect(tester.renderObject<RenderBox>(find.byType(Viewport)).size, equals(const Size(800.0, 600.0)));
Ian Hickson's avatar
Ian Hickson committed
45 46 47
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, 0.0, 800.0, 400.0),
      new Rect.fromLTWH(25.0, 420.0, 760.0, 400.0),
48
      new Rect.fromLTWH(0.0, 855.0, 800.0, 400.0),
Ian Hickson's avatar
Ian Hickson committed
49 50
    ]);

51
    await test(tester, 200.0, padding, AxisDirection.down, TextDirection.ltr);
Ian Hickson's avatar
Ian Hickson committed
52 53 54
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -200.0, 800.0, 400.0),
      new Rect.fromLTWH(25.0, 220.0, 760.0, 400.0),
55
      new Rect.fromLTWH(0.0, 655.0, 800.0, 400.0),
Ian Hickson's avatar
Ian Hickson committed
56 57
    ]);

58
    await test(tester, 390.0, padding, AxisDirection.down, TextDirection.ltr);
Ian Hickson's avatar
Ian Hickson committed
59 60 61 62 63 64
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -390.0, 800.0, 400.0),
      new Rect.fromLTWH(25.0, 30.0, 760.0, 400.0),
      new Rect.fromLTWH(0.0, 465.0, 800.0, 400.0),
    ]);

65
    await test(tester, 490.0, padding, AxisDirection.down, TextDirection.ltr);
Ian Hickson's avatar
Ian Hickson committed
66 67 68 69 70 71
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -490.0, 800.0, 400.0),
      new Rect.fromLTWH(25.0, -70.0, 760.0, 400.0),
      new Rect.fromLTWH(0.0, 365.0, 800.0, 400.0),
    ]);

72
    await test(tester, 10000.0, padding, AxisDirection.down, TextDirection.ltr);
Ian Hickson's avatar
Ian Hickson committed
73 74 75 76 77 78 79
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -10000.0, 800.0, 400.0),
      new Rect.fromLTWH(25.0, -9580.0, 760.0, 400.0),
      new Rect.fromLTWH(0.0, -9145.0, 800.0, 400.0),
    ]);
  });

80
  testWidgets('Viewport+SliverPadding basic test (LTR)', (WidgetTester tester) async {
81
    const EdgeInsetsDirectional padding = const EdgeInsetsDirectional.fromSTEB(25.0, 20.0, 15.0, 35.0);
82
    await test(tester, 0.0, padding, AxisDirection.down, TextDirection.ltr);
83 84 85 86
    expect(tester.renderObject<RenderBox>(find.byType(Viewport)).size, equals(const Size(800.0, 600.0)));
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, 0.0, 800.0, 400.0),
      new Rect.fromLTWH(25.0, 420.0, 760.0, 400.0),
87
      new Rect.fromLTWH(0.0, 855.0, 800.0, 400.0),
88 89
    ]);

90
    await test(tester, 200.0, padding, AxisDirection.down, TextDirection.ltr);
91 92 93
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -200.0, 800.0, 400.0),
      new Rect.fromLTWH(25.0, 220.0, 760.0, 400.0),
94
      new Rect.fromLTWH(0.0, 655.0, 800.0, 400.0),
95 96
    ]);

97
    await test(tester, 390.0, padding, AxisDirection.down, TextDirection.ltr);
98 99 100 101 102 103
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -390.0, 800.0, 400.0),
      new Rect.fromLTWH(25.0, 30.0, 760.0, 400.0),
      new Rect.fromLTWH(0.0, 465.0, 800.0, 400.0),
    ]);

104
    await test(tester, 490.0, padding, AxisDirection.down, TextDirection.ltr);
105 106 107 108 109 110
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -490.0, 800.0, 400.0),
      new Rect.fromLTWH(25.0, -70.0, 760.0, 400.0),
      new Rect.fromLTWH(0.0, 365.0, 800.0, 400.0),
    ]);

111
    await test(tester, 10000.0, padding, AxisDirection.down, TextDirection.ltr);
112 113 114 115 116 117 118 119
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -10000.0, 800.0, 400.0),
      new Rect.fromLTWH(25.0, -9580.0, 760.0, 400.0),
      new Rect.fromLTWH(0.0, -9145.0, 800.0, 400.0),
    ]);
  });

  testWidgets('Viewport+SliverPadding basic test (RTL)', (WidgetTester tester) async {
120
    const EdgeInsetsDirectional padding = const EdgeInsetsDirectional.fromSTEB(25.0, 20.0, 15.0, 35.0);
121
    await test(tester, 0.0, padding, AxisDirection.down, TextDirection.rtl);
122 123 124 125
    expect(tester.renderObject<RenderBox>(find.byType(Viewport)).size, equals(const Size(800.0, 600.0)));
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, 0.0, 800.0, 400.0),
      new Rect.fromLTWH(15.0, 420.0, 760.0, 400.0),
126
      new Rect.fromLTWH(0.0, 855.0, 800.0, 400.0),
127 128
    ]);

129
    await test(tester, 200.0, padding, AxisDirection.down, TextDirection.rtl);
130 131 132
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -200.0, 800.0, 400.0),
      new Rect.fromLTWH(15.0, 220.0, 760.0, 400.0),
133
      new Rect.fromLTWH(0.0, 655.0, 800.0, 400.0),
134 135
    ]);

136
    await test(tester, 390.0, padding, AxisDirection.down, TextDirection.rtl);
137 138 139 140 141 142
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -390.0, 800.0, 400.0),
      new Rect.fromLTWH(15.0, 30.0, 760.0, 400.0),
      new Rect.fromLTWH(0.0, 465.0, 800.0, 400.0),
    ]);

143
    await test(tester, 490.0, padding, AxisDirection.down, TextDirection.rtl);
144 145 146 147 148 149
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -490.0, 800.0, 400.0),
      new Rect.fromLTWH(15.0, -70.0, 760.0, 400.0),
      new Rect.fromLTWH(0.0, 365.0, 800.0, 400.0),
    ]);

150
    await test(tester, 10000.0, padding, AxisDirection.down, TextDirection.rtl);
151 152 153 154 155 156 157
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -10000.0, 800.0, 400.0),
      new Rect.fromLTWH(15.0, -9580.0, 760.0, 400.0),
      new Rect.fromLTWH(0.0, -9145.0, 800.0, 400.0),
    ]);
  });

Adam Barth's avatar
Adam Barth committed
158
  testWidgets('Viewport+SliverPadding hit testing', (WidgetTester tester) async {
159
    const EdgeInsets padding = const EdgeInsets.all(30.0);
160
    await test(tester, 350.0, padding, AxisDirection.down, TextDirection.ltr);
Adam Barth's avatar
Adam Barth committed
161
    expect(tester.renderObject<RenderBox>(find.byType(Viewport)).size, equals(const Size(800.0, 600.0)));
Ian Hickson's avatar
Ian Hickson committed
162 163 164 165 166 167
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, -350.0, 800.0, 400.0),
      new Rect.fromLTWH(30.0, 80.0, 740.0, 400.0),
      new Rect.fromLTWH(0.0, 510.0, 800.0, 400.0),
    ]);
    HitTestResult result;
168
    result = tester.hitTestOnBinding(const Offset(10.0, 10.0));
Ian Hickson's avatar
Ian Hickson committed
169
    expect(result.path.first.target, tester.firstRenderObject<RenderObject>(find.byType(Text)));
170
    result = tester.hitTestOnBinding(const Offset(10.0, 60.0));
171
    expect(result.path.first.target, isInstanceOf<RenderView>());
172
    result = tester.hitTestOnBinding(const Offset(100.0, 100.0));
Ian Hickson's avatar
Ian Hickson committed
173
    expect(result.path.first.target, tester.renderObjectList<RenderObject>(find.byType(Text)).skip(1).first);
174
    result = tester.hitTestOnBinding(const Offset(100.0, 490.0));
175
    expect(result.path.first.target, isInstanceOf<RenderView>());
176
    result = tester.hitTestOnBinding(const Offset(10.0, 520.0));
Ian Hickson's avatar
Ian Hickson committed
177 178 179
    expect(result.path.first.target, tester.renderObjectList<RenderObject>(find.byType(Text)).last);
  });

Adam Barth's avatar
Adam Barth committed
180
  testWidgets('Viewport+SliverPadding hit testing up', (WidgetTester tester) async {
181
    const EdgeInsets padding = const EdgeInsets.all(30.0);
182
    await test(tester, 350.0, padding, AxisDirection.up, TextDirection.ltr);
Adam Barth's avatar
Adam Barth committed
183
    expect(tester.renderObject<RenderBox>(find.byType(Viewport)).size, equals(const Size(800.0, 600.0)));
Ian Hickson's avatar
Ian Hickson committed
184 185 186 187 188 189
    verify(tester, <Rect>[
      new Rect.fromLTWH(0.0, 600.0+350.0-400.0, 800.0, 400.0),
      new Rect.fromLTWH(30.0, 600.0-80.0-400.0, 740.0, 400.0),
      new Rect.fromLTWH(0.0, 600.0-510.0-400.0, 800.0, 400.0),
    ]);
    HitTestResult result;
190
    result = tester.hitTestOnBinding(const Offset(10.0, 600.0-10.0));
Ian Hickson's avatar
Ian Hickson committed
191
    expect(result.path.first.target, tester.firstRenderObject<RenderObject>(find.byType(Text)));
192
    result = tester.hitTestOnBinding(const Offset(10.0, 600.0-60.0));
193
    expect(result.path.first.target, isInstanceOf<RenderView>());
194
    result = tester.hitTestOnBinding(const Offset(100.0, 600.0-100.0));
Ian Hickson's avatar
Ian Hickson committed
195
    expect(result.path.first.target, tester.renderObjectList<RenderObject>(find.byType(Text)).skip(1).first);
196
    result = tester.hitTestOnBinding(const Offset(100.0, 600.0-490.0));
197
    expect(result.path.first.target, isInstanceOf<RenderView>());
198
    result = tester.hitTestOnBinding(const Offset(10.0, 600.0-520.0));
Ian Hickson's avatar
Ian Hickson committed
199 200 201
    expect(result.path.first.target, tester.renderObjectList<RenderObject>(find.byType(Text)).last);
  });

Adam Barth's avatar
Adam Barth committed
202
  testWidgets('Viewport+SliverPadding hit testing left', (WidgetTester tester) async {
203
    const EdgeInsets padding = const EdgeInsets.all(30.0);
204
    await test(tester, 350.0, padding, AxisDirection.left, TextDirection.ltr);
Adam Barth's avatar
Adam Barth committed
205
    expect(tester.renderObject<RenderBox>(find.byType(Viewport)).size, equals(const Size(800.0, 600.0)));
Ian Hickson's avatar
Ian Hickson committed
206 207 208 209 210 211
    verify(tester, <Rect>[
      new Rect.fromLTWH(800.0+350.0-400.0, 0.0, 400.0, 600.0),
      new Rect.fromLTWH(800.0-80.0-400.0, 30.0, 400.0, 540.0),
      new Rect.fromLTWH(800.0-510.0-400.0, 0.0, 400.0, 600.0),
    ]);
    HitTestResult result;
212
    result = tester.hitTestOnBinding(const Offset(800.0-10.0, 10.0));
Ian Hickson's avatar
Ian Hickson committed
213
    expect(result.path.first.target, tester.firstRenderObject<RenderObject>(find.byType(Text)));
214
    result = tester.hitTestOnBinding(const Offset(800.0-60.0, 10.0));
215
    expect(result.path.first.target, isInstanceOf<RenderView>());
216
    result = tester.hitTestOnBinding(const Offset(800.0-100.0, 100.0));
Ian Hickson's avatar
Ian Hickson committed
217
    expect(result.path.first.target, tester.renderObjectList<RenderObject>(find.byType(Text)).skip(1).first);
218
    result = tester.hitTestOnBinding(const Offset(800.0-490.0, 100.0));
219
    expect(result.path.first.target, isInstanceOf<RenderView>());
220
    result = tester.hitTestOnBinding(const Offset(800.0-520.0, 10.0));
Ian Hickson's avatar
Ian Hickson committed
221 222 223
    expect(result.path.first.target, tester.renderObjectList<RenderObject>(find.byType(Text)).last);
  });

Adam Barth's avatar
Adam Barth committed
224
  testWidgets('Viewport+SliverPadding hit testing right', (WidgetTester tester) async {
225
    const EdgeInsets padding = const EdgeInsets.all(30.0);
226
    await test(tester, 350.0, padding, AxisDirection.right, TextDirection.ltr);
Adam Barth's avatar
Adam Barth committed
227
    expect(tester.renderObject<RenderBox>(find.byType(Viewport)).size, equals(const Size(800.0, 600.0)));
Ian Hickson's avatar
Ian Hickson committed
228 229 230 231 232 233
    verify(tester, <Rect>[
      new Rect.fromLTWH(-350.0, 0.0, 400.0, 600.0),
      new Rect.fromLTWH(80.0, 30.0, 400.0, 540.0),
      new Rect.fromLTWH(510.0, 0.0, 400.0, 600.0),
    ]);
    HitTestResult result;
234
    result = tester.hitTestOnBinding(const Offset(10.0, 10.0));
Ian Hickson's avatar
Ian Hickson committed
235
    expect(result.path.first.target, tester.firstRenderObject<RenderObject>(find.byType(Text)));
236
    result = tester.hitTestOnBinding(const Offset(60.0, 10.0));
237
    expect(result.path.first.target, isInstanceOf<RenderView>());
238
    result = tester.hitTestOnBinding(const Offset(100.0, 100.0));
Ian Hickson's avatar
Ian Hickson committed
239
    expect(result.path.first.target, tester.renderObjectList<RenderObject>(find.byType(Text)).skip(1).first);
240
    result = tester.hitTestOnBinding(const Offset(490.0, 100.0));
241
    expect(result.path.first.target, isInstanceOf<RenderView>());
242
    result = tester.hitTestOnBinding(const Offset(520.0, 10.0));
Ian Hickson's avatar
Ian Hickson committed
243 244 245
    expect(result.path.first.target, tester.renderObjectList<RenderObject>(find.byType(Text)).last);
  });

Adam Barth's avatar
Adam Barth committed
246
  testWidgets('Viewport+SliverPadding no child', (WidgetTester tester) async {
247 248 249 250 251
    await tester.pumpWidget(
      new Directionality(
        textDirection: TextDirection.ltr,
        child: new Viewport(
          offset: new ViewportOffset.fixed(0.0),
252
          slivers: const <Widget>[
253 254
            const SliverPadding(padding: const EdgeInsets.all(100.0)),
            const SliverToBoxAdapter(child: const SizedBox(width: 400.0, height: 400.0, child: const Text('x'))),
255 256 257 258
          ],
        ),
      ),
    );
259
    expect(tester.renderObject<RenderBox>(find.text('x')).localToGlobal(Offset.zero), const Offset(0.0, 200.0));
Ian Hickson's avatar
Ian Hickson committed
260 261
  });

Adam Barth's avatar
Adam Barth committed
262
  testWidgets('Viewport+SliverPadding changing padding', (WidgetTester tester) async {
263 264 265 266 267 268
    await tester.pumpWidget(
      new Directionality(
        textDirection: TextDirection.ltr,
        child: new Viewport(
          axisDirection: AxisDirection.left,
          offset: new ViewportOffset.fixed(0.0),
269
          slivers: const <Widget>[
270 271
            const SliverPadding(padding: const EdgeInsets.fromLTRB(90.0, 1.0, 110.0, 2.0)),
            const SliverToBoxAdapter(child: const SizedBox(width: 201.0, child: const Text('x'))),
272 273 274 275
          ],
        ),
      ),
    );
276
    expect(tester.renderObject<RenderBox>(find.text('x')).localToGlobal(Offset.zero), const Offset(399.0, 0.0));
277 278 279 280 281 282
    await tester.pumpWidget(
      new Directionality(
        textDirection: TextDirection.ltr,
        child: new Viewport(
          axisDirection: AxisDirection.left,
          offset: new ViewportOffset.fixed(0.0),
283
          slivers: const <Widget>[
284 285
            const SliverPadding(padding: const EdgeInsets.fromLTRB(110.0, 1.0, 80.0, 2.0)),
            const SliverToBoxAdapter(child: const SizedBox(width: 201.0, child: const Text('x'))),
286 287 288 289
          ],
        ),
      ),
    );
290
    expect(tester.renderObject<RenderBox>(find.text('x')).localToGlobal(Offset.zero), const Offset(409.0, 0.0));
Ian Hickson's avatar
Ian Hickson committed
291 292
  });

Adam Barth's avatar
Adam Barth committed
293
  testWidgets('Viewport+SliverPadding changing direction', (WidgetTester tester) async {
294 295 296 297 298 299
    await tester.pumpWidget(
      new Directionality(
        textDirection: TextDirection.ltr,
        child: new Viewport(
          axisDirection: AxisDirection.up,
          offset: new ViewportOffset.fixed(0.0),
300
          slivers: const <Widget>[
301
            const SliverPadding(padding: const EdgeInsets.fromLTRB(1.0, 2.0, 4.0, 8.0)),
302 303 304 305
          ],
        ),
      ),
    );
306
    expect(tester.renderObject<RenderSliverPadding>(find.byType(SliverPadding)).afterPadding, 2.0);
307 308 309 310 311 312
    await tester.pumpWidget(
      new Directionality(
        textDirection: TextDirection.ltr,
        child: new Viewport(
          axisDirection: AxisDirection.down,
          offset: new ViewportOffset.fixed(0.0),
313
          slivers: const <Widget>[
314
            const SliverPadding(padding: const EdgeInsets.fromLTRB(1.0, 2.0, 4.0, 8.0)),
315 316 317 318
          ],
        ),
      ),
    );
319
    expect(tester.renderObject<RenderSliverPadding>(find.byType(SliverPadding)).afterPadding, 8.0);
320 321 322 323 324 325
    await tester.pumpWidget(
      new Directionality(
        textDirection: TextDirection.ltr,
        child: new Viewport(
          axisDirection: AxisDirection.right,
          offset: new ViewportOffset.fixed(0.0),
326
          slivers: const <Widget>[
327
            const SliverPadding(padding: const EdgeInsets.fromLTRB(1.0, 2.0, 4.0, 8.0)),
328 329 330 331
          ],
        ),
      ),
    );
332
    expect(tester.renderObject<RenderSliverPadding>(find.byType(SliverPadding)).afterPadding, 4.0);
333 334 335 336 337 338
    await tester.pumpWidget(
      new Directionality(
        textDirection: TextDirection.ltr,
        child: new Viewport(
          axisDirection: AxisDirection.left,
          offset: new ViewportOffset.fixed(0.0),
339
          slivers: const <Widget>[
340
            const SliverPadding(padding: const EdgeInsets.fromLTRB(1.0, 2.0, 4.0, 8.0)),
341 342 343 344
          ],
        ),
      ),
    );
345
    expect(tester.renderObject<RenderSliverPadding>(find.byType(SliverPadding)).afterPadding, 1.0);
346 347 348 349 350 351
    await tester.pumpWidget(
      new Directionality(
        textDirection: TextDirection.ltr,
        child: new Viewport(
          axisDirection: AxisDirection.left,
          offset: new ViewportOffset.fixed(99999.9),
352
          slivers: const <Widget>[
353
            const SliverPadding(padding: const EdgeInsets.fromLTRB(1.0, 2.0, 4.0, 8.0)),
354 355 356 357
          ],
        ),
      ),
    );
358
    expect(tester.renderObject<RenderSliverPadding>(find.byType(SliverPadding)).afterPadding, 1.0);
Ian Hickson's avatar
Ian Hickson committed
359
  });
360 361 362 363 364 365

  testWidgets('SliverPadding propagates geometry offset corrections', (WidgetTester tester) async {
    Widget listBuilder(IndexedWidgetBuilder sliverChildBuilder) {
      return new Directionality(
        textDirection: TextDirection.ltr,
        child: new CustomScrollView(
366
          cacheExtent: 0.0,
367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425
          slivers: <Widget>[
            new SliverPadding(
              padding: EdgeInsets.zero,
              sliver: new SliverList(
                delegate: new SliverChildBuilderDelegate(
                  sliverChildBuilder,
                  childCount: 10,
                ),
              ),
            ),
          ],
        ),
      );
    }

    await tester.pumpWidget(
      listBuilder(
        (BuildContext context, int index) {
          return new Container(
            height: 200.0,
            child: new Center(
              child: new Text(index.toString()),
            ),
          );
        },
      ),
    );

    await tester.drag(find.text('2'), const Offset(0.0, -300.0));
    await tester.pump();

    expect(
      tester.getRect(find.widgetWithText(Container, '2')),
      new Rect.fromLTRB(0.0, 100.0, 800.0, 300.0),
    );

    // Now item 0 is 400.0px and going back will underflow.
    await tester.pumpWidget(
      listBuilder(
        (BuildContext context, int index) {
          return new Container(
            height: index == 0 ? 400.0 : 200.0,
            child: new Center(
              child: new Text(index.toString()),
            ),
          );
        },
      ),
    );

    await tester.drag(find.text('2'), const Offset(0.0, 300.0));
    // On this one frame, the scroll correction must properly propagate.
    await tester.pump();

    expect(
      tester.getRect(find.widgetWithText(Container, '0')),
      new Rect.fromLTRB(0.0, -200.0, 800.0, 200.0),
    );
  });
Ian Hickson's avatar
Ian Hickson committed
426
}