block_test.dart 3.72 KB
Newer Older
Hixie's avatar
Hixie committed
1 2 3 4
// 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.

Adam Barth's avatar
Adam Barth committed
5
import 'package:flutter_test/flutter_test.dart';
6
import 'package:flutter/widgets.dart';
Hixie's avatar
Hixie committed
7 8 9 10

final Key blockKey = new Key('test');

void main() {
11 12
  testWidgets('Cannot scroll a non-overflowing block', (WidgetTester tester) async {
    await tester.pumpWidget(
13 14 15 16 17 18 19 20 21 22 23 24 25
      new Block(
        key: blockKey,
        children: <Widget>[
          new Container(
            height: 200.0, // less than 600, the height of the test area
            child: new Text('Hello')
          )
        ]
      )
    );

    Point middleOfContainer = tester.getCenter(find.text('Hello'));
    Point target = tester.getCenter(find.byKey(blockKey));
26 27
    TestGesture gesture = await tester.startGesture(target);
    await gesture.moveBy(const Offset(0.0, -10.0));
28

29
    await tester.pump(const Duration(milliseconds: 1));
30 31 32

    expect(tester.getCenter(find.text('Hello')) == middleOfContainer, isTrue);

33
    await gesture.up();
Hixie's avatar
Hixie committed
34 35
  });

36 37
  testWidgets('Can scroll an overflowing block', (WidgetTester tester) async {
    await tester.pumpWidget(
38 39 40 41 42 43 44 45 46 47
      new Block(
        key: blockKey,
        children: <Widget>[
          new Container(
            height: 2000.0, // more than 600, the height of the test area
            child: new Text('Hello')
          )
        ]
      )
    );
48

49 50 51
    Point middleOfContainer = tester.getCenter(find.text('Hello'));
    expect(middleOfContainer.x, equals(400.0));
    expect(middleOfContainer.y, equals(1000.0));
52

53
    Point target = tester.getCenter(find.byKey(blockKey));
54 55
    TestGesture gesture = await tester.startGesture(target);
    await gesture.moveBy(const Offset(0.0, -10.0));
56

57
    await tester.pump(); // redo layout
58

59
    expect(tester.getCenter(find.text('Hello')), isNot(equals(middleOfContainer)));
60

61
    await gesture.up();
Hixie's avatar
Hixie committed
62
  });
63

64
  testWidgets('Scroll anchor', (WidgetTester tester) async {
65 66 67 68 69 70 71 72 73 74 75 76 77 78
    int first = 0;
    int second = 0;

    Widget buildBlock(ViewportAnchor scrollAnchor) {
      return new Block(
        key: new UniqueKey(),
        scrollAnchor: scrollAnchor,
        children: <Widget>[
          new GestureDetector(
            onTap: () { ++first; },
            child: new Container(
              height: 2000.0, // more than 600, the height of the test area
              decoration: new BoxDecoration(
                backgroundColor: new Color(0xFF00FF00)
79
              )
80 81 82 83 84 85 86 87
            )
          ),
          new GestureDetector(
            onTap: () { ++second; },
            child: new Container(
              height: 2000.0, // more than 600, the height of the test area
              decoration: new BoxDecoration(
                backgroundColor: new Color(0xFF0000FF)
88 89
              )
            )
90 91 92 93
          )
        ]
      );
    }
94

95
    await tester.pumpWidget(buildBlock(ViewportAnchor.end));
96

97
    Point target = const Point(200.0, 200.0);
98
    await tester.tapAt(target);
99 100
    expect(first, equals(0));
    expect(second, equals(1));
101

102
    await tester.pumpWidget(buildBlock(ViewportAnchor.start));
103

104
    await tester.tapAt(target);
105 106
    expect(first, equals(1));
    expect(second, equals(1));
107
  });
108 109 110 111 112 113 114 115 116 117 118 119 120 121

  testWidgets('Block scrollableKey', (WidgetTester tester) async {
    // Regression test for https://github.com/flutter/flutter/issues/4046
    // The Block's scrollableKey needs to become its Scrollable descendant's key.
    final GlobalKey<ScrollableState<Scrollable>> key = new GlobalKey<ScrollableState<Scrollable>>();
    Widget buildBlock() {
      return new Block(
        scrollableKey: key,
        children: <Widget>[new Text("A"), new Text("B"), new Text("C")]
      );
    }
    await tester.pumpWidget(buildBlock());
    expect(key.currentState.scrollOffset, 0.0);
  });
Hixie's avatar
Hixie committed
122
}