From b06ca7fd223f8e4a8d8f4b3ae594bbb7a80207f1 Mon Sep 17 00:00:00 2001 From: nturgut Date: Mon, 19 Oct 2020 11:05:08 -0700 Subject: [PATCH 01/10] fix pointer events by settin TestBindingEventSource --- packages/integration_test/CHANGELOG.md | 4 ++++ .../integration_test/lib/integration_test.dart | 16 ++++++++++++++++ packages/integration_test/pubspec.yaml | 2 +- 3 files changed, 21 insertions(+), 1 deletion(-) 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/lib/integration_test.dart b/packages/integration_test/lib/integration_test.dart index 5a37e88a3c6e..48ada9f997ab 100644 --- a/packages/integration_test/lib/integration_test.dart +++ b/packages/integration_test/lib/integration_test.dart @@ -70,6 +70,22 @@ class IntegrationTestWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding }; } + @override + void handlePointerEvent( + PointerEvent pointerEvent, { + TestBindingEventSource source = TestBindingEventSource.device, + }) { + if (kIsWeb) { + // Web driver does not create real device events. Routing web + // integration tests' pointer events with source set to `device`, + // results in exceptions. + super.handlePointerEvent(pointerEvent, + source: TestBindingEventSource.test); + } else { + super.handlePointerEvent(pointerEvent); + } + } + // 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: From ca9b8a57157928c340618ac31f52789a15665906 Mon Sep 17 00:00:00 2001 From: nturgut Date: Mon, 19 Oct 2020 16:56:01 -0700 Subject: [PATCH 02/10] adding tests for testing dispatching events --- .../integration_test/_example_test_web.dart | 79 ++++++++++++++++--- .../integration_test/_extended_test_web.dart | 14 ++-- .../example/lib/my_web_app.dart | 37 ++++++++- 3 files changed, 110 insertions(+), 20 deletions(-) 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)), + ), + ], + ), + ) + ], + ), ), ), ); From 665bc592e56543700705a910bc94920dbade867c Mon Sep 17 00:00:00 2001 From: nturgut Date: Wed, 28 Oct 2020 13:36:51 -0700 Subject: [PATCH 03/10] use event source test for all platforms --- packages/integration_test/lib/integration_test.dart | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/integration_test/lib/integration_test.dart b/packages/integration_test/lib/integration_test.dart index 48ada9f997ab..c4d97179fc58 100644 --- a/packages/integration_test/lib/integration_test.dart +++ b/packages/integration_test/lib/integration_test.dart @@ -75,15 +75,12 @@ class IntegrationTestWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding PointerEvent pointerEvent, { TestBindingEventSource source = TestBindingEventSource.device, }) { - if (kIsWeb) { - // Web driver does not create real device events. Routing web - // integration tests' pointer events with source set to `device`, - // results in exceptions. - super.handlePointerEvent(pointerEvent, + // 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); - } else { - super.handlePointerEvent(pointerEvent); - } } // TODO(dnfield): Remove the ignore once we bump the minimum Flutter version From 3294cd394b569578ff8b7d718662f1a05972e1e7 Mon Sep 17 00:00:00 2001 From: nturgut Date: Wed, 28 Oct 2020 13:52:12 -0700 Subject: [PATCH 04/10] format fix --- packages/integration_test/lib/integration_test.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/integration_test/lib/integration_test.dart b/packages/integration_test/lib/integration_test.dart index c4d97179fc58..8851b4b73971 100644 --- a/packages/integration_test/lib/integration_test.dart +++ b/packages/integration_test/lib/integration_test.dart @@ -79,8 +79,7 @@ class IntegrationTestWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding // 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); + super.handlePointerEvent(pointerEvent, source: TestBindingEventSource.test); } // TODO(dnfield): Remove the ignore once we bump the minimum Flutter version From 9b1952d68b6f0821139a4713bb89b591d2372884 Mon Sep 17 00:00:00 2001 From: nturgut Date: Wed, 28 Oct 2020 14:00:36 -0700 Subject: [PATCH 05/10] trying to debug ios test issue --- packages/integration_test/lib/integration_test.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/integration_test/lib/integration_test.dart b/packages/integration_test/lib/integration_test.dart index 8851b4b73971..98f0722875f7 100644 --- a/packages/integration_test/lib/integration_test.dart +++ b/packages/integration_test/lib/integration_test.dart @@ -79,7 +79,11 @@ class IntegrationTestWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding // 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); + if(this is LiveTestWidgetsFlutterBinding) { + super.handlePointerEvent(pointerEvent, source: TestBindingEventSource.test); + } else { + print('different runtime type: ${this.runtimeType}'); + } } // TODO(dnfield): Remove the ignore once we bump the minimum Flutter version From b0444a27ff07d91262a28708bd38098b3274584f Mon Sep 17 00:00:00 2001 From: nturgut Date: Wed, 28 Oct 2020 14:01:02 -0700 Subject: [PATCH 06/10] format fix --- packages/integration_test/lib/integration_test.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/integration_test/lib/integration_test.dart b/packages/integration_test/lib/integration_test.dart index 98f0722875f7..6b2f3e2e7003 100644 --- a/packages/integration_test/lib/integration_test.dart +++ b/packages/integration_test/lib/integration_test.dart @@ -79,8 +79,9 @@ class IntegrationTestWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding // vs TestBindingEventSource.test. Test uses RenderBindind.dispatch // event. The former does not deliver the gesture but only compare // matchers. - if(this is LiveTestWidgetsFlutterBinding) { - super.handlePointerEvent(pointerEvent, source: TestBindingEventSource.test); + if (this is LiveTestWidgetsFlutterBinding) { + super.handlePointerEvent(pointerEvent, + source: TestBindingEventSource.test); } else { print('different runtime type: ${this.runtimeType}'); } From 97fccf6a88bd1218892fd7d83cb79418b3c6324e Mon Sep 17 00:00:00 2001 From: nturgut Date: Wed, 28 Oct 2020 14:25:26 -0700 Subject: [PATCH 07/10] check if super's method is null --- .../integration_test/lib/integration_test.dart | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/integration_test/lib/integration_test.dart b/packages/integration_test/lib/integration_test.dart index 6b2f3e2e7003..480be15c447c 100644 --- a/packages/integration_test/lib/integration_test.dart +++ b/packages/integration_test/lib/integration_test.dart @@ -75,15 +75,16 @@ class IntegrationTestWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding 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. - if (this is LiveTestWidgetsFlutterBinding) { - super.handlePointerEvent(pointerEvent, + Function function = super.handlePointerEvent; + // Due to bindings in _binding_io.dart, WidgetBindings can be decendent of + // `AutomatedTestWidgetsFlutterBinding` for non-web environments. + if (function != null) { + // 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. + function(pointerEvent, source: TestBindingEventSource.test); - } else { - print('different runtime type: ${this.runtimeType}'); } } From 6d438173b69d048bcca240c6f00d45e95be1e864 Mon Sep 17 00:00:00 2001 From: nturgut Date: Wed, 28 Oct 2020 14:37:06 -0700 Subject: [PATCH 08/10] format fix --- .../integration_test/lib/integration_test.dart | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/integration_test/lib/integration_test.dart b/packages/integration_test/lib/integration_test.dart index 480be15c447c..5d4a039d3c61 100644 --- a/packages/integration_test/lib/integration_test.dart +++ b/packages/integration_test/lib/integration_test.dart @@ -75,15 +75,12 @@ class IntegrationTestWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding PointerEvent pointerEvent, { TestBindingEventSource source = TestBindingEventSource.device, }) { - Function function = super.handlePointerEvent; - // Due to bindings in _binding_io.dart, WidgetBindings can be decendent of - // `AutomatedTestWidgetsFlutterBinding` for non-web environments. - if (function != null) { - // 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. - function(pointerEvent, + // 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. + if (this is LiveTestWidgetsFlutterBinding) { + super.handlePointerEvent(pointerEvent, source: TestBindingEventSource.test); } } From 889de8ac5a5221a7fdb106c7f586d0ac457db910 Mon Sep 17 00:00:00 2001 From: nturgut Date: Wed, 28 Oct 2020 15:02:09 -0700 Subject: [PATCH 09/10] update flutter version --- packages/integration_test/example/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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: From 1f294cddc863f4fe25dc90daf6e8ec8c101d6adb Mon Sep 17 00:00:00 2001 From: nturgut Date: Wed, 28 Oct 2020 15:04:11 -0700 Subject: [PATCH 10/10] format change --- packages/integration_test/lib/integration_test.dart | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/integration_test/lib/integration_test.dart b/packages/integration_test/lib/integration_test.dart index 5d4a039d3c61..8851b4b73971 100644 --- a/packages/integration_test/lib/integration_test.dart +++ b/packages/integration_test/lib/integration_test.dart @@ -79,10 +79,7 @@ class IntegrationTestWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding // vs TestBindingEventSource.test. Test uses RenderBindind.dispatch // event. The former does not deliver the gesture but only compare // matchers. - if (this is LiveTestWidgetsFlutterBinding) { - super.handlePointerEvent(pointerEvent, - source: TestBindingEventSource.test); - } + super.handlePointerEvent(pointerEvent, source: TestBindingEventSource.test); } // TODO(dnfield): Remove the ignore once we bump the minimum Flutter version