import 'package:sky/widgets.dart'; import 'package:test/test.dart'; import 'widget_tester.dart'; class TestComponent extends StatefulComponent { TestComponent(this.viewport); HomogeneousViewport viewport; void syncConstructorArguments(TestComponent source) { viewport = source.viewport; } bool _flag = true; void go(bool flag) { setState(() { _flag = flag; }); } Widget build() { return _flag ? viewport : new Text('Not Today'); } } void main() { test('HomogeneousViewport mount/dismount smoke test', () { WidgetTester tester = new WidgetTester(); List callbackTracker = []; // the root view is 800x600 in the test environment // so if our widget is 100 pixels tall, it should fit exactly 6 times. TestComponent testComponent; Widget builder() { testComponent = new TestComponent(new HomogeneousViewport( builder: (int start, int count) { List result = []; for (int index = start; index < start + count; index += 1) { callbackTracker.add(index); result.add(new Container( key: new ValueKey(index), height: 100.0, child: new Text("$index") )); } return result; }, startOffset: 0.0, itemExtent: 100.0 )); return testComponent; } tester.pumpFrame(builder); expect(callbackTracker, equals([0, 1, 2, 3, 4, 5])); callbackTracker.clear(); testComponent.go(false); tester.pumpFrameWithoutChange(); expect(callbackTracker, equals([])); callbackTracker.clear(); testComponent.go(true); tester.pumpFrameWithoutChange(); expect(callbackTracker, equals([0, 1, 2, 3, 4, 5])); }); test('HomogeneousViewport vertical', () { WidgetTester tester = new WidgetTester(); List callbackTracker = []; // the root view is 800x600 in the test environment // so if our widget is 200 pixels tall, it should fit exactly 3 times. // but if we are offset by 300 pixels, there will be 4, numbered 1-4. double offset = 300.0; ListBuilder itemBuilder = (int start, int count) { List result = []; for (int index = start; index < start + count; index += 1) { callbackTracker.add(index); result.add(new Container( key: new ValueKey(index), width: 500.0, // this should be ignored height: 400.0, // should be overridden by itemExtent child: new Text("$index") )); } return result; }; TestComponent testComponent; Widget builder() { testComponent = new TestComponent(new HomogeneousViewport( builder: itemBuilder, startOffset: offset, itemExtent: 200.0 )); return testComponent; } tester.pumpFrame(builder); expect(callbackTracker, equals([1, 2, 3, 4])); callbackTracker.clear(); offset = 400.0; // now only 3 should fit, numbered 2-4. tester.pumpFrame(builder); expect(callbackTracker, equals([2, 3, 4])); callbackTracker.clear(); }); test('HomogeneousViewport horizontal', () { WidgetTester tester = new WidgetTester(); List callbackTracker = []; // the root view is 800x600 in the test environment // so if our widget is 200 pixels wide, it should fit exactly 4 times. // but if we are offset by 300 pixels, there will be 5, numbered 1-5. double offset = 300.0; ListBuilder itemBuilder = (int start, int count) { List result = []; for (int index = start; index < start + count; index += 1) { callbackTracker.add(index); result.add(new Container( key: new ValueKey(index), width: 400.0, // this should be overridden by itemExtent height: 500.0, // this should be ignored child: new Text("$index") )); } return result; }; TestComponent testComponent; Widget builder() { testComponent = new TestComponent(new HomogeneousViewport( builder: itemBuilder, startOffset: offset, itemExtent: 200.0, direction: ScrollDirection.horizontal )); return testComponent; } tester.pumpFrame(builder); expect(callbackTracker, equals([1, 2, 3, 4, 5])); callbackTracker.clear(); offset = 400.0; // now only 4 should fit, numbered 2-5. tester.pumpFrame(builder); expect(callbackTracker, equals([2, 3, 4, 5])); callbackTracker.clear(); }); }