| import 'package:sky/widgets.dart'; |
| import 'package:test/test.dart'; |
| |
| import 'widget_tester.dart'; |
| |
| class TestComponent extends StatefulComponent { |
| TestComponent(this.viewport); |
| MixedViewport 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('MixedViewport mount/dismount smoke test', () { |
| WidgetTester tester = new WidgetTester(); |
| |
| MixedViewportLayoutState layoutState = new MixedViewportLayoutState(); |
| |
| List<int> callbackTracker = <int>[]; |
| |
| // 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 MixedViewport( |
| builder: (int i) { |
| callbackTracker.add(i); |
| return new Container( |
| key: new ValueKey<int>(i), |
| height: 100.0, |
| child: new Text("$i") |
| ); |
| }, |
| startOffset: 0.0, |
| layoutState: layoutState |
| )); |
| 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('MixedViewport vertical', () { |
| WidgetTester tester = new WidgetTester(); |
| |
| MixedViewportLayoutState layoutState = new MixedViewportLayoutState(); |
| |
| List<int> callbackTracker = <int>[]; |
| |
| // 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; |
| |
| IndexedBuilder itemBuilder = (int i) { |
| callbackTracker.add(i); |
| return new Container( |
| key: new ValueKey<int>(i), |
| width: 500.0, // this should be ignored |
| height: 200.0, |
| child: new Text("$i") |
| ); |
| }; |
| |
| TestComponent testComponent; |
| Widget builder() { |
| testComponent = new TestComponent(new MixedViewport( |
| builder: itemBuilder, |
| startOffset: offset, |
| layoutState: layoutState |
| )); |
| return testComponent; |
| } |
| |
| tester.pumpFrame(builder); |
| |
| // 0 is built to find its width |
| expect(callbackTracker, equals([0, 1, 2, 3, 4])); |
| |
| callbackTracker.clear(); |
| |
| offset = 400.0; // now only 3 should fit, numbered 2-4. |
| |
| tester.pumpFrame(builder); |
| |
| // 0 and 1 aren't built, we know their size and nothing else changed |
| expect(callbackTracker, equals([2, 3, 4])); |
| |
| callbackTracker.clear(); |
| |
| }); |
| |
| test('MixedViewport horizontal', () { |
| WidgetTester tester = new WidgetTester(); |
| |
| MixedViewportLayoutState layoutState = new MixedViewportLayoutState(); |
| |
| List<int> callbackTracker = <int>[]; |
| |
| // 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; |
| |
| IndexedBuilder itemBuilder = (int i) { |
| callbackTracker.add(i); |
| return new Container( |
| key: new ValueKey<int>(i), |
| height: 500.0, // this should be ignored |
| width: 200.0, |
| child: new Text("$i") |
| ); |
| }; |
| |
| TestComponent testComponent; |
| Widget builder() { |
| testComponent = new TestComponent(new MixedViewport( |
| builder: itemBuilder, |
| startOffset: offset, |
| layoutState: layoutState, |
| direction: ScrollDirection.horizontal |
| )); |
| return testComponent; |
| } |
| |
| tester.pumpFrame(builder); |
| |
| // 0 is built to find its width |
| expect(callbackTracker, equals([0, 1, 2, 3, 4, 5])); |
| |
| callbackTracker.clear(); |
| |
| offset = 400.0; // now only 4 should fit, numbered 2-5. |
| |
| tester.pumpFrame(builder); |
| |
| // 0 and 1 aren't built, we know their size and nothing else changed |
| expect(callbackTracker, equals([2, 3, 4, 5])); |
| |
| callbackTracker.clear(); |
| |
| }); |
| } |