From db8b4ae64131fb856c898241deb1259fd3f119f2 Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Wed, 30 Sep 2015 18:54:54 -0700 Subject: [PATCH] Consolidate widget tests Now that we've ported all the widget tests to fn3, we don't need a separate fn3 directory. --- sky/packages/sky/lib/animation.dart | 1 - sky/unit/test/fn3/listener_test.dart | 42 ----- sky/unit/test/fn3/widget_tester.dart | 164 ----------------- sky/unit/test/widget/align_test.dart | 2 +- sky/unit/test/widget/block_test.dart | 2 +- sky/unit/test/widget/box_decoration_test.dart | 2 +- sky/unit/test/widget/build_scope_test.dart | 4 +- sky/unit/test/widget/center_test.dart | 2 +- .../{fn3 => widget}/coordinates_test.dart | 0 sky/unit/test/widget/date_picker_test.dart | 2 +- sky/unit/test/widget/dismissable_test.dart | 2 +- sky/unit/test/widget/draggable_test.dart | 2 +- sky/unit/test/widget/duplicate_key_test.dart | 2 +- sky/unit/test/widget/flex_test.dart | 2 +- .../test/widget/gesture_detector_test.dart | 2 +- .../homogeneous_viewport_test.dart | 0 sky/unit/test/widget/input_test.dart | 2 +- sky/unit/test/widget/listener_test.dart | 2 +- .../{fn3 => widget}/mixed_viewport_test.dart | 0 .../test/{fn3 => widget}/multichild_test.dart | 0 sky/unit/test/widget/navigator_test.dart | 2 +- sky/unit/test/widget/pageable_list_test.dart | 2 +- .../{fn3 => widget}/parent_data_test.dart | 0 .../test/widget/progress_indicator_test.dart | 2 +- .../render_object_widget_test.dart | 0 .../scrollable_list_hit_testing_test.dart | 2 +- .../scrollable_list_horizontal_test.dart | 2 +- .../widget/scrollable_list_vertical_test.dart | 2 +- sky/unit/test/widget/set_state_3_test.dart | 2 +- sky/unit/test/widget/set_state_test.dart | 2 +- sky/unit/test/widget/snap_scrolling_test.dart | 2 +- sky/unit/test/widget/stack_test.dart | 2 +- .../stateful_component_test.dart | 0 .../test/widget/stateful_components_test.dart | 2 +- sky/unit/test/widget/syncing_test.dart | 2 +- .../test/{fn3 => widget}/test_widgets.dart | 0 sky/unit/test/widget/transform_test.dart | 2 +- sky/unit/test/widget/widget_tester.dart | 166 ++++++++++-------- 38 files changed, 118 insertions(+), 309 deletions(-) delete mode 100644 sky/unit/test/fn3/listener_test.dart delete mode 100644 sky/unit/test/fn3/widget_tester.dart rename sky/unit/test/{fn3 => widget}/coordinates_test.dart (100%) rename sky/unit/test/{fn3 => widget}/homogeneous_viewport_test.dart (100%) rename sky/unit/test/{fn3 => widget}/mixed_viewport_test.dart (100%) rename sky/unit/test/{fn3 => widget}/multichild_test.dart (100%) rename sky/unit/test/{fn3 => widget}/parent_data_test.dart (100%) rename sky/unit/test/{fn3 => widget}/render_object_widget_test.dart (100%) rename sky/unit/test/{fn3 => widget}/stateful_component_test.dart (100%) rename sky/unit/test/{fn3 => widget}/test_widgets.dart (100%) diff --git a/sky/packages/sky/lib/animation.dart b/sky/packages/sky/lib/animation.dart index f35b2538bb0..4c449e2d97e 100644 --- a/sky/packages/sky/lib/animation.dart +++ b/sky/packages/sky/lib/animation.dart @@ -10,7 +10,6 @@ library animation; export 'src/animation/animated_simulation.dart'; export 'src/animation/animated_value.dart'; export 'src/animation/animation_performance.dart'; -export 'src/animation/clamped_simulation.dart'; export 'src/animation/curves.dart'; export 'src/animation/forces.dart'; export 'src/animation/scheduler.dart'; diff --git a/sky/unit/test/fn3/listener_test.dart b/sky/unit/test/fn3/listener_test.dart deleted file mode 100644 index 19ad382984f..00000000000 --- a/sky/unit/test/fn3/listener_test.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:sky/src/fn3.dart'; -import 'package:test/test.dart'; - -import 'widget_tester.dart'; - -void main() { - test('Events bubble up the tree', () { - WidgetTester tester = new WidgetTester(); - - List log = new List(); - - tester.pumpFrame( - new Listener( - onPointerDown: (_) { - log.add('top'); - }, - child: new Listener( - onPointerDown: (_) { - log.add('middle'); - }, - child: new DecoratedBox( - decoration: const BoxDecoration(), - child: new Listener( - onPointerDown: (_) { - log.add('bottom'); - }, - child: new Text('X') - ) - ) - ) - ) - ); - - tester.tap(tester.findText('X')); - - expect(log, equals([ - 'bottom', - 'middle', - 'top', - ])); - }); -} diff --git a/sky/unit/test/fn3/widget_tester.dart b/sky/unit/test/fn3/widget_tester.dart deleted file mode 100644 index 3ceb9c0d979..00000000000 --- a/sky/unit/test/fn3/widget_tester.dart +++ /dev/null @@ -1,164 +0,0 @@ -import 'dart:sky' as sky; - -import 'package:sky/animation.dart'; -import 'package:sky/rendering.dart'; -import 'package:sky/src/fn3.dart'; - -import '../engine/mock_events.dart'; - -class RootComponent extends StatefulComponent { - RootComponentState createState() => new RootComponentState(); -} - -class RootComponentState extends State { - Widget _child = new DecoratedBox(decoration: new BoxDecoration()); - Widget get child => _child; - void set child(Widget value) { - if (value != _child) { - setState(() { - _child = value; - }); - } - } - Widget build(BuildContext context) => child; -} - -class WidgetTester { - - // See thttps://github.com/flutter/engine/issues/1084 regarding frameTimeMs vs FakeAsync - - void pumpFrame(Widget widget, [ double frameTimeMs = 0.0 ]) { - runApp(widget); - scheduler.beginFrame(frameTimeMs); - } - - void pumpFrameWithoutChange([ double frameTimeMs = 0.0 ]) { - scheduler.beginFrame(frameTimeMs); - } - - void reset() { - runApp(new Container()); - scheduler.beginFrame(0.0); - } - - List _layers(Layer layer) { - List result = [layer]; - if (layer is ContainerLayer) { - ContainerLayer root = layer; - Layer child = root.firstChild; - while(child != null) { - result.addAll(_layers(child)); - child = child.nextSibling; - } - } - return result; - } - List get layers => _layers(FlutterBinding.instance.renderView.layer); - - - void walkElements(ElementVisitor visitor) { - void walk(Element element) { - visitor(element); - element.visitChildren(walk); - } - WidgetFlutterBinding.instance.renderViewElement.visitChildren(walk); - } - - Element findElement(bool predicate(Element element)) { - try { - walkElements((Element element) { - if (predicate(element)) - throw element; - }); - } on Element catch (e) { - return e; - } - return null; - } - - Element findElementByKey(Key key) { - return findElement((Element element) => element.widget.key == key); - } - - Element findText(String text) { - return findElement((Element element) { - return element.widget is Text && element.widget.data == text; - }); - } - - State findStateOfType(Type type) { - StatefulComponentElement element = findElement((Element element) { - return element is StatefulComponentElement && element.state.runtimeType == type; - }); - return element?.state; - } - - State findStateByConfig(Widget config) { - StatefulComponentElement element = findElement((Element element) { - return element is StatefulComponentElement && element.state.config == config; - }); - return element?.state; - } - - Point getCenter(Element element) { - return _getElementPoint(element, (Size size) => size.center(Point.origin)); - } - - Point getTopLeft(Element element) { - return _getElementPoint(element, (_) => Point.origin); - } - - Point getTopRight(Element element) { - return _getElementPoint(element, (Size size) => size.topRight(Point.origin)); - } - - Point getBottomLeft(Element element) { - return _getElementPoint(element, (Size size) => size.bottomLeft(Point.origin)); - } - - Point getBottomRight(Element element) { - return _getElementPoint(element, (Size size) => size.bottomRight(Point.origin)); - } - - Point _getElementPoint(Element element, Function sizeToPoint) { - assert(element != null); - RenderBox box = element.renderObject as RenderBox; - assert(box != null); - return box.localToGlobal(sizeToPoint(box.size)); - } - - - void tap(Element element, { int pointer: 1 }) { - tapAt(getCenter(element), pointer: pointer); - } - - void tapAt(Point location, { int pointer: 1 }) { - HitTestResult result = _hitTest(location); - TestPointer p = new TestPointer(pointer); - _dispatchEvent(p.down(location), result); - _dispatchEvent(p.up(), result); - } - - void scroll(Element element, Offset offset, { int pointer: 1 }) { - Point startLocation = getCenter(element); - Point endLocation = startLocation + offset; - TestPointer p = new TestPointer(pointer); - // Events for the entire press-drag-release gesture are dispatched - // to the widgets "hit" by the pointer down event. - HitTestResult result = _hitTest(startLocation); - _dispatchEvent(p.down(startLocation), result); - _dispatchEvent(p.move(endLocation), result); - _dispatchEvent(p.up(), result); - } - - void dispatchEvent(sky.Event event, Point location) { - _dispatchEvent(event, _hitTest(location)); - } - - HitTestResult _hitTest(Point location) => WidgetFlutterBinding.instance.hitTest(location); - - void _dispatchEvent(sky.Event event, HitTestResult result) { - WidgetFlutterBinding.instance.dispatchEvent(event, result); - } - -} diff --git a/sky/unit/test/widget/align_test.dart b/sky/unit/test/widget/align_test.dart index df330a7bad3..6b7d83bd124 100644 --- a/sky/unit/test/widget/align_test.dart +++ b/sky/unit/test/widget/align_test.dart @@ -1,7 +1,7 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; void main() { test('Align smoke test', () { diff --git a/sky/unit/test/widget/block_test.dart b/sky/unit/test/widget/block_test.dart index 0067240438e..b449a4c6c1d 100644 --- a/sky/unit/test/widget/block_test.dart +++ b/sky/unit/test/widget/block_test.dart @@ -2,7 +2,7 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; import '../engine/mock_events.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; final Key blockKey = new Key('test'); diff --git a/sky/unit/test/widget/box_decoration_test.dart b/sky/unit/test/widget/box_decoration_test.dart index 18df0d35737..8247b542d49 100644 --- a/sky/unit/test/widget/box_decoration_test.dart +++ b/sky/unit/test/widget/box_decoration_test.dart @@ -2,7 +2,7 @@ import 'package:sky/material.dart'; import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; void main() { test('Circles can have uniform borders', () { diff --git a/sky/unit/test/widget/build_scope_test.dart b/sky/unit/test/widget/build_scope_test.dart index 1ae79788bf6..5400ad93f28 100644 --- a/sky/unit/test/widget/build_scope_test.dart +++ b/sky/unit/test/widget/build_scope_test.dart @@ -1,8 +1,8 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; -import '../fn3/test_widgets.dart'; +import 'widget_tester.dart'; +import 'test_widgets.dart'; class ProbeWidget extends StatefulComponent { ProbeWidgetState createState() => new ProbeWidgetState(); diff --git a/sky/unit/test/widget/center_test.dart b/sky/unit/test/widget/center_test.dart index f6ab8e28b0c..d2949f4de36 100644 --- a/sky/unit/test/widget/center_test.dart +++ b/sky/unit/test/widget/center_test.dart @@ -1,7 +1,7 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; void main() { test('Can be placed in an infinte box', () { diff --git a/sky/unit/test/fn3/coordinates_test.dart b/sky/unit/test/widget/coordinates_test.dart similarity index 100% rename from sky/unit/test/fn3/coordinates_test.dart rename to sky/unit/test/widget/coordinates_test.dart diff --git a/sky/unit/test/widget/date_picker_test.dart b/sky/unit/test/widget/date_picker_test.dart index da89ffb6f6b..802dc3d0bef 100644 --- a/sky/unit/test/widget/date_picker_test.dart +++ b/sky/unit/test/widget/date_picker_test.dart @@ -1,7 +1,7 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; void main() { test('Can select a day', () { diff --git a/sky/unit/test/widget/dismissable_test.dart b/sky/unit/test/widget/dismissable_test.dart index 45e2dfd608f..04b1b01c760 100644 --- a/sky/unit/test/widget/dismissable_test.dart +++ b/sky/unit/test/widget/dismissable_test.dart @@ -3,7 +3,7 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; import '../engine/mock_events.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; const double itemExtent = 100.0; ScrollDirection scrollDirection = ScrollDirection.vertical; diff --git a/sky/unit/test/widget/draggable_test.dart b/sky/unit/test/widget/draggable_test.dart index d7a8193bd83..da17e9013eb 100644 --- a/sky/unit/test/widget/draggable_test.dart +++ b/sky/unit/test/widget/draggable_test.dart @@ -2,7 +2,7 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; import '../engine/mock_events.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; void main() { test('Drag and drop - control test', () { diff --git a/sky/unit/test/widget/duplicate_key_test.dart b/sky/unit/test/widget/duplicate_key_test.dart index 13c3679182f..3fe60f13356 100644 --- a/sky/unit/test/widget/duplicate_key_test.dart +++ b/sky/unit/test/widget/duplicate_key_test.dart @@ -1,7 +1,7 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; class Item { GlobalKey key1 = new GlobalKey(); diff --git a/sky/unit/test/widget/flex_test.dart b/sky/unit/test/widget/flex_test.dart index e15635bb665..25471cbbc20 100644 --- a/sky/unit/test/widget/flex_test.dart +++ b/sky/unit/test/widget/flex_test.dart @@ -1,7 +1,7 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; void main() { test('Can hit test flex children of stacks', () { diff --git a/sky/unit/test/widget/gesture_detector_test.dart b/sky/unit/test/widget/gesture_detector_test.dart index 1314bf00581..746ea373835 100644 --- a/sky/unit/test/widget/gesture_detector_test.dart +++ b/sky/unit/test/widget/gesture_detector_test.dart @@ -2,7 +2,7 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; import '../engine/mock_events.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; void main() { test('Uncontested scrolls start immediately', () { diff --git a/sky/unit/test/fn3/homogeneous_viewport_test.dart b/sky/unit/test/widget/homogeneous_viewport_test.dart similarity index 100% rename from sky/unit/test/fn3/homogeneous_viewport_test.dart rename to sky/unit/test/widget/homogeneous_viewport_test.dart diff --git a/sky/unit/test/widget/input_test.dart b/sky/unit/test/widget/input_test.dart index efa929986c0..c816030e966 100644 --- a/sky/unit/test/widget/input_test.dart +++ b/sky/unit/test/widget/input_test.dart @@ -5,7 +5,7 @@ import 'package:sky/services.dart'; import 'package:sky/widgets_next.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; import '../services/mock_services.dart'; class MockKeyboard implements KeyboardService { diff --git a/sky/unit/test/widget/listener_test.dart b/sky/unit/test/widget/listener_test.dart index 9b730f2f0cb..19ad382984f 100644 --- a/sky/unit/test/widget/listener_test.dart +++ b/sky/unit/test/widget/listener_test.dart @@ -1,7 +1,7 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; void main() { test('Events bubble up the tree', () { diff --git a/sky/unit/test/fn3/mixed_viewport_test.dart b/sky/unit/test/widget/mixed_viewport_test.dart similarity index 100% rename from sky/unit/test/fn3/mixed_viewport_test.dart rename to sky/unit/test/widget/mixed_viewport_test.dart diff --git a/sky/unit/test/fn3/multichild_test.dart b/sky/unit/test/widget/multichild_test.dart similarity index 100% rename from sky/unit/test/fn3/multichild_test.dart rename to sky/unit/test/widget/multichild_test.dart diff --git a/sky/unit/test/widget/navigator_test.dart b/sky/unit/test/widget/navigator_test.dart index 7b6ab8925f8..03c53765535 100644 --- a/sky/unit/test/widget/navigator_test.dart +++ b/sky/unit/test/widget/navigator_test.dart @@ -2,7 +2,7 @@ import 'package:sky/animation.dart'; import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; class FirstComponent extends StatelessComponent { FirstComponent(this.navigator); diff --git a/sky/unit/test/widget/pageable_list_test.dart b/sky/unit/test/widget/pageable_list_test.dart index efb79b651c3..a255c63171c 100644 --- a/sky/unit/test/widget/pageable_list_test.dart +++ b/sky/unit/test/widget/pageable_list_test.dart @@ -2,7 +2,7 @@ import 'package:quiver/testing/async.dart'; import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; const Size pageSize = const Size(800.0, 600.0); const List pages = const [0, 1, 2, 3, 4, 5]; diff --git a/sky/unit/test/fn3/parent_data_test.dart b/sky/unit/test/widget/parent_data_test.dart similarity index 100% rename from sky/unit/test/fn3/parent_data_test.dart rename to sky/unit/test/widget/parent_data_test.dart diff --git a/sky/unit/test/widget/progress_indicator_test.dart b/sky/unit/test/widget/progress_indicator_test.dart index b8f828da6d2..90526440699 100644 --- a/sky/unit/test/widget/progress_indicator_test.dart +++ b/sky/unit/test/widget/progress_indicator_test.dart @@ -3,7 +3,7 @@ import 'package:sky/rendering.dart'; import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; void main() { test('LinearProgressIndicator changes when its value changes', () { diff --git a/sky/unit/test/fn3/render_object_widget_test.dart b/sky/unit/test/widget/render_object_widget_test.dart similarity index 100% rename from sky/unit/test/fn3/render_object_widget_test.dart rename to sky/unit/test/widget/render_object_widget_test.dart diff --git a/sky/unit/test/widget/scrollable_list_hit_testing_test.dart b/sky/unit/test/widget/scrollable_list_hit_testing_test.dart index 308ead5062d..d2cbf5c4bfd 100644 --- a/sky/unit/test/widget/scrollable_list_hit_testing_test.dart +++ b/sky/unit/test/widget/scrollable_list_hit_testing_test.dart @@ -2,7 +2,7 @@ import 'package:sky/rendering.dart'; import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; const List items = const [0, 1, 2, 3, 4, 5]; List tapped = []; diff --git a/sky/unit/test/widget/scrollable_list_horizontal_test.dart b/sky/unit/test/widget/scrollable_list_horizontal_test.dart index 16c936836f4..5197472ef5d 100644 --- a/sky/unit/test/widget/scrollable_list_horizontal_test.dart +++ b/sky/unit/test/widget/scrollable_list_horizontal_test.dart @@ -2,7 +2,7 @@ import 'package:sky/rendering.dart'; import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; const List items = const [0, 1, 2, 3, 4, 5]; diff --git a/sky/unit/test/widget/scrollable_list_vertical_test.dart b/sky/unit/test/widget/scrollable_list_vertical_test.dart index f805e293380..ad966ef468c 100644 --- a/sky/unit/test/widget/scrollable_list_vertical_test.dart +++ b/sky/unit/test/widget/scrollable_list_vertical_test.dart @@ -1,7 +1,7 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; const List items = const [0, 1, 2, 3, 4, 5]; diff --git a/sky/unit/test/widget/set_state_3_test.dart b/sky/unit/test/widget/set_state_3_test.dart index 98fcea6d49a..7ce1c867b02 100644 --- a/sky/unit/test/widget/set_state_3_test.dart +++ b/sky/unit/test/widget/set_state_3_test.dart @@ -5,7 +5,7 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; ChangerState changer; diff --git a/sky/unit/test/widget/set_state_test.dart b/sky/unit/test/widget/set_state_test.dart index 93feb8a7d30..0be59b1e4f9 100644 --- a/sky/unit/test/widget/set_state_test.dart +++ b/sky/unit/test/widget/set_state_test.dart @@ -2,7 +2,7 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; import '../engine/mock_events.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; class Inside extends StatefulComponent { InsideState createState() => new InsideState(); diff --git a/sky/unit/test/widget/snap_scrolling_test.dart b/sky/unit/test/widget/snap_scrolling_test.dart index 309b28b3fbf..aa99926185f 100644 --- a/sky/unit/test/widget/snap_scrolling_test.dart +++ b/sky/unit/test/widget/snap_scrolling_test.dart @@ -8,7 +8,7 @@ import 'package:quiver/testing/async.dart'; import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; const double itemExtent = 200.0; ScrollDirection scrollDirection = ScrollDirection.vertical; diff --git a/sky/unit/test/widget/stack_test.dart b/sky/unit/test/widget/stack_test.dart index 86a449692c0..a494a81be94 100644 --- a/sky/unit/test/widget/stack_test.dart +++ b/sky/unit/test/widget/stack_test.dart @@ -1,7 +1,7 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; void main() { test('Can change position data', () { diff --git a/sky/unit/test/fn3/stateful_component_test.dart b/sky/unit/test/widget/stateful_component_test.dart similarity index 100% rename from sky/unit/test/fn3/stateful_component_test.dart rename to sky/unit/test/widget/stateful_component_test.dart diff --git a/sky/unit/test/widget/stateful_components_test.dart b/sky/unit/test/widget/stateful_components_test.dart index 7eda7c44c49..a5c9ccf91e6 100644 --- a/sky/unit/test/widget/stateful_components_test.dart +++ b/sky/unit/test/widget/stateful_components_test.dart @@ -1,7 +1,7 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; class InnerComponent extends StatefulComponent { InnerComponent({ Key key }) : super(key: key); diff --git a/sky/unit/test/widget/syncing_test.dart b/sky/unit/test/widget/syncing_test.dart index d666d2eaf83..92d5b92b891 100644 --- a/sky/unit/test/widget/syncing_test.dart +++ b/sky/unit/test/widget/syncing_test.dart @@ -1,7 +1,7 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; class TestWidget extends StatefulComponent { TestWidget({ this.child, this.persistentState, this.syncedState }); diff --git a/sky/unit/test/fn3/test_widgets.dart b/sky/unit/test/widget/test_widgets.dart similarity index 100% rename from sky/unit/test/fn3/test_widgets.dart rename to sky/unit/test/widget/test_widgets.dart diff --git a/sky/unit/test/widget/transform_test.dart b/sky/unit/test/widget/transform_test.dart index 96f1a30eaf1..638c67c3d0a 100644 --- a/sky/unit/test/widget/transform_test.dart +++ b/sky/unit/test/widget/transform_test.dart @@ -1,7 +1,7 @@ import 'package:sky/src/fn3.dart'; import 'package:test/test.dart'; -import '../fn3/widget_tester.dart'; +import 'widget_tester.dart'; void main() { test('Transform origin', () { diff --git a/sky/unit/test/widget/widget_tester.dart b/sky/unit/test/widget/widget_tester.dart index 95115459fc5..3ceb9c0d979 100644 --- a/sky/unit/test/widget/widget_tester.dart +++ b/sky/unit/test/widget/widget_tester.dart @@ -2,36 +2,44 @@ import 'dart:sky' as sky; import 'package:sky/animation.dart'; import 'package:sky/rendering.dart'; -import 'package:sky/widgets.dart'; +import 'package:sky/src/fn3.dart'; import '../engine/mock_events.dart'; -typedef Widget WidgetBuilder(); +class RootComponent extends StatefulComponent { + RootComponentState createState() => new RootComponentState(); +} -class TestApp extends App { - - WidgetBuilder _builder; - void set builder (WidgetBuilder value) { - setState(() { - _builder = value; - }); - } - - Widget build() { - if (_builder != null) - return _builder(); - return new Container(); +class RootComponentState extends State { + Widget _child = new DecoratedBox(decoration: new BoxDecoration()); + Widget get child => _child; + void set child(Widget value) { + if (value != _child) { + setState(() { + _child = value; + }); + } } + Widget build(BuildContext context) => child; } class WidgetTester { - WidgetTester() { - _app = new TestApp(); - runApp(_app); - scheduler.beginFrame(0.0); // to initialise the app + + // See thttps://github.com/flutter/engine/issues/1084 regarding frameTimeMs vs FakeAsync + + void pumpFrame(Widget widget, [ double frameTimeMs = 0.0 ]) { + runApp(widget); + scheduler.beginFrame(frameTimeMs); } - TestApp _app; + void pumpFrameWithoutChange([ double frameTimeMs = 0.0 ]) { + scheduler.beginFrame(frameTimeMs); + } + + void reset() { + runApp(new Container()); + scheduler.beginFrame(0.0); + } List _layers(Layer layer) { List result = [layer]; @@ -47,70 +55,81 @@ class WidgetTester { } List get layers => _layers(FlutterBinding.instance.renderView.layer); - void walkWidgets(WidgetTreeWalker walker) { - void walk(Widget widget) { - walker(widget); - widget.walkChildren(walk); - } - _app.walkChildren(walk); + void walkElements(ElementVisitor visitor) { + void walk(Element element) { + visitor(element); + element.visitChildren(walk); + } + WidgetFlutterBinding.instance.renderViewElement.visitChildren(walk); } - Widget findWidget(bool predicate(Widget widget)) { + Element findElement(bool predicate(Element element)) { try { - walkWidgets((Widget widget) { - if (predicate(widget)) - throw widget; + walkElements((Element element) { + if (predicate(element)) + throw element; }); - } catch (e) { - if (e is Widget) - return e; - rethrow; + } on Element catch (e) { + return e; } return null; } - Text findText(String text) { - return findWidget((Widget widget) { - return widget is Text && widget.data == text; + Element findElementByKey(Key key) { + return findElement((Element element) => element.widget.key == key); + } + + Element findText(String text) { + return findElement((Element element) { + return element.widget is Text && element.widget.data == text; }); } - Point _getWidgetPoint(Widget widget, Function sizeToPoint) { - assert(widget != null); - RenderBox box = widget.renderObject as RenderBox; + State findStateOfType(Type type) { + StatefulComponentElement element = findElement((Element element) { + return element is StatefulComponentElement && element.state.runtimeType == type; + }); + return element?.state; + } + + State findStateByConfig(Widget config) { + StatefulComponentElement element = findElement((Element element) { + return element is StatefulComponentElement && element.state.config == config; + }); + return element?.state; + } + + Point getCenter(Element element) { + return _getElementPoint(element, (Size size) => size.center(Point.origin)); + } + + Point getTopLeft(Element element) { + return _getElementPoint(element, (_) => Point.origin); + } + + Point getTopRight(Element element) { + return _getElementPoint(element, (Size size) => size.topRight(Point.origin)); + } + + Point getBottomLeft(Element element) { + return _getElementPoint(element, (Size size) => size.bottomLeft(Point.origin)); + } + + Point getBottomRight(Element element) { + return _getElementPoint(element, (Size size) => size.bottomRight(Point.origin)); + } + + Point _getElementPoint(Element element, Function sizeToPoint) { + assert(element != null); + RenderBox box = element.renderObject as RenderBox; assert(box != null); return box.localToGlobal(sizeToPoint(box.size)); } - Point getCenter(Widget widget) { - return _getWidgetPoint(widget, (Size size) => size.center(Point.origin)); - } - Point getTopLeft(Widget widget) { - return _getWidgetPoint(widget, (_) => Point.origin); - } - - Point getTopRight(Widget widget) { - return _getWidgetPoint(widget, (Size size) => size.topRight(Point.origin)); - } - - Point getBottomLeft(Widget widget) { - return _getWidgetPoint(widget, (Size size) => size.bottomLeft(Point.origin)); - } - - Point getBottomRight(Widget widget) { - return _getWidgetPoint(widget, (Size size) => size.bottomRight(Point.origin)); - } - - HitTestResult _hitTest(Point location) => FlutterBinding.instance.hitTest(location); - - void _dispatchEvent(sky.Event event, HitTestResult result) { - FlutterBinding.instance.dispatchEvent(event, result); - } - - void tap(Widget widget, { int pointer: 1 }) { - tapAt(getCenter(widget), pointer: pointer); + void tap(Element element, { int pointer: 1 }) { + tapAt(getCenter(element), pointer: pointer); } void tapAt(Point location, { int pointer: 1 }) { @@ -120,8 +139,8 @@ class WidgetTester { _dispatchEvent(p.up(), result); } - void scroll(Widget widget, Offset offset, { int pointer: 1 }) { - Point startLocation = getCenter(widget); + void scroll(Element element, Offset offset, { int pointer: 1 }) { + Point startLocation = getCenter(element); Point endLocation = startLocation + offset; TestPointer p = new TestPointer(pointer); // Events for the entire press-drag-release gesture are dispatched @@ -136,13 +155,10 @@ class WidgetTester { _dispatchEvent(event, _hitTest(location)); } - void pumpFrame(WidgetBuilder builder, [double frameTimeMs = 0.0]) { - _app.builder = builder; - scheduler.beginFrame(frameTimeMs); - } + HitTestResult _hitTest(Point location) => WidgetFlutterBinding.instance.hitTest(location); - void pumpFrameWithoutChange([double frameTimeMs = 0.0]) { - scheduler.beginFrame(frameTimeMs); + void _dispatchEvent(sky.Event event, HitTestResult result) { + WidgetFlutterBinding.instance.dispatchEvent(event, result); } }