From c308cfbf1e498f028314b103d468ef7500c0d9ef Mon Sep 17 00:00:00 2001 From: Hixie Date: Fri, 28 Aug 2015 16:54:44 -0700 Subject: [PATCH] Test MixedViewport add/remove/add smoketest basic vertical behaviour basic horizontal behaviour --- sky/unit/test/widget/mixed_viewport_test.dart | 172 ++++++++++++++++++ sky/unit/test/widget/widget_tester.dart | 4 + 2 files changed, 176 insertions(+) create mode 100644 sky/unit/test/widget/mixed_viewport_test.dart diff --git a/sky/unit/test/widget/mixed_viewport_test.dart b/sky/unit/test/widget/mixed_viewport_test.dart new file mode 100644 index 00000000000..2d5069fbaf4 --- /dev/null +++ b/sky/unit/test/widget/mixed_viewport_test.dart @@ -0,0 +1,172 @@ +import 'package:sky/widgets.dart'; +import 'package:test/test.dart'; +import 'package:quiver/testing/async.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 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 MixedViewport( + builder: (int i) { + callbackTracker.add(i); + return new Container( + key: new ValueKey(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 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; + + IndexedBuilder itemBuilder = (int i) { + callbackTracker.add(i); + return new Container( + key: new ValueKey(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 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; + + IndexedBuilder itemBuilder = (int i) { + callbackTracker.add(i); + return new Container( + key: new ValueKey(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(); + + }); +} diff --git a/sky/unit/test/widget/widget_tester.dart b/sky/unit/test/widget/widget_tester.dart index 501627c4632..3d610c3c881 100644 --- a/sky/unit/test/widget/widget_tester.dart +++ b/sky/unit/test/widget/widget_tester.dart @@ -123,4 +123,8 @@ class WidgetTester { scheduler.beginFrame(frameTimeMs); } + void pumpFrameWithoutChange([double frameTimeMs = 0.0]) { + scheduler.beginFrame(frameTimeMs); + } + }