flutter/packages/unit/test/widget/widget_tester.dart
Adam Barth ffc6eaa9bd Add an origin parameter to transforms
This parameter makes it easier to do math when you don't want to center your
tranform at (0, 0).
2015-08-31 13:21:26 -07:00

127 lines
3.0 KiB
Dart

import 'dart:sky' as sky;
import 'package:sky/rendering.dart';
import 'package:sky/widgets.dart';
import 'package:sky/base/scheduler.dart' as scheduler;
import '../engine/mock_events.dart';
typedef Widget WidgetBuilder();
class TestApp extends App {
TestApp();
WidgetBuilder _builder;
void set builder (WidgetBuilder value) {
setState(() {
_builder = value;
});
}
Widget build() {
if (_builder != null)
return _builder();
return new Container();
}
}
class WidgetTester {
WidgetTester() {
_app = new TestApp();
runApp(_app);
}
TestApp _app;
List<Layer> _layers(Layer layer) {
List<Layer> 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<Layer> get layers => _layers(SkyBinding.instance.renderView.layer);
void walkWidgets(WidgetTreeWalker walker) {
void walk(Widget widget) {
walker(widget);
widget.walkChildren(walk);
}
_app.walkChildren(walk);
}
Widget findWidget(bool predicate(Widget widget)) {
try {
walkWidgets((Widget widget) {
if (predicate(widget))
throw widget;
});
} catch (e) {
if (e is Widget)
return e;
rethrow;
}
return null;
}
Text findText(String text) {
return findWidget((Widget widget) {
return widget is Text && widget.data == text;
});
}
Point getCenter(Widget widget) {
assert(widget != null);
RenderBox box = widget.renderObject as RenderBox;
assert(box != null);
return box.localToGlobal(box.size.center(Point.origin));
}
HitTestResult _hitTest(Point location) => SkyBinding.instance.hitTest(location);
EventDisposition _dispatchEvent(sky.Event event, HitTestResult result) {
return SkyBinding.instance.dispatchEvent(event, result);
}
void tap(Widget widget, { int pointer: 1 }) {
tapAt(getCenter(widget), 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(Widget widget, Offset offset, { int pointer: 1 }) {
Point startLocation = getCenter(widget);
Point endLocation = startLocation + offset;
HitTestResult result = _hitTest(startLocation);
TestPointer p = new TestPointer(pointer);
_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));
}
void pumpFrame(WidgetBuilder builder, [double frameTimeMs = 0.0]) {
_app.builder = builder;
scheduler.beginFrame(frameTimeMs);
}
void pumpFrameWithoutChange([double frameTimeMs = 0.0]) {
scheduler.beginFrame(frameTimeMs);
}
}