diff --git a/packages/integration_test/CHANGELOG.md b/packages/integration_test/CHANGELOG.md index 534d7063db6c..e6592e444edd 100644 --- a/packages/integration_test/CHANGELOG.md +++ b/packages/integration_test/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.9.3 + +* Set TestBindingEventSource to test for web integration_tests. + ## 0.9.2+2 * Broaden the constraint on vm_service. diff --git a/packages/integration_test/example/integration_test/_example_test_web.dart b/packages/integration_test/example/integration_test/_example_test_web.dart index e1141cc010c8..2c2620f4b02b 100644 --- a/packages/integration_test/example/integration_test/_example_test_web.dart +++ b/packages/integration_test/example/integration_test/_example_test_web.dart @@ -6,7 +6,9 @@ // tree, read text, and verify that the values of widget properties are correct. import 'dart:html' as html; +import 'dart:js_util' as js_util; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; @@ -21,15 +23,74 @@ void main() { // Trigger a frame. await tester.pumpAndSettle(); + final Finder finder = find.byKey(const Key('platform')); + final Text platformText = tester.widget(finder); + // Verify that platform is retrieved. - expect( - find.byWidgetPredicate( - (Widget widget) => - widget is Text && - widget.data - .startsWith('Platform: ${html.window.navigator.platform}\n'), - ), - findsOneWidget, - ); + expect(finder, findsOneWidget); + expect(platformText.data, 'Platform: ${html.window.navigator.platform}\n'); + }); + + testWidgets('verify event dispatching works', (WidgetTester tester) async { + // Build our app and trigger a frame. + app.main(); + + // Trigger a frame. + await tester.pumpAndSettle(); + + final Finder finderButton = find.byKey(const Key('button')); + expect(finderButton, findsOneWidget); + + final Offset offset = tester.getCenter(finderButton); + + dispatchEventToMouseLocation((offset.dx).toInt(), (offset.dy).toInt()); + await tester.pumpAndSettle(); + + final Finder finder = find.byKey(const Key('counter')); + final Text counter = tester.widget(finder); + + // Verify that counter is clicked. + expect(finder, findsOneWidget); + expect(counter.data, '1'); + }); +} + +void dispatchEventToMouseLocation(int mouseX, int mouseY) { + final html.EventTarget target = + html.document.elementFromPoint(mouseX, mouseY); + + dispatchPointerEvent(target, 'pointerdown', { + 'bubbles': true, + 'cancelable': true, + 'screenX': mouseX, + 'screenY': mouseY, + 'clientX': mouseX, + 'clientY': mouseY, }); + + dispatchPointerEvent(target, 'pointerup', { + 'bubbles': true, + 'cancelable': true, + 'screenX': mouseX, + 'screenY': mouseY, + 'clientX': mouseX, + 'clientY': mouseY, + }); +} + +html.PointerEvent dispatchPointerEvent( + html.EventTarget target, String type, Map args) { + final dynamic jsPointerEvent = + js_util.getProperty(html.window, 'PointerEvent'); + final List eventArgs = [ + type, + args, + ]; + + final html.PointerEvent event = js_util.callConstructor( + jsPointerEvent, js_util.jsify(eventArgs) as List) + as html.PointerEvent; + target.dispatchEvent(event); + + return event; } diff --git a/packages/integration_test/example/integration_test/_extended_test_web.dart b/packages/integration_test/example/integration_test/_extended_test_web.dart index 210c2dac75ba..afb35e2c663a 100644 --- a/packages/integration_test/example/integration_test/_extended_test_web.dart +++ b/packages/integration_test/example/integration_test/_extended_test_web.dart @@ -26,16 +26,12 @@ void main() { // Take a screenshot. await binding.takeScreenshot('platform_name'); + final Finder finder = find.byKey(const Key('platform')); + final Text platformText = tester.widget(finder); + // Verify that platform is retrieved. - expect( - find.byWidgetPredicate( - (Widget widget) => - widget is Text && - widget.data - .startsWith('Platform: ${html.window.navigator.platform}\n'), - ), - findsOneWidget, - ); + expect(finder, findsOneWidget); + expect(platformText, 'Platform: ${html.window.navigator.platform}\n'); }); testWidgets('verify screenshot', (WidgetTester tester) async { diff --git a/packages/integration_test/example/lib/my_web_app.dart b/packages/integration_test/example/lib/my_web_app.dart index c2ced1af97ae..80e7868a6a8c 100644 --- a/packages/integration_test/example/lib/my_web_app.dart +++ b/packages/integration_test/example/lib/my_web_app.dart @@ -11,6 +11,14 @@ class MyWebApp extends StatefulWidget { } class _MyWebAppState extends State { + int _counter = 0; + + void _increment() { + setState(() { + _counter++; + }); + } + @override Widget build(BuildContext context) { return MaterialApp( @@ -19,8 +27,33 @@ class _MyWebAppState extends State { title: const Text('Plugin example app'), ), body: Center( - key: Key('mainapp'), - child: Text('Platform: ${html.window.navigator.platform}\n'), + child: Column( + children: [ + Text( + 'Platform: ${html.window.navigator.platform}\n', + key: Key('platform'), + ), + Text( + '$_counter', + key: Key('counter'), + ), + Expanded( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + RaisedButton( + padding: const EdgeInsets.all(10.0), + onPressed: _increment, + key: Key('button'), + child: + const Text('Button!', style: TextStyle(fontSize: 20)), + ), + ], + ), + ) + ], + ), ), ), ); diff --git a/packages/integration_test/example/pubspec.yaml b/packages/integration_test/example/pubspec.yaml index 9384e9763935..cc79c052a6db 100644 --- a/packages/integration_test/example/pubspec.yaml +++ b/packages/integration_test/example/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' environment: sdk: ">=2.1.0 <3.0.0" - flutter: ">=1.6.7 <2.0.0" + flutter: ">=1.12.13+hotfix.5 <2.0.0" dependencies: flutter: diff --git a/packages/integration_test/lib/integration_test.dart b/packages/integration_test/lib/integration_test.dart index 5a37e88a3c6e..8851b4b73971 100644 --- a/packages/integration_test/lib/integration_test.dart +++ b/packages/integration_test/lib/integration_test.dart @@ -70,6 +70,18 @@ class IntegrationTestWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding }; } + @override + void handlePointerEvent( + PointerEvent pointerEvent, { + TestBindingEventSource source = TestBindingEventSource.device, + }) { + // TestBindingEventSource.device uses WidgerTester.dispatchEvent method + // vs TestBindingEventSource.test. Test uses RenderBindind.dispatch + // event. The former does not deliver the gesture but only compare + // matchers. + super.handlePointerEvent(pointerEvent, source: TestBindingEventSource.test); + } + // TODO(dnfield): Remove the ignore once we bump the minimum Flutter version // ignore: override_on_non_overriding_member @override diff --git a/packages/integration_test/pubspec.yaml b/packages/integration_test/pubspec.yaml index 337fc55b11bf..94839dbcbb9a 100644 --- a/packages/integration_test/pubspec.yaml +++ b/packages/integration_test/pubspec.yaml @@ -1,6 +1,6 @@ name: integration_test description: Runs tests that use the flutter_test API as integration tests. -version: 0.9.2+2 +version: 0.9.3 homepage: https://github.com/flutter/plugins/tree/master/packages/integration_test environment: