// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter_driver/flutter_driver.dart'; import 'package:test/test.dart' hide TypeMatcher, isInstanceOf; Future<void> main() async { late FlutterDriver driver; setUpAll(() async { driver = await FlutterDriver.connect(); }); tearDownAll(() { driver.close(); }); // Each test below must return back to the home page after finishing. test('MotionEvent recomposition', () async { final SerializableFinder motionEventsListTile = find.byValueKey('MotionEventsListTile'); await driver.tap(motionEventsListTile); await driver.waitFor(find.byValueKey('PlatformView')); final String errorMessage = await driver.requestData('run test'); expect(errorMessage, ''); final SerializableFinder backButton = find.byValueKey('back'); await driver.tap(backButton); }, timeout: Timeout.none); group('Nested View Event', () { setUpAll(() async { final SerializableFinder wmListTile = find.byValueKey('NestedViewEventTile'); await driver.tap(wmListTile); }); tearDownAll(() async { await driver.waitFor(find.pageBack()); await driver.tap(find.pageBack()); }); test('AlertDialog from platform view context', () async { final SerializableFinder showAlertDialog = find.byValueKey('ShowAlertDialog'); await driver.waitFor(showAlertDialog); await driver.tap(showAlertDialog); final String status = await driver.getText(find.byValueKey('Status')); expect(status, 'Success'); }, timeout: Timeout.none); test('Child view can handle touches', () async { final SerializableFinder addChildView = find.byValueKey('AddChildView'); await driver.waitFor(addChildView); await driver.tap(addChildView); final SerializableFinder tapChildView = find.byValueKey('TapChildView'); await driver.tap(tapChildView); final String nestedViewClickCount = await driver.getText(find.byValueKey('NestedViewClickCount')); expect(nestedViewClickCount, 'Click count: 1'); }, timeout: Timeout.none); }); group('Flutter surface without hybrid composition', () { setUpAll(() async { await driver.tap(find.byValueKey('NestedViewEventTile')); }); tearDownAll(() async { await driver.waitFor(find.pageBack()); await driver.tap(find.pageBack()); }); test('Uses FlutterSurfaceView when Android view is on the screen', () async { await driver.waitFor(find.byValueKey('PlatformView')); expect( await driver.requestData('hierarchy'), '|-FlutterView\n' ' |-FlutterSurfaceView\n' // Flutter UI ' |-ViewGroup\n' // Platform View ' |-ViewGroup\n' ); // Hide platform view. final SerializableFinder togglePlatformView = find.byValueKey('TogglePlatformView'); await driver.tap(togglePlatformView); await driver.waitForAbsent(find.byValueKey('PlatformView')); expect( await driver.requestData('hierarchy'), '|-FlutterView\n' ' |-FlutterSurfaceView\n' // Just the Flutter UI ); // Show platform view again. await driver.tap(togglePlatformView); await driver.waitFor(find.byValueKey('PlatformView')); expect( await driver.requestData('hierarchy'), '|-FlutterView\n' ' |-FlutterSurfaceView\n' // Flutter UI ' |-ViewGroup\n' // Platform View ' |-ViewGroup\n' ); }, timeout: Timeout.none); }); group('Flutter surface with hybrid composition', () { setUpAll(() async { await driver.tap(find.byValueKey('NestedViewEventTile')); await driver.tap(find.byValueKey('ToggleHybridComposition')); await driver.tap(find.byValueKey('TogglePlatformView')); await driver.tap(find.byValueKey('TogglePlatformView')); }); tearDownAll(() async { await driver.waitFor(find.pageBack()); await driver.tap(find.pageBack()); }); test('Uses FlutterImageView when Android view is on the screen', () async { await driver.waitFor(find.byValueKey('PlatformView')); expect( await driver.requestData('hierarchy'), '|-FlutterView\n' ' |-FlutterSurfaceView\n' // Flutter UI (hidden) ' |-FlutterImageView\n' // Flutter UI (background surface) ' |-ViewGroup\n' // Platform View ' |-ViewGroup\n' ' |-FlutterImageView\n' // Flutter UI (overlay surface) ); // Hide platform view. final SerializableFinder togglePlatformView = find.byValueKey('TogglePlatformView'); await driver.tap(togglePlatformView); await driver.waitForAbsent(find.byValueKey('PlatformView')); expect( await driver.requestData('hierarchy'), '|-FlutterView\n' ' |-FlutterSurfaceView\n' // Just the Flutter UI ); // Show platform view again. await driver.tap(togglePlatformView); await driver.waitFor(find.byValueKey('PlatformView')); expect( await driver.requestData('hierarchy'), '|-FlutterView\n' ' |-FlutterSurfaceView\n' // Flutter UI (hidden) ' |-FlutterImageView\n' // Flutter UI (background surface) ' |-ViewGroup\n' // Platform View ' |-ViewGroup\n' ' |-FlutterImageView\n' // Flutter UI (overlay surface) ); }, timeout: Timeout.none); }); }