diff --git a/packages/unit/test/widget/snap_scrolling_test.dart b/packages/unit/test/widget/snap_scrolling_test.dart new file mode 100644 index 0000000000..8a99d46ad6 --- /dev/null +++ b/packages/unit/test/widget/snap_scrolling_test.dart @@ -0,0 +1,87 @@ +// 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. + +import 'package:quiver/testing/async.dart'; +import 'package:sky/src/fn3.dart'; +import 'package:test/test.dart'; + +import '../fn3/widget_tester.dart'; + +const double itemExtent = 200.0; +ScrollDirection scrollDirection = ScrollDirection.vertical; +GlobalKey scrollableListKey; + +Widget buildItem(BuildContext context, int item) { + return new Container( + key: new ValueKey(item), + width: itemExtent, + height: itemExtent, + child: new Text(item.toString()) + ); +} + +double snapOffsetCallback(double offset) { + return (offset / itemExtent).floor() * itemExtent; +} + +Widget buildScrollableList() { + scrollableListKey = new GlobalKey(); + return new Container( + height: itemExtent * 2.0, + child: new ScrollableList( + key: scrollableListKey, + snapOffsetCallback: snapOffsetCallback, + scrollDirection: scrollDirection, + items: [0, 1, 2, 3, 4, 5, 7, 8, 9], + itemBuilder: buildItem, + itemExtent: itemExtent + ) + ); +} + +ScrollableState get scrollableState => scrollableListKey.currentState; + +double get scrollOffset => scrollableState.scrollOffset; +void set scrollOffset(double value) { + scrollableState.scrollTo(value); +} + +void fling(double velocity) { + Offset velocityOffset = scrollDirection == ScrollDirection.vertical + ? new Offset(0.0, velocity) + : new Offset(velocity, 0.0); + scrollableState.fling(velocityOffset); +} + +void main() { + test('ScrollableList snap scrolling, fling(-800)', () { + WidgetTester tester = new WidgetTester(); + + tester.pumpFrame(new Center(child: buildScrollableList())); + expect(scrollOffset, 0.0); + + new FakeAsync().run((async) { + fling(-800.0); + tester.pumpFrameWithoutChange(); // Start the scheduler at 0.0 + tester.pumpFrameWithoutChange(1000.0); + async.elapse(new Duration(seconds: 1)); + expect(scrollOffset, closeTo(200.0, 1.0)); + }); + }); + + test('ScrollableList snap scrolling, fling(-2000)', () { + WidgetTester tester = new WidgetTester(); + + tester.pumpFrame(new Center(child: buildScrollableList())); + expect(scrollOffset, 0.0); + + new FakeAsync().run((async) { + fling(-2000.0); + tester.pumpFrameWithoutChange(); // Start the scheduler at 0.0 + tester.pumpFrameWithoutChange(1000.0); + async.elapse(new Duration(seconds: 1)); + expect(scrollOffset, closeTo(400.0, 1.0)); + }); + }); +}