remember_scroll_position_test.dart 4.57 KB
Newer Older
Ian Hickson's avatar
Ian Hickson 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';
Ian Hickson's avatar
Ian Hickson committed
6
import 'package:flutter/animation.dart';
7
import 'package:flutter/material.dart';
Ian Hickson's avatar
Ian Hickson committed
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
import 'package:test/test.dart';

class ThePositiveNumbers extends ScrollableWidgetList {
  ThePositiveNumbers() : super(itemExtent: 100.0);
  ThePositiveNumbersState createState() => new ThePositiveNumbersState();
}

class ThePositiveNumbersState extends ScrollableWidgetListState<ThePositiveNumbers> {

  ScrollBehavior createScrollBehavior() => new UnboundedBehavior();

  int get itemCount => null;

  List<Widget> buildItems(BuildContext context, int start, int count) {
    List<Widget> result = new List<Widget>();
    for (int index = start; index < start + count; index += 1)
      result.add(new Text('$index', key: new ValueKey<int>(index)));
    return result;
  }
}


void main() {
  test('whether we remember our scroll position', () {
    testWidgets((WidgetTester tester) {
      GlobalKey<NavigatorState> navigatorKey = new GlobalKey<NavigatorState>();
      tester.pumpWidget(new Navigator(
        key: navigatorKey,
36
        onGenerateRoute: (RouteSettings settings) {
Adam Barth's avatar
Adam Barth committed
37
          if (settings.name == '/')
38
            return new MaterialPageRoute(builder: (_) => new Container(child: new ThePositiveNumbers()));
Adam Barth's avatar
Adam Barth committed
39
          else if (settings.name == '/second')
40
            return new MaterialPageRoute(builder: (_) => new Container(child: new ThePositiveNumbers()));
Adam Barth's avatar
Adam Barth committed
41
          return null;
Ian Hickson's avatar
Ian Hickson committed
42 43 44 45 46 47 48 49 50 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 76
        }
      ));

      // we're 600 pixels high, each item is 100 pixels high, scroll position is
      // zero, so we should have exactly 6 items, 0..5.
      expect(tester.findText('0'), isNotNull);
      expect(tester.findText('1'), isNotNull);
      expect(tester.findText('2'), isNotNull);
      expect(tester.findText('3'), isNotNull);
      expect(tester.findText('4'), isNotNull);
      expect(tester.findText('5'), isNotNull);
      expect(tester.findText('6'), isNull);
      expect(tester.findText('10'), isNull);
      expect(tester.findText('100'), isNull);

      StatefulComponentElement<ThePositiveNumbers, ThePositiveNumbersState> target =
        tester.findElement((Element element) => element.widget is ThePositiveNumbers);
      target.state.scrollTo(1000.0);
      tester.pump(new Duration(seconds: 1));

      // we're 600 pixels high, each item is 100 pixels high, scroll position is
      // 1000, so we should have exactly 6 items, 10..15.

      expect(tester.findText('0'), isNull);
      expect(tester.findText('8'), isNull);
      expect(tester.findText('9'), isNull);
      expect(tester.findText('10'), isNotNull);
      expect(tester.findText('11'), isNotNull);
      expect(tester.findText('12'), isNotNull);
      expect(tester.findText('13'), isNotNull);
      expect(tester.findText('14'), isNotNull);
      expect(tester.findText('15'), isNotNull);
      expect(tester.findText('16'), isNull);
      expect(tester.findText('100'), isNull);

Hixie's avatar
Hixie committed
77 78 79
      navigatorKey.currentState.openTransaction(
        (NavigatorTransaction transaction) => transaction.pushNamed('/second')
      );
Ian Hickson's avatar
Ian Hickson committed
80 81 82 83 84 85 86 87 88 89 90 91 92 93
      tester.pump(); // navigating always takes two frames
      tester.pump(new Duration(seconds: 1));

      // same as the first list again
      expect(tester.findText('0'), isNotNull);
      expect(tester.findText('1'), isNotNull);
      expect(tester.findText('2'), isNotNull);
      expect(tester.findText('3'), isNotNull);
      expect(tester.findText('4'), isNotNull);
      expect(tester.findText('5'), isNotNull);
      expect(tester.findText('6'), isNull);
      expect(tester.findText('10'), isNull);
      expect(tester.findText('100'), isNull);

Hixie's avatar
Hixie committed
94 95 96
      navigatorKey.currentState.openTransaction(
        (NavigatorTransaction transaction) => transaction.pop()
      );
Ian Hickson's avatar
Ian Hickson committed
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
      tester.pump(); // navigating always takes two frames
      tester.pump(new Duration(seconds: 1));

      // we're 600 pixels high, each item is 100 pixels high, scroll position is
      // 1000, so we should have exactly 6 items, 10..15.

      expect(tester.findText('0'), isNull);
      expect(tester.findText('8'), isNull);
      expect(tester.findText('9'), isNull);
      expect(tester.findText('10'), isNotNull);
      expect(tester.findText('11'), isNotNull);
      expect(tester.findText('12'), isNotNull);
      expect(tester.findText('13'), isNotNull);
      expect(tester.findText('14'), isNotNull);
      expect(tester.findText('15'), isNotNull);
      expect(tester.findText('16'), isNull);
      expect(tester.findText('100'), isNull);
Adam Barth's avatar
Adam Barth committed
114

Ian Hickson's avatar
Ian Hickson committed
115 116 117
    });
  });
}