flutter/dev/integration_tests/flutter_gallery/test_driver/run_demos.dart
Chikamatsu Kazuya c8e34e067c
Match CupertinoPageTransitionsBuilder animation duration to CupertinoPageRoute (2) (#161577)
Original PR: #160241 (reverted in #161555 due to regression ), closes
#29068

In addition to the original PR, this includes a fix for the integration
test failure of
[flutter_gallery/transitions_perf_e2e](1b0441c18a/dev/integration_tests/flutter_gallery/test_driver).
Error log is
[here](https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8725826401212583777/+/u/run_flutter_gallery__transition_perf_e2e_ios/stdout).
Tested locally on iOS real device and confirmed it passes.

It seems that the next operation of the test was performed before the
page animation was finished because the PR makes the page transition
duration longer.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
2025-01-22 19:13:01 +00:00

95 lines
3.3 KiB
Dart

// 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/cupertino.dart';
import 'package:flutter_gallery/demo_lists.dart';
import 'package:flutter_test/flutter_test.dart';
/// The demos we don't run as part of the integration test.
///
/// Demo names are formatted as 'DEMO_NAME@DEMO_CATEGORY' (see
/// `demo_lists.dart` for more examples).
final List<String> kSkippedDemos = <String>[
// This demo is flaky on CI due to hitting the network.
// See: https://github.com/flutter/flutter/issues/100497
'Video@Media',
];
/// Scrolls each demo menu item into view, launches it, then returns to the
/// home screen twice.
Future<void> runDemos(List<String> demos, WidgetController controller) async {
final Finder demoList = find.byType(Scrollable);
String? currentDemoCategory;
for (final String demo in demos) {
if (kSkippedDemos.contains(demo)) {
continue;
}
final String demoName = demo.substring(0, demo.indexOf('@'));
final String demoCategory = demo.substring(demo.indexOf('@') + 1);
print('> $demo');
await controller.pump(const Duration(milliseconds: 250));
final Finder demoCategoryItem = find.text(demoCategory);
if (currentDemoCategory == null) {
await controller.scrollUntilVisible(demoCategoryItem, 48.0);
await controller.tap(demoCategoryItem);
await controller.pumpAndSettle();
} else if (currentDemoCategory != demoCategory) {
await controller.tap(find.byTooltip('Back'));
await controller.pumpAndSettle();
await controller.scrollUntilVisible(demoCategoryItem, 48.0);
await controller.tap(demoCategoryItem);
await controller.pumpAndSettle();
// Scroll back to the top
await controller.drag(demoList, const Offset(0.0, 10000.0));
await controller.pumpAndSettle();
}
currentDemoCategory = demoCategory;
Future<void> pageBack() {
Finder backButton = find.byTooltip('Back');
if (backButton.evaluate().isEmpty) {
backButton = find.byType(CupertinoNavigationBarBackButton);
}
return controller.tap(backButton);
}
for (int i = 0; i < 2; i += 1) {
final Finder demoItem = find.text(demoName);
await controller.scrollUntilVisible(demoItem, 48.0);
await controller.pumpAndSettle();
if (demoItem.evaluate().isEmpty) {
print('Failed to find $demoItem');
print('All available elements:');
print(controller.allElements.toList().join('\n'));
print('App structure:');
debugDumpApp();
throw TestFailure('Failed to find element');
}
await controller.tap(demoItem); // Launch the demo
if (kUnsynchronizedDemos.contains(demo)) {
// These tests have animation, pumpAndSettle cannot be used.
// This time is questionable. 600ms is the tested reasonable result.
await controller.pump(const Duration(milliseconds: 600));
await controller.pump();
await pageBack();
} else {
await controller.pumpAndSettle();
// page back
await pageBack();
}
await controller.pumpAndSettle();
}
print('< Success');
}
// Return to the home screen
await controller.tap(find.byTooltip('Back'));
await controller.pumpAndSettle();
}