clamp_overscrolls_test.dart 6.41 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
// 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/widgets.dart';

// Assuming that the test container is 800x600. The height of the
// viewport's contents is 650.0, the top and bottom text children
// are 100 pixels high and top/left edge of both widgets are visible.
// The top of the bottom widget is at 550 (the top of the top widget
// is at 0). The top of the bottom widget is 500 when it has been
// scrolled completely into view.
Widget buildFrame(ScrollableEdge clampedEdge) {
  return new ClampOverscrolls(
    edge: clampedEdge,
    child: new ScrollableViewport(
      scrollableKey: new UniqueKey(),
      child: new SizedBox(
        height: 650.0,
        child: new Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            new SizedBox(height: 100.0, child: new Text('top')),
25
            new Expanded(child: new Container()),
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
            new SizedBox(height: 100.0, child: new Text('bottom')),
          ]
        )
      )
    )
  );
}

void main() {
  testWidgets('ClampOverscrolls', (WidgetTester tester) async {

    // Scroll the target text widget by offset and then return its origin
    // in global coordinates.
    Future<Point> locationAfterScroll(String target, Offset offset) async {
      await tester.scrollAt(tester.getTopLeft(find.text(target)), offset);
      await tester.pump();
      final RenderBox textBox = tester.renderObject(find.text(target));
      final Point widgetOrigin = textBox.localToGlobal(Point.origin);
      await tester.pump(const Duration(seconds: 1)); // Allow overscroll to settle
      return new Future<Point>.value(widgetOrigin);
    }

48 49 50
    // Each of the blocks below test overscrolling the top and bottom
    // with a value for ClampOverscrolls.edge.

51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
    await tester.pumpWidget(buildFrame(ScrollableEdge.none));
    Point origin = await locationAfterScroll('top', const Offset(0.0, 400.0));
    expect(origin.y, greaterThan(0.0));
    origin = await locationAfterScroll('bottom', const Offset(0.0, -400.0));
    expect(origin.y, lessThan(500.0));


    await tester.pumpWidget(buildFrame(ScrollableEdge.both));
    origin = await locationAfterScroll('top', const Offset(0.0, 400.0));
    expect(origin.y, equals(0.0));
    origin = await locationAfterScroll('bottom', const Offset(0.0, -400.0));
    expect(origin.y, equals(500.0));

    await tester.pumpWidget(buildFrame(ScrollableEdge.leading));
    origin = await locationAfterScroll('top', const Offset(0.0, 400.0));
    expect(origin.y, equals(0.0));
    origin = await locationAfterScroll('bottom', const Offset(0.0, -400.0));
    expect(origin.y, lessThan(500.0));

    await tester.pumpWidget(buildFrame(ScrollableEdge.trailing));
    origin = await locationAfterScroll('top', const Offset(0.0, 400.0));
    expect(origin.y, greaterThan(0.0));
    origin = await locationAfterScroll('bottom', const Offset(0.0, -400.0));
    expect(origin.y, equals(500.0));
  });
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148

  testWidgets('ClampOverscrolls affects scrollOffset not virtualScrollOffset', (WidgetTester tester) async {

    // ClampOverscrolls.edge == ScrollableEdge.none

    await tester.pumpWidget(buildFrame(ScrollableEdge.none));
    StatefulElement statefulElement = tester.element(find.byType(Scrollable));
    ScrollableState scrollable = statefulElement.state;

    await tester.scrollAt(tester.getTopLeft(find.text('top')), const Offset(0.0, 400.0));
    await tester.pump();
    expect(scrollable.scrollOffset, lessThan(0.0));
    expect(scrollable.virtualScrollOffset, equals(scrollable.scrollOffset));
    await tester.pump(const Duration(seconds: 1)); // Allow overscroll to settle

    await tester.scrollAt(tester.getTopLeft(find.text('bottom')), const Offset(0.0, -400.0));
    await tester.pump();
    expect(scrollable.scrollOffset, greaterThan(0.0));
    expect(scrollable.virtualScrollOffset, equals(scrollable.scrollOffset));
    await tester.pump(const Duration(seconds: 1)); // Allow overscroll to settle

    // ClampOverscrolls.edge == ScrollableEdge.both

    await tester.pumpWidget(buildFrame(ScrollableEdge.both));
    statefulElement = tester.element(find.byType(Scrollable));
    scrollable = statefulElement.state;

    await tester.scrollAt(tester.getTopLeft(find.text('top')), const Offset(0.0, 400.0));
    await tester.pump();
    expect(scrollable.scrollOffset, equals(0.0));
    expect(scrollable.virtualScrollOffset, lessThan(0.0));
    await tester.pump(const Duration(seconds: 1)); // Allow overscroll to settle

    await tester.scrollAt(tester.getTopLeft(find.text('bottom')), const Offset(0.0, -400.0));
    await tester.pump();
    expect(scrollable.scrollOffset, equals(50.0));
    expect(scrollable.virtualScrollOffset, greaterThan(50.0));

    // ClampOverscrolls.edge == ScrollableEdge.leading

    await tester.pumpWidget(buildFrame(ScrollableEdge.leading));
    statefulElement = tester.element(find.byType(Scrollable));
    scrollable = statefulElement.state;

    await tester.scrollAt(tester.getTopLeft(find.text('top')), const Offset(0.0, 400.0));
    await tester.pump();
    expect(scrollable.scrollOffset, equals(0.0));
    expect(scrollable.virtualScrollOffset, lessThan(0.0));
    await tester.pump(const Duration(seconds: 1)); // Allow overscroll to settle

    await tester.scrollAt(tester.getTopLeft(find.text('bottom')), const Offset(0.0, -400.0));
    await tester.pump();
    expect(scrollable.scrollOffset, greaterThan(0.0));
    expect(scrollable.virtualScrollOffset, equals(scrollable.scrollOffset));

    // ClampOverscrolls.edge == ScrollableEdge.trailing

    await tester.pumpWidget(buildFrame(ScrollableEdge.trailing));
    statefulElement = tester.element(find.byType(Scrollable));
    scrollable = statefulElement.state;

    await tester.scrollAt(tester.getTopLeft(find.text('top')), const Offset(0.0, 400.0));
    await tester.pump();
    expect(scrollable.scrollOffset, lessThan(0.0));
    expect(scrollable.virtualScrollOffset, equals(scrollable.scrollOffset));
    expect(scrollable.virtualScrollOffset, equals(scrollable.scrollOffset));
    await tester.pump(const Duration(seconds: 1)); // Allow overscroll to settle

    await tester.scrollAt(tester.getTopLeft(find.text('bottom')), const Offset(0.0, -400.0));
    await tester.pump();
    expect(scrollable.scrollOffset, equals(50.0));
    expect(scrollable.virtualScrollOffset, greaterThan(50.0));
  });
149
}