remember_scroll_position_test.dart 4.35 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';
6
import 'package:flutter/material.dart';
Ian Hickson's avatar
Ian Hickson committed
7 8
import 'package:test/test.dart';

9 10 11 12 13 14 15 16 17 18 19
class ThePositiveNumbers extends StatelessComponent {
  Widget build(BuildContext context) {
    return new ScrollableLazyList(
      itemExtent: 100.0,
      itemBuilder: (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;
      }
    );
Ian Hickson's avatar
Ian Hickson committed
20 21 22 23 24 25 26 27 28
  }
}

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

      // 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);

50 51
      StatefulComponentElement<ScrollableLazyList, ScrollableState<ScrollableLazyList>> target =
        tester.findElement((Element element) => element.widget is ScrollableLazyList);
Ian Hickson's avatar
Ian Hickson committed
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
      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
70 71 72
      navigatorKey.currentState.openTransaction(
        (NavigatorTransaction transaction) => transaction.pushNamed('/second')
      );
Ian Hickson's avatar
Ian Hickson committed
73 74 75 76 77 78 79 80 81 82 83 84 85 86
      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
87 88 89
      navigatorKey.currentState.openTransaction(
        (NavigatorTransaction transaction) => transaction.pop()
      );
Ian Hickson's avatar
Ian Hickson committed
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
      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
107

Ian Hickson's avatar
Ian Hickson committed
108 109 110
    });
  });
}