From 21841d7e3576ac2ac40dbdca6a3cd03cbdbf90ff Mon Sep 17 00:00:00 2001 From: Dan Field Date: Mon, 27 Jun 2022 13:26:08 -0700 Subject: [PATCH] Implement frameData for TestWindow (#105537) --- packages/flutter_test/lib/src/binding.dart | 9 ++++-- packages/flutter_test/lib/src/window.dart | 22 +++++++++++++- packages/flutter_test/test/bindings_test.dart | 29 +++++++++++++++++++ 3 files changed, 56 insertions(+), 4 deletions(-) diff --git a/packages/flutter_test/lib/src/binding.dart b/packages/flutter_test/lib/src/binding.dart index 238af86db12..9f2f3911a50 100644 --- a/packages/flutter_test/lib/src/binding.dart +++ b/packages/flutter_test/lib/src/binding.dart @@ -156,6 +156,12 @@ abstract class TestWidgetsFlutterBinding extends BindingBase debugDisableShadows = disableShadows; } + @override + void handleBeginFrame(Duration? rawTimeStamp) { + _window.incrementFrameNumber(); + super.handleBeginFrame(rawTimeStamp); + } + @override TestWindow get window => _window; final TestWindow _window; @@ -1048,7 +1054,6 @@ class AutomatedTestWidgetsFlutterBinding extends TestWidgetsFlutterBinding { } _phase = newPhase; if (hasScheduledFrame) { - addTime(const Duration(milliseconds: 500)); _currentFakeAsync!.flushMicrotasks(); handleBeginFrame(Duration( milliseconds: _clock!.now().millisecondsSinceEpoch, @@ -1093,8 +1098,6 @@ class AutomatedTestWidgetsFlutterBinding extends TestWidgetsFlutterBinding { ), ); - addTime(additionalTime); - return realAsyncZone.run>(() async { _pendingAsyncTasks = Completer(); T? result; diff --git a/packages/flutter_test/lib/src/window.dart b/packages/flutter_test/lib/src/window.dart index e82bc80b313..c8cc7140e9a 100644 --- a/packages/flutter_test/lib/src/window.dart +++ b/packages/flutter_test/lib/src/window.dart @@ -59,6 +59,14 @@ class TestWindow implements ui.SingletonFlutterWindow { }) : _window = window, platformDispatcher = TestPlatformDispatcher(platformDispatcher: window.platformDispatcher); + + int _frameNumber = 0; + /// Indicates that the test binding has pumped a frame. + void incrementFrameNumber() { + _frameNumber += 1; + platformDispatcher.frameData = _TestFrameData(_frameNumber); + } + /// The [dart:ui.SingletonFlutterWindow] that is wrapped by this [TestWindow]. final ui.SingletonFlutterWindow _window; @@ -491,6 +499,9 @@ class TestWindow implements ui.SingletonFlutterWindow { platformDispatcher.onPlatformMessage = callback; } + @override + ui.FrameData get frameData => platformDispatcher.frameData; + /// Delete any test value properties that have been set on this [TestWindow] /// as well as its [platformDispatcher]. /// @@ -505,6 +516,7 @@ class TestWindow implements ui.SingletonFlutterWindow { clearDisplayFeaturesTestValue(); clearPhysicalSizeTestValue(); clearViewInsetsTestValue(); + _frameNumber = 0; platformDispatcher.clearAllTestValues(); } @@ -882,6 +894,7 @@ class TestPlatformDispatcher implements ui.PlatformDispatcher { clearLocalesTestValue(); clearSemanticsEnabledTestValue(); clearTextScaleFactorTestValue(); + frameData = const _TestFrameData(0); } @override @@ -914,7 +927,7 @@ class TestPlatformDispatcher implements ui.PlatformDispatcher { ui.PlatformConfiguration get configuration => _platformDispatcher.configuration; @override - ui.FrameData get frameData => _platformDispatcher.frameData; + ui.FrameData frameData = const _TestFrameData(0); @override ByteData? getPersistentIsolateData() => _platformDispatcher.getPersistentIsolateData(); @@ -930,3 +943,10 @@ class TestPlatformDispatcher implements ui.PlatformDispatcher { return null; } } + +class _TestFrameData implements ui.FrameData { + const _TestFrameData(this.frameNumber); + + @override + final int frameNumber; +} diff --git a/packages/flutter_test/test/bindings_test.dart b/packages/flutter_test/test/bindings_test.dart index c5a4b923db0..7816cda3376 100644 --- a/packages/flutter_test/test/bindings_test.dart +++ b/packages/flutter_test/test/bindings_test.dart @@ -33,6 +33,35 @@ void main() { }); }); + test('frameNumber', () async { + binding.window.clearAllTestValues(); + expect(binding.window.frameData.frameNumber, 0); + await binding.runTest(() async { + // runTest pumps a frame. + expect(binding.window.frameData.frameNumber, 1); + + // Scheduling should not pump + binding.scheduleFrame(); + expect(binding.window.frameData.frameNumber, 1); + binding.handleBeginFrame(null); + expect(binding.window.frameData.frameNumber, 2); + binding.handleDrawFrame(); + expect(binding.window.frameData.frameNumber, 2); + + // Pump with no scheduled frame. + await binding.pump(); + expect(binding.window.frameData.frameNumber, 2); + + // Schedule and pump, similar to handleBeginFrame. + binding.scheduleFrame(); + await binding.pump(); + expect(binding.window.frameData.frameNumber, 3); + }, () {}); + binding.postTest(); + binding.window.clearAllTestValues(); + expect(binding.window.frameData.frameNumber, 0); + }); + // The next three tests must run in order -- first using `test`, then `testWidgets`, then `test` again. int order = 0;